通常在运行的数据库上做迁移,会出现备份开始到恢复成功之间的数据丢失的情况,本文将讲解避免技巧。
假设要将 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
|
至此,目的端数据已经和远端对齐。这里面还有些要主要的细节来避免源端继续写入数据。