原文地址:https://www.jianshu.com/p/2aa75f444175
前言
现在有个迁移数据库的需求,需要将旧mysql中risk库迁移到新mysql里面,数据量在13个GB左右,如果采用导出sql再导入到新库的方法,可能对线上正在使用的数据库产生性能上的影响,所以这次迁移采用官网推荐的select_file的方法
迁移方案
1、将旧库中risk库的表结构导出,导入到新库中。
2、将旧库中risk库的数据导出到txt中,然后将txt中的数据load到新库中
迁移
1、查看select_file功能有没有开启
show global variables like 'secure_file_priv';
[root@localhost][(none)]> show global variables like 'secure_file_priv';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| secure_file_priv | /data/ |
+------------------+--------+
1 row in set (0.00 sec)
这个是我开启后的,如果配置文件里配置是NULL,意思就是mysql数据into outfile不允许into到任何文件夹
这里vim /etc/my.cnf
[mysqld]
secure_file_priv='/data'
重启下mysql,这里我重启的是从库,并且这个/data文件夹内,mysql要有操作权限,这点很重要
2、迁移表结构
旧库上执行:
/usr/local/mysql/bin/mysqldump --set-gtid-purged=off -uroot -p -S /tmp/mysql.sock --master-data=2 --single-transaction --databases risk >risk.sql
在新库上执行:
mysql -uroot -p <risk.sql
3、迁移数据
select into file是以表的数据进行导出的,所以表多的话,建议写成一个脚本,这里以test表为例子,进行迁移
将test这张table的数据into到一个txt文件中。
登录到数据库里面,选择risk库,执行
select * from test into outfile '/data/risk/test.txt'
将test.txt放到新库/data/risk目录下面,开始在新库里面导入
oad data infile '/data/risk/test.txt' into table test
速度大概1百万条数据,导入时间在2分钟左右
4、遇到的坑
如果某张表太大的话,比如一张表就有6个GB的数据,那么load的时候可能会报错:
提示max_binlog_cache_size不够。
这个时候,建议把这个表的数据进行切割,由于是txt格式的,数据都是按行来计算的,可以按行来切割
切割语句:
split -d -l 1000000 test.txt test
然后将切割后的文件,test1、test2、test3等等,mv成test1.txt,test2.txt,test3.txt等,将小文件进行导入,会大大提升导入速度
如果库超级大,不如试试全库拷贝方案。见 https://www.jianshu.com/p/ec28f52a6ac1
网友评论