背景
现有一套主从复制架构的mysql 5.7数据库,主从复制中断较长时间,数据差异较大无法通过bingo同步恢复,另外数据库数据量较大,主库不能停机中断业务。
分析
使用xtrabackup 工具进行整库备份,从备份还原从库重搭备库然后恢复主从同步。
步骤
主从数据库安装 Xtrabackup 工具
官网安装参考:
https://docs.percona.com/percona-xtrabackup/2.4/installation/yum_repo.html
安装步骤:(yum 安装已失效,使用二进制包安装)
$ wget wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.27/binary/tarball/percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
$ tar xvf percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
mv ./percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12 /usr/local/
cd /usr/local/
ln -s ./percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12/ xtrabackup
vim /etc/profile
#结尾添加
# PATH=$PATH:/usr/local/xtrabackup/bin
# export PATH
source /etc/profile
#查看能否使用
innobackupex -v
备份主库
创建备份脚本:
#!/bin/bash
password='xxxxxxx'
innobackupex --defaults-file=/etc/my.cnf --user=root --password=$password --socket=/var/lib/mysql/mysql.sock --parallel=4 --no-timestamp --stream=xbstream . | lz4 -B4 > /bak/mysqlbak_`date +%F`
exit 0
执行备份脚本,并将备份文件传输到从库。
恢复从库
停止从库,清空从库的数据目录 /var/lib/mysql
systemctl stop mysqld
rm -rf /var/lib/mysql/*
#解压到文件夹
cat mysqlbak_2024-11-29 | lz4 -d | xbstream -x -C /tmp/mysql
#还原数据
innobackupex --apply-log /tmp/mysql/
innobackupex --copy-back /tmp/mysql/
#修改目录权限
chown mysql.mysql /var/lib/mysql -R
#启动数据库
systemctl start mysqld
恢复主从同步
查看xtrabackup数据备份中的xtrabackup_binlog_info文件,此文件中记录了三个重要信息,分别是:
1). 备份主库时binlog文件名--下图中红色框内标记的值
2). 备份主库时最后一个事务ID--下图中黄色框内标记的值
3).备份主库时最后一个事务的GTID--下图中蓝色框内标记的值
cat /tmp/mysql/xtrabackup_binlog_info
mysql-bin.003527 608322706 826a210e-3546-11eb-ae86-005056af2ea1:1-720939282
恢复主从同步,在从库上执行如下命令:
# 清空本地主从同步信息
mysql> RESET MASTER;
mysql> RESET SLAVE ALL;
# 设置从库的GTID_PURGED
mysql> SET GLOBAL GTID_PURGED='826a210e-3546-11eb-ae86-005056af2ea1:1-720939282';
# 设置同步状态
mysql > change master to
master_host='172.16.27.201',
master_port=3306,
master_user='slave',
master_password='xxxxxx',
MASTER_AUTO_POSITION = 1;
#启动从库同步
mysql> START SLAVE;
#查看同步状态
mysql> SHOW SLAVE STATUS\G;