mysqldump切割导出及导入
近期有些20G的静态表需要迁移数据库
为了保障性能,没有使用MyISAM , 考虑到单个库有20G,直接使用mysqldump 代价会比较大,后来改良dump的过程【分块导出,减少数据库压力】实现数据迁移。 后记:mydumper 也能并发处理类似场景,甚至支持 binlog 的同步,保持数据一致
注意:1、数据表必须有主键
2、需要自行判断执行结果
3、需要自行将dump文件传输至目标服务器
简单代码如下:
导出-此方式是通过ID将数据分步生成多个SQL文件
for tablename in tableName ; do for i in {0..100} ; do echo $i ; #切割份数 n=61310 ; # 每份行数 let a=$n*$i ; let b=$n*$i+$n ; echo $a $b ; mysqldump --no-set-names --skip-disable-keys --skip-add-locks --skip-create-options --skip-add-drop-table --where=" id >=$a and id <$b " sourceSchema ${tablename} | gzip > /tmp/${tablename}_20180308_$i.sql.gz; done; done
导入-可以根据数据库情况,并发导入, -f 可以避免表存在的错误
for tablename in `find /tmp -type f -name "tableName*0308*.sql.gz" ` ; do echo ${tablename}; gunzip < ${tablename} | mysql -f test ; done