2011-06-17 161 views
0

我正在嘗試使用mySQL SELECT INTO OUTFILE和LOAD DATA INFILE函數爲web應用程序創建一個簡單的導入/導出功能。mysql LOAD INFILE/OUTFILE

將outfile/infiles的路徑作爲默認的mysql路徑(我認爲通常進入mysql.ini定義的tmp目錄)似乎是最簡單的。

爲確保與現有的出口沒有衝突,我產生一個時間戳作爲前綴,我追加到OUTFILE的MD5:

$this->prefix = md5(time()); 

SELECT * INTO OUTFILE ' . $this->prefix . '-' . $table . '.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
FROM " . $table . " WHERE 1 

到目前爲止好,我的日誌文件會顯示在創建的CSV文件/var/lib/mysql/master/

當腳本試圖做LOAD DATA INFILE然而,該文件未找到:

2011-06-17 14:31:35 - INFO --> Created outfile: eae77f210684ba0616c773677f707513-table.csv 
2011-06-17 14:31:35 - ERROR --> mySQL Error: 2 - File 'eae77f210684ba0616c773677f707513-table.csv' not found (Errcode: 2) 

是否有可能日在LOAD INFILESELECT INTO OUTFILE正在使用不同的默認位置?

編輯添加:我繼續並在LOAD INFILE命令中指定了mysql tmp目錄 - 由於某些原因,它找不到該文件,即使它明顯存在,我會假設同一個「用戶「正在讀取和寫入到它:

$ sudo find/-name '8e357dcba6557a31f9a36230c4233d1b-table.csv' 
/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv 

2011-06-17 15:04:25 - INFO --> Created outfile: 8e357dcba6557a31f9a36230c4233d1b-table.csv 
2011-06-17 15:04:25 - ERROR --> mySQL Error: 13 - File '/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv' not found (Errcode: 13) 

編輯:添加INFILE語句

$this->prefix = md5(time()); 
$this->mysql_dir = "/var/lib/mysql/master/"; 
LOAD DATA LOCAL INFILE ' . $this->mysql_dir . $this->prefix . '-' . $table . '.csv 
INTO TABLE $table 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 

感謝

+0

當你嘗試'LOAD INFILE'時,爲什麼你的錯誤(代碼)列表顯示'INFO - >創建outfile:'(注意**創建**之後的** outfile **)?而且,既然你展示了你用來創建OUTFILE的SQL,爲什麼你還沒有顯示LOAD命令? –

+0

這些日誌條目只是我自己的日誌記錄 - 這不是一個「官方」的mysql日誌文件。當實際的OUTFILE語句返回成功代碼時,它會被寫入。我會發布load infile語句。 – julio

+1

編輯完成後,問題似乎很清楚。您正在使用'$ this-> prefix = md5(time());'創建'OUTFILE'作爲文件名的一部分。你的'LOAD INFILE'也使用'$ this-> prefix = md5(time());'作爲文件名的一部分;如果時間完全改變,則MD5值將不匹配,因此'OUTFILE'和'INFILE'名稱也不會匹配。 –

回答

1

你試過LOAD DATA LOCAL INFILE

+0

是的 - 都與LOCAL和無。 – julio

+0

這實際上是個問題 - 刪除LOCAL並指定文件系統路徑的確有竅門。 LOCAL infile改變了mySQL查找數據的路徑。 – julio

0

我認爲julio,問題是與邏輯,而不是SELECT INTO OUTFILELOAD DATA INFILE

在這兩個示例中,您將$ this->前綴添加到OUTFILE/INFILE語句中,您每次都重新生成md5()。因此,您在OUTFILE中使用的前綴與INFILE的前綴不匹配,從而導致錯誤。

可能的解決方案: - 存儲在表前綴,你可以從後面的工作LOAD DATA INFILE 當讀取 - 如果要生成在固定的時間的報道,說每隔一小時,而不是MD5(),使用日期 - 時間作爲前綴,例如20110618_1000-table.csv。