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.