2011-05-23 119 views
10

我有一個8GB的MYSQL數據庫轉儲由mysqldump創建的InnoDB表。我導入數據有:8GB mysql dump的導入需要很長時間

mysql -uroot -p my_db < dump.sql 

數據庫的5 GB轉儲一個小時內進口。 8 GB轉儲需要50小時並計數。當我檢查過程列表

SHOW PROCESSLIST;

大部分時間出現了與國家「'釋放項目」

有沒有一種方法,除了複製原始文件,以加快導入過程一條INSERT查詢可見?

回答

11

真正的訣竅在於確保最大的單表適合innodb緩衝池。如果沒有,那麼插入(當然導入)會非常慢。

它並不關心整個數據庫的大小,而是最大的單個表。

對於顯着更大的數據庫,您可能需要考慮傳輸數據庫的其他方法,例如文件系統快照。當然,如果你的機器運行相同版本的數據庫,操作系統和體系結構,這當然是最好的。

+0

[關於該主題的一些非常有用的閱讀](http://dba.stackexchange.com/a/27341/94577) – 2016-05-16 04:51:08

6

機器有多少內存?我的第一個猜測是該機器具有6GB或8GB的內存,並且mysql能夠將第一個轉儲完全保留在內存中,但在第二個導入時以某種方式交換硬核。您可以在執行導入時運行vmstat 5幾次迭代,並查看系統交換的重複程度?

+0

它有8GB。一旦可用內存變得恐慌,我將重新運行導入並報告vmstat數字。 – 2011-05-23 07:18:41

+0

唯一想到的其他事情是禁用轉儲上的索引,然後在數據存在於表中之後添加它們。從mysqldump文檔: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html - 禁用鍵,-K 對於每個表,使用/ *!40000圍繞INSERT語句ALTER TABLE tbl_name DISABLE KEYS * /;和/ *!40000 ALTER TABLE tbl_name ENABLE KEYS * /;聲明。這使得加載轉儲文件的速度更快,因爲索引是在所有行插入後創建的。此選項僅對MyISAM表的非唯一索引有效。 – opsguy 2011-05-23 07:23:50

+0

所有表都是InnoDb – 2011-05-23 07:54:56