2013-03-01 98 views
5

我試圖導入一個非常大的.sql文件到我的數據庫中。該文件目前是20GB大。我嘗試使用控制檯mysql數據庫< backup.sql,但這需要超過24小時,並且mysql服務器不再有任何反應。導入大型sql文件(> 20GB)

如何導入這樣一個大文件?我認爲將它分開是一種方式,但我怎樣才能正確地分割它?它只有一個包含多個插入語句的表。

+0

.sql文件不用於加載該大小的文件。您將被打開並使用該文件的每一行關閉事務。要做到這一點與任何性能,你需要特殊的工具。讓我們知道特別是哪個數據庫正在使用將幫助人們指向正確的方向。 – gbtimmon 2013-03-01 19:06:36

+1

製作一個逐行讀取它的python程序,並不斷將它饋送到數據庫中。您還可以使程序打印偶爾的狀態消息(%完成等)。 – 2013-03-01 19:07:40

+0

@SudiptaChatterjee不會讓它變慢,不會更快????? – gbtimmon 2013-03-01 19:08:35

回答

1

MySQL具有內置於語言中的api驅動表插入。見下文。 使用此:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

你需要重新從INSERT語句以某種形式CSV或類似的文件,但這應該多下單要快那麼個人陳述,因爲它是對RDBMS溝通的方式「我要上傳大量數據,將重新識別和簿記開銷保存到最後,確保您有足夠的空間並且一次抓取該空間,而不是每次填滿時,確保使用適當的鎖等,等等「。

+0

有沒有腳本或任何東西來從我的「插入到」文件創建這樣的文件?或者我可以將數據庫導出到這樣的文件? – clonaech 2013-03-01 19:26:27

+0

有很多腳本,如果你知道這些腳本,awk就可以工作,但是良好的流程設計會說你需要生成INSERT文件的進程來生成.csv文件。我將不得不知道該過程是什麼,以瞭解您需要做什麼才能以適當的格式獲取文件。 – gbtimmon 2013-03-01 19:44:27

+0

好的,我發現mysqldump有一個選項。但我怎樣才能保存索引?或者我必須在導入後指定該索引嗎? – clonaech 2013-03-01 19:51:44

0

簡單地鎖定表,然後做這個表數據文件(.frm,.MYI,.MYD)的副本。
立即得到一個可以導入到任何數據庫的現成數據文件。

這種方法對myisam非常有效。 不確定innodb。

0

您可以拆分sql文件並將其導入到數據庫中。分裂sqldump文件

最簡單的方法是使用sqldumpsplitter軟件,下載link

或者使用此終端命令分割

split -l 5000 ./path/to/mysqldump.sql ./mysqldump/dbpart-

這裏5000的SQL命令的行數,你更願意分手。接下來的兩個參數分別是源路徑和目標路徑。單個分割文件將被分配一個名稱並在其末尾添加一個字母。

希望它可以幫助其他有這個問題的人。

0

我建議你考慮以下的情況下,試圖跨越分割文件保存SQL查詢:

  • 單個SQL查詢可以在多行被分割,所以你不能只是分裂逐行
  • 一有效的SQL查詢將以分號(;)結束,而且大多數情況下,這將是該行的結尾。

武裝與這兩種情況下這方面的知識,你可以寫一個簡單的腳本,通過線處理您的SQL轉儲線和塊拆分出來時,它會發現分號結束的行(;),也許500這樣的線路。

我已經寫這樣一個腳本用於我面臨着類似的問題:https://gist.github.com/pratikone/0a8d503ffe893b2111f5a1d70d3999b7

它僅用於檢查分號(;)的線,而不是在該行的末尾,但是我沒有任何在查詢中有分號(;)的SQL查詢,所以它工作得很好。鑑於此,如果數據在查詢之間可以有分號,那麼這是一個小的改動。