背景
最近,我们部署的MySQL主从复制集群出现从库同步异常问题,导致从库无法正常接收主库的binlog日志更新。由于同步中断时间较长,主从数据库已产生显著数据差异,且现有备份方案无法有效恢复数据一致性。
由于主库数据量较大,采用传统的SQL文件导出再导入从库的方式容易因内存溢出导致进程中断。为规避此风险,现决定采用XtraBackup工具进行数据迁移,该方案通过物理备份方式直接复制数据文件,能有效处理海量数据场景,同时支持热备份保障业务连续性。
实现方式
1、安装XtraBackup工具 (主从服务器均需要安装)
因为我们服务器为内网服务器,且操作系统为ubuntu,因此选用二进制方式安装。
1)、下载工具
wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.34-29/binary/tarball/percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17.tar.gz
## 解压
tar -zxvf percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17.tar.gz
2)、进入目录即可找到 xtrabackup 可执行文件,并建立软连接方便全局使用
cd /home/percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17/bin
ln -s $(pwd)/bin/xtrabackup /usr/local/bin/xtrabackup
3)、验证是否成功
xtrabackup --version
输出示例:
xtrabackup version 8.0.34-29 based on MySQL server 8.0.34 Linux (x86_64)
2、迁移数据
1)、 使用 XtraBackup 备份主库(在主库中执行)
xtrabackup --backup \
--user=root \
--password=your_root_password \ ## 数据库root用户的密码
--target-dir=/path/to/backup/ ## 本地存放备份的目录
2)、 将备份传输到从库(使用 scp,在主库中执行)
scp -r /path/to/backup/ root@slave_ip:/path/to/restore/
## slave_ip 从库IP地址
3)、准备备份(在从库中执行)
xtrabackup --prepare --target-dir=/path/to/restore/
4)、恢复备份到从库的数据目录(在从库中执行)
systemctl stop mysql ## 停止从库mysql
rm -rf /var/lib/mysql/* ## 删除从库mysql中数据,确保从库数据备份了
xtrabackup --copy-back --target-dir=/path/to/restore/ ## /path/to/restore/为备份数据
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql
5)、获取 binlog 文件名和位置(查看 xtrabackup_binlog_info)(主库执行)
cat /path/to/restore/xtrabackup_binlog_info
6)、配置从库连接主库并启动复制(在从库中执行)
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replica_user', ## 之前在主库中设置的主从复制用户
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=328;
START SLAVE;
检查复制状态:
SHOW SLAVE STATUS\G