mysql迁移之巨大数据量快速迁移方案-增量备份及恢复
--chenjianwen
一、前言:
当mysql库的大小达到几十个G或者上百G,迁移起来是一件非常费事的事情,业务中断,导出导入耗费大量的时间;所以,需要考虑怎么去节省时间的问题。
二、方案:
1.全备数据,备份后得到新的 binlog 日志文件
2.将全备得到得 sql 大数据文件导入新库中【期间消耗大量时间】
3.通过现在的 新的 binlog 日志文件 获取期间增量的数据 mysql-000166.sql
4.将 mysql-000166.sql 直接导入到新库中
5.修改业务连接mysql配置,启动服务
三、优点
1.大大减少了导入新库所需要的时间,相当于减少了业务中断的时间
四、详细实施步骤
1.全备数据库#!/bin/bash###用于迁服前导出数据库,并导入新的目标数据库。放到迁移目标ip执行,减少sql文件传输时间
MY_PATH=$(cd `dirname $0`; pwd) cd $MY_PATH _start_time=`date +%F_%T` ip="192.168.1.30" #源服务器内网ip pub_ip="xxxx" #源服务器外网ip port=3306 time mysql -h${ip} -P${port} -uroot -pxxxx -e \'show databases;\' | grep -Ev "Database|information_schema|mysql|performance_schema" | grep -v "^test$" | xargs mysqldump -uroot -pxxxx -h${ip} -P${port} --single-transaction --master-data=2 --flush-logs -BRE --set-gtid-purged=OFF --events > ./${pub_ip}_mysql.sql #time mysqldump -uroot -pxxxx -h${ip} -P${port} --single-transaction --master-data=2 --flush-logs -BRE --set-gtid-purged=OFF --events zombie108 > ./zombie108_mysql.sql if [ $? == 0 ];thentime mysql -h127.0.0.1 -P3306 -uroot -pxxx < ./${pub_ip}_mysql.sql mysql-000166.sql fi _end_time=`date +%F_%T` echo "start_time:${_start_time}" echo "end_time:${_end_time}"
注释:
--single-transaction:获取到innodb的一致性快照备份,不锁表
--flush-logs:刷新binlog日志
-B:导出多个数据库
-R:导出存储过程以及自定义函数
-E:导出事件
--set-gtid-purged=OFF:关闭gtid复制
2.制定正式迁移时间,停止业务,获取新增的binlog文件,将binglog转换成sql【建议尽量在一两天内完成,避免新增的binlog过大】
mysqlbinlog mysql-bin.000166 > mysql-bin.000166.sql
3.将 mysql-000166.sql 直接导入到新库中
time mysql -h127.0.0.1 -P3306 -uroot -pxxx < ./mysql-000166.sql
4.修改业务连接mysql配置,启动服