2012-04-20 81 views
2

更新:我公司的系統管理員刪除了/ tmp目錄,並創建了一個 到已裝入驅動器(例如ln -s/mnt/somewhere/tmp)的符號鏈接。 MySQL顯然不喜歡這個符號鏈接。 一旦創建了本地文件系統上的real/tmp目錄,問題就消失了。在運行Rails遷移時無法寫入MySQL臨時文件


我正在運行一個進程(rake db:migrate),它導致MySQL嘗試創建一個臨時文件。 但是,下面的錯誤出現:

Mysql::Error: Can't create/write to file '/tmp/#sql_196_0.MYI' (Errcode: 13): 
SHOW FIELDS FROM `user_rules` 

ERRCODE 13顯然是文件權限問題。 正在運行進程的用戶具有對/ tmp目錄的寫入權限。 我也搜索了網頁,有人提到這個問題可能是文件前綴爲英鎊符號(例如'#')。

我去了/ tmp目錄,並試圖創建該文件,並注意到在某些情況下,我無法創建文件,所以我想知道如果確實井號是造成問題,如果是,如何使用MySQL或者Rails來解決這個問題:。

cd /tmp 
echo "Hello" > #sql_123 
touch #sql_123 

echo "Hello" > "#sql_123" 
touch "#sql_123" 

的第二和第三個命令(沒有引號)失敗了,第四和第五行(帶引號)正在工作,所以也許失敗是因爲英鎊符號不在引號中或者用反斜線轉義,但是即使這樣原因,我不知道如何ell MySQL或Rails如何處理它。

任何想法?

+0

UPDATE:我公司的系統管理員刪除了/ tmp目錄,並創建了一個 指向掛載驅動器的符號鏈接(例如ln -s/mnt/somewhere/tmp)。 MySQL顯然不喜歡這個符號鏈接。 一旦創建了本地文件系統上的real/tmp目錄,問題就消失了。 – Chris 2012-05-12 06:13:31

回答

0

在shell中,您需要引號,因爲#引入註釋,除非通過反斜槓或引號轉義。那些帶有磅符號前綴的#sql_123文件是mysql擁有的臨時文件,它們是正常的。你不能移動它們,只要它們在場,你不能使用二進制文件移動你的數據庫,你需要關閉並移動;或者對SQL執行mysqldump。

現在你的系統管理員,他是否刪除/ tmp而mysql正在運行? Mysql在/ tmp中打開文件,然後將它們從目錄中刪除,使文件句柄保持打開狀態。在服務器啓動或關閉時,您會看到磁盤空間的差異。 MySQL將所有臨時文件創建爲隱藏文件。這可確保在mysqld終止時刪除臨時文件。使用隱藏文件的缺點是您沒有看到填充臨時文件目錄所在的文件系統的大型臨時文件。

所以,如果你想保留符號鏈接(即更大的磁盤),那麼你最好關閉mysql,創建鏈接,然後啓動mysql,發現它符號鏈接沒有問題。