2011-12-11 40 views
0

我有一個1GB的sql文本文件,我正在導入MySQL。 我已經使用了一個'大文本文件查看器',並且可以看到它是一個std mysql表格導出 - 從drop table開始,然後創建新表格然後插入。注意:我也有一張csv的表格。MySQL大表導入

我用下面的方法將其導入:

  1. php.ini中 - 的upload_max_filesize,memory_limit的和post_max_size設置(這些增加的大小,但它仍然說,這是太大 - 做這些數字非常大 - 默認號碼後10個零)。

  2. C:\ wamp \ bin \ mysql \ mysql5.1.53 \ bin> mysqlimport -h localhost -u root -p --fields -t erminated-by ='\ t'--lines-terminated-by = '\ n' --local測試C:\ TEMP \ filename.csv

  3. 源C:\ TEMP \ filename.sql

我可以看到 '在任務管理器' 的第二2種方法似乎在將整個1GB文件插入到MySQL之前將其移動到內存中。我可以看到每個進程,並慢慢增長到1GB以上,並因錯誤而失敗。

問:是否有一種更好的方法來導入表?有沒有辦法將整個文件移動到內存中?我第一次使用這麼大的sql表。

THX

回答

1

具有如此巨大的出口問題的部分原因是(大概)由於它的冗餘。可能有成千上萬的「INSERT」命令在一次加載時佔用大量內存。

如果您具有與CSV完全相同的數據,我會做的是創建一個小型PHP腳本,逐行掃描CSV文件並動態創建INSERT sql查詢,然後執行它。這應該保持內存佔用非常低,因爲您可以在每次插入後繼續替換臨時變量的值(對應於字段)。

我已經鏈接到我嘗試使用的函數。這就是所謂的fgetcsv。該鏈接還有一些示例腳本,我相信這些腳本可能對其他用戶創建的應用程序有用。

祝你好運!

fgetcsv PHP function to use for the line-by-line read

0

儘量不要使用--local選項,如果你能。

documentation

當使用本地與LOAD DATA,一個文件的副本在服務器的臨時目錄中創建。這不是由tmpdir或slave_load_tmpdir的值確定的目錄,而是操作系統的臨時目錄,並且不能在MySQL服務器中配置。 (通常,Linux系統上的系統臨時目錄爲/ tmp,Windows上爲C:\ WINDOWS \ TEMP。)在此目錄中缺少足夠的副本空間可能導致LOAD DATA LOCAL語句失敗。

由於mysqlimport實用程序基本上是LOAD DATA INFILE語句的包裝,因此這也適用於您。