1.导入备份的数据到表中,表是innodb引擎,900w多条,导入时用了将近9小时2.下面是sh脚本代码片段
`$MYSQL -u$dbUser -h$dbHost -p$dbPassword --default-character-set=utf8 $dbName < $mysqlImportFile`
3.问题: 1)时间是否正常导了这么长时间 2)有没有更快速的方法 3)网上找的方法是先关闭事务
SET autocommit=0; 在脚本里应该如何写呢?
认证高级PHP讲师
1、索引可以先去掉,導完了再加上。 2、把binlog關了。 (減少寫磁碟)3、buffer_pool能調多大調多大。 (減少寫磁碟)4、redo_log大小能多大多大(減少checkpoint)5、flush neighbors開啟(增加順序寫磁碟)6、flush_at_trx_commit=0(減少寫入磁碟)7 、5.7可以直接像拷貝myisam表一樣拷貝ibd,不知道會不會快(沒過做比較)
修改/etc/my.cnf配置新增autocommit=0; 註解掉log-bin=mysql-bin(暫時不沒有主從設定需求)匯入速度果然快了很多
注意導入後刪除掉autocommit=0;不然修改表的操作會不能執行,必須手動提交才可以。
開啟事務批次導入,速度是很快的,我在Ubuntu(i5-3230M)上PHP平均每秒能插入超過5000條記錄到5.6,也就是導入900萬數據估計只需9000000/5000/60 = 30分鐘.需要注意的是,MySQL InnoDB裡,每個寫入操作比如INSERT/UPDATE/DELETE等都會被當做一個事務自動提交.所以需要先SET AUTOCOMMIT=0禁掉自動提交後再START TRANSACTION開啟事務,最後手動COMMIT提交.
SET AUTOCOMMIT=0
START TRANSACTION
COMMIT
另外,減少寫入日誌操作也能加快寫入效能:停用log-bin 二進位日誌.停用general_log 稽核日誌.innodb_flush_log_at_trx_commit 設為0,禁止每次提交交易都寫入日誌.加大innodb_buffer_pool_size.
1、索引可以先去掉,導完了再加上。
2、把binlog關了。 (減少寫磁碟)
3、buffer_pool能調多大調多大。 (減少寫磁碟)
4、redo_log大小能多大多大(減少checkpoint)
5、flush neighbors開啟(增加順序寫磁碟)
6、flush_at_trx_commit=0(減少寫入磁碟)
7 、5.7可以直接像拷貝myisam表一樣拷貝ibd,不知道會不會快(沒過做比較)
修改/etc/my.cnf配置
新增autocommit=0;
註解掉log-bin=mysql-bin(暫時不沒有主從設定需求)
匯入速度果然快了很多
注意導入後刪除掉autocommit=0;不然修改表的操作會不能執行,必須手動提交才可以。
開啟事務批次導入,速度是很快的,我在Ubuntu(i5-3230M)上PHP平均每秒能插入超過5000條記錄到5.6,也就是導入900萬數據估計只需9000000/5000/60 = 30分鐘.
需要注意的是,MySQL InnoDB裡,每個寫入操作比如INSERT/UPDATE/DELETE等都會被當做一個事務自動提交.
所以需要先
SET AUTOCOMMIT=0
禁掉自動提交後再START TRANSACTION
開啟事務,最後手動COMMIT
提交.另外,減少寫入日誌操作也能加快寫入效能:
停用log-bin 二進位日誌.
停用general_log 稽核日誌.
innodb_flush_log_at_trx_commit 設為0,禁止每次提交交易都寫入日誌.
加大innodb_buffer_pool_size.