mysql迁移某个大数据的库(转)

2019-09-26  本文已影响0人  不爱吃饭的小孩怎么办

原文地址: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

上一篇下一篇

猜你喜欢

热点阅读