通常在運行的數據庫上做遷移,會出現備份開始到恢復成功之間的數據丟失的情況,本文將講解避免技巧。
假設要將 10.204.11.100 的 3306 端口實例遷移到 10.204.11.200上。
結合 mysqldump 和 mysqlbinlog 可以做到不停機實時遷移+數據不丟失的遷移。以下爲主要步驟,可以在此基礎上擴展改造。
# 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/目錄備用。
#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
至此,目的端數據已經和遠端對齊。這裏面還有些要主要的細節來避免源端繼續寫入數據。