mysql迁移之巨大数据量快速迁移方案

时间:2024-03-05 07:48:21

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配置,启动服