通常在运行的数据库上做迁移,会出现备份开始到恢复成功之间的数据丢失的情况,本文将讲解避免技巧。

假设要将 10.204.11.100 的 3306 端口实例迁移到 10.204.11.200上。

结合 mysqldump 和 mysqlbinlog 可以做到不停机实时迁移+数据不丢失的迁移。以下为主要步骤,可以在此基础上扩展改造。

1
2
3
# step1: 将远端binlog拉取到目的端
10.204.11.200>mysqlbinlog --read-from-remote-server --raw --host=10.204.11.100 --user dba --password='***' --port 3306 -vv mysql-bin.033813 --stop-never --result-file=/data0/mysql/a/

mysql-bin.033813 为 10.204.11.100 要读取的第一个binlog文件,通常为当前binlog,写入目的端/data0/mysql/a/目录备用。

1
2
3
4
5
6
7
8
9
10
11
#step2:mysqldump全量备份
mysqldump --host=10.204.11.100 --user dba --password='***' --port 3306 --opt --set-gtid-purged=OFF --single-transaction --master-data=2 --events --routines db_name >/data0/mysql/db_name.sql

#step3:恢复备份文件
mysql -uroot -p"***" -S /tmp/mysql_3306.sock < db_name.sql

#step4:补齐binlog
从step2备份文件中读取备份开始的偏移量 -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.001002', MASTER_LOG_POS=27284;
假设/data0/mysql/a/最新的binlog为 binlog.001004
mysqlbinlog --start-position=27284 binlog.001002 binlog.001003 binlog.001004 | mysql -uroot -p"***" -S /tmp/mysql_3306.sock

至此,目的端数据已经和远端对齐。这里面还有些要主要的细节来避免源端继续写入数据。