MySQL基于XtraBackup物理备份搭建GTID主从复制操作手册

发布时间:2026/7/6 3:25:14
MySQL基于XtraBackup物理备份搭建GTID主从复制操作手册 一、环境示例主库IP192.168.1.1 从库IP192.168.1.2 MySQL端口3306 从库服务名mysql_3306 主库备份目录/data/xtrabackup/ 从库备份目录/data/xtrabackup/本文采用 GTID 自动定位方式搭建主从复制。主从 MySQL 版本应保持一致XtraBackup 版本必须与 MySQL 版本兼容。二、总体流程【主库】检查GTID、Binlog及server_id ↓ 【从库】查询datadir、Socket及server_id ↓ 【主库】创建专用复制用户 ↓ 【主库】执行XtraBackup全量备份 ↓ 【主库→从库】传输备份文件 ├─ 不超过100GB直接传输 └─ 超过100GB压缩后传输 ↓ 【从库】执行xtrabackup --prepare ↓ 【从库】停止MySQL并备份原数据目录 ↓ 【从库】执行xtrabackup --copy-back ↓ 【从库】修改权限并删除auto.cnf ↓ 【从库】启动MySQL并检查实例信息 ↓ 【从库】配置GTID主从复制 ↓ 【从库】检查双Yes及GTID推进100GB 是本文为了方便现场操作采用的参考分界并非 XtraBackup 的强制要求。三、【主库执行】检查主库配置登录主库mysql -uroot -p执行SHOW VARIABLES WHERE Variable_name IN ( server_id, server_uuid, log_bin, gtid_mode, enforce_gtid_consistency );应满足server_id非0 log_binON gtid_modeON enforce_gtid_consistencyON记录主库的server_id和server_uuid后续与从库进行对比。四、【从库执行】查询数据目录和 Socket从库 MySQL 正常运行时执行mysql -h127.0.0.1 -P3306 -uroot -p -e SHOW VARIABLES WHERE Variable_name IN (datadir,socket); 返回示例datadir /app/data/mysql/3306/data/ socket /app/data/mysql/3306/run/mysql.sock根据实际查询结果设置变量SLAVE_DATADIR/app/data/mysql/3306/data SLAVE_SOCKET/app/data/mysql/3306/run/mysql.sock检查变量echo $SLAVE_DATADIR echo $SLAVE_SOCKET如果数据库无法登录可查询配置文件my_print_defaults mysqld | grep -E ^--(datadir|socket)或者grep -RniE ^[[:space:]]*(datadir|socket)[[:space:]]* \ /etc/my.cnf /etc/mysql 2/dev/null五、【从库执行】检查从库配置从库配置文件建议包含[mysqld] server_id2 gtid_modeON enforce_gtid_consistencyON read_onlyON super_read_onlyON注意从库server_id必须与主库不同每个 MySQL 实例必须使用唯一的server_id从库端口、数据目录和 Socket 必须与实际环境一致。六、【主库执行】创建复制用户在主库执行CREATE USER IF NOT EXISTS repl192.168.1.2 IDENTIFIED BY 复制用户密码; GRANT REPLICATION SLAVE ON *.* TO repl192.168.1.2; SHOW GRANTS FOR repl192.168.1.2;在从库服务器测试连接mysql -h192.168.1.1 -P3306 -urepl -p -e SELECT 1;确认网络、端口、用户名和密码均正常。七、【主库执行】执行物理备份7.1 创建备份目录mkdir -p /data/xtrabackup BACKUP_DIR/data/xtrabackup/bk if [ -e $BACKUP_DIR ]; then mv $BACKUP_DIR \ ${BACKUP_DIR}_old_$(date %Y%m%d_%H%M%S) fi mkdir -p $BACKUP_DIR7.2 执行全量备份xtrabackup \ --defaults-file/etc/my.cnf \ --userroot \ --password主库密码 \ --backup \ --target-dir/data/xtrabackup/bk确认命令结尾出现completed OK!检查备份状态cat /data/xtrabackup/bk/xtrabackup_checkpoints应包含backup_type full-backuped查看备份大小du -sh /data/xtrabackup/bk八、【主库→从库】传输备份文件情况一备份不超过100GB直接传输1.【从库执行】准备接收目录mkdir -p /data/xtrabackup if [ -e /data/xtrabackup/bk ]; then mv /data/xtrabackup/bk \ /data/xtrabackup/bk_old_$(date %Y%m%d_%H%M%S) fi mkdir -p /data/xtrabackup/bk2.【主库执行】使用 rsync 传输rsync -avh --progress --partial \ /data/xtrabackup/bk/ \ root192.168.1.2:/data/xtrabackup/bk/如果没有安装rsync可以使用scp -r \ /data/xtrabackup/bk \ root192.168.1.2:/data/xtrabackup/传输完成后在从库检查ls -lh /data/xtrabackup/bk cat /data/xtrabackup/bk/xtrabackup_checkpoints情况二备份超过100GB压缩后传输1.【主库执行】检查剩余空间df -h /data/xtrabackup2.【主库执行】压缩并生成校验值cd /data/xtrabackup tar -czf mysql_full_bk.tar.gz bk sha256sum mysql_full_bk.tar.gz \ mysql_full_bk.tar.gz.sha2563.【主库执行】传输至从库scp mysql_full_bk.tar.gz \ mysql_full_bk.tar.gz.sha256 \ root192.168.1.2:/data/xtrabackup/4.【从库执行】校验压缩包cd /data/xtrabackup sha256sum -c mysql_full_bk.tar.gz.sha256正常应显示mysql_full_bk.tar.gz: OK5.【从库执行】解压备份if [ -e /data/xtrabackup/bk ]; then mv /data/xtrabackup/bk \ /data/xtrabackup/bk_old_$(date %Y%m%d_%H%M%S) fi cd /data/xtrabackup tar -xzf mysql_full_bk.tar.gz无论采用哪种传输方式从库最终都应存在/data/xtrabackup/bk九、【从库执行】应用备份日志执行xtrabackup \ --prepare \ --target-dir/data/xtrabackup/bk如果 XtraBackup 未加入环境变量使用实际安装路径/app/tools/xtrabackup/bin/xtrabackup \ --prepare \ --target-dir/data/xtrabackup/bk确认命令结尾出现completed OK!检查状态cat /data/xtrabackup/bk/xtrabackup_checkpoints应显示backup_type full-prepared十、【从库执行】停止 MySQLsystemctl stop mysql_3306 systemctl status mysql_3306确认没有该实例对应的 MySQL 进程ps -ef | grep [m]ysqld如果服务器上存在多个 MySQL 实例必须确认停止的是mysql_3306对应实例。十一、【从库执行】备份原数据目录再次确认数据目录echo $SLAVE_DATADIR备份原数据目录mv $SLAVE_DATADIR \ ${SLAVE_DATADIR}_bak_$(date %Y%m%d_%H%M%S)创建新的空数据目录mkdir -p $SLAVE_DATADIR chown mysql:mysql $SLAVE_DATADIR确认目录为空ls -la $SLAVE_DATADIR十二、【从库执行】恢复数据文件执行xtrabackup \ --defaults-file/etc/my.cnf \ --copy-back \ --target-dir/data/xtrabackup/bk \ --datadir$SLAVE_DATADIR使用指定安装路径时/app/tools/xtrabackup/bin/xtrabackup \ --defaults-file/etc/my.cnf \ --copy-back \ --target-dir/data/xtrabackup/bk \ --datadir$SLAVE_DATADIR确认命令结尾出现completed OK!修改数据目录权限chown -R mysql:mysql $SLAVE_DATADIR检查ls -ld $SLAVE_DATADIR ls -l $SLAVE_DATADIR | head十三、【从库执行】删除 auto.cnf物理备份会将主库的auto.cnf一起复制到从库。该文件保存主库的server_uuid因此首次启动从库前必须删除rm -f $SLAVE_DATADIR/auto.cnf确认已删除test ! -e $SLAVE_DATADIR/auto.cnf \ echo auto.cnf已删除从库启动后会自动生成新的server_uuid。十四、【从库执行】启动并检查数据库启动从库systemctl start mysql_3306 systemctl status mysql_3306确认进程ps -ef | grep [m]ysqld登录从库mysql -uroot -p -S $SLAVE_SOCKET物理恢复后应使用备份时间点主库的账号密码登录。检查实例参数SELECT hostname AS hostname, server_id AS server_id, server_uuid AS server_uuid, gtid_mode AS gtid_mode, read_only AS read_only, super_read_only AS super_read_only;确认从库server_id与主库不同 从库server_uuid与主库不同 gtid_mode为ON read_only为1 super_read_only为1 业务库及数据恢复正常不要随意执行RESET MASTER避免影响恢复后的 GTID 信息。十五、【从库执行】配置 GTID 主从复制MySQL 8.0.23及以上如果从库此前配置过复制STOP REPLICA; RESET REPLICA ALL;配置复制CHANGE REPLICATION SOURCE TO SOURCE_HOST192.168.1.1, SOURCE_PORT3306, SOURCE_USERrepl, SOURCE_PASSWORD复制用户密码, SOURCE_AUTO_POSITION1; START REPLICA;如果复制用户使用caching_sha2_password并出现公钥认证错误可使用CHANGE REPLICATION SOURCE TO SOURCE_HOST192.168.1.1, SOURCE_PORT3306, SOURCE_USERrepl, SOURCE_PASSWORD复制用户密码, SOURCE_AUTO_POSITION1, GET_SOURCE_PUBLIC_KEY1; START REPLICA;检查SHOW REPLICA STATUS\GMySQL 5.7或较早的 MySQL 8.0如果从库此前配置过复制STOP SLAVE; RESET SLAVE ALL;配置复制CHANGE MASTER TO MASTER_HOST192.168.1.1, MASTER_PORT3306, MASTER_USERrepl, MASTER_PASSWORD复制用户密码, MASTER_AUTO_POSITION1; START SLAVE;检查SHOW SLAVE STATUS\G十六、【从库执行】确认复制正常MySQL 8.0检查Replica_IO_Running: Yes Replica_SQL_Running: Yes Last_IO_Error: 空 Last_SQL_Error: 空 Auto_Position: 1MySQL 5.7检查Slave_IO_Running: Yes Slave_SQL_Running: Yes Last_IO_Error: 空 Last_SQL_Error: 空 Auto_Position: 1同时观察Retrieved_Gtid_Set Executed_Gtid_Set Seconds_Behind_Master满足以下条件即可判断主从复制正常复制线程双Yes 无IO和SQL复制报错 GTID持续推进 复制延迟处于合理范围 主库新增数据能够同步至从库十七、现场速查【主库】 1. 检查GTID、Binlog及server_id 2. 创建专用复制用户 3. 执行XtraBackup全量备份 4. 使用du -sh查看备份大小 5. 不超过100GB直接传输 6. 超过100GB压缩后传输 【从库】 7. 查询datadir、Socket及server_id 8. 接收或解压备份 9. 执行xtrabackup --prepare 10. 停止MySQL 11. 备份并重建空数据目录 12. 执行xtrabackup --copy-back 13. 修改mysql:mysql权限 14. 删除auto.cnf 15. 启动MySQL并检查server_uuid 16. 配置GTID自动定位复制 17. 检查双Yes、错误信息和GTID推进十八、注意事项主从 MySQL 版本应保持一致。XtraBackup 版本必须与 MySQL 版本兼容。从库原数据目录必须确认可以覆盖并保留回退目录。copy-back前必须停止从库且目标数据目录必须为空。恢复完成后必须修改数据目录属主为mysql:mysql。首次启动从库前必须删除恢复过来的auto.cnf。主从server_id和server_uuid均不能相同。生产环境应使用专用复制用户不要长期使用root。如果存在独立 Undo、Redo 或表空间目录应额外核对文件路径。不要只检查复制线程双 Yes还要检查复制错误、延迟和 GTID 推进。