使用percona-xtrabackup工具解决mysql的主从同步问题

公司的项目上出现了主从同步异常问题,数据库比较大,所以采用了重做主从同步的方法。

Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品。Xtrabackup由个部分组成:xtrabackup和innobackupex,其中xtrabackup工具用于备份innodb和 xtraDB引擎的表;而innobackupex工具用于备份myisam和innodb引擎的表。

1. 确认操作系统版本  

cat /etc/redhat-release
# 公司使用的是centos,以centos7 为例

2 确认mysql版本

mysqld --help
mysqld  Ver 5.7.33 for Linux on x86_64 (MySQL Community Server (GPL))
Copyright (c) 2000, 2021, Oracle and/or its affiliates.

3. 下载对应版本的 

https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

https://www.percona.com/doc/percona-xtrabackup/2.4/installation.html#installing-percona-xtrabackup-from-a-binary-tarball  

因为我的虚拟机环境里是5.7的数据库 ,就下载安装了Percona XtraBackup 2.4 ,

在  https://www.percona.com/services/policies/percona-software-support-lifecycle 页面中可以查看xtrabackup对不同版本mysql的支持情况

使用percona-xtrabackup工具解决mysql的主从同步问题

percona xtrabackup 2.4 支持  mysql 5.7以下版本 ; percona xtrabackup 8.0 支持 mysql 8.0以上版本

# 下载
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm # 安装 yum localinstall -y percona-xtrabackup-80-8.0.5-1.el7.x86_64.rpm

4. 全量备份

$ /usr/bin/innobackupex --defaults-file=${my.cnf}  --socket=/tmp/mysql.sock --user=${user} --password=${password} /mnt/databak

# 注意: 备份数据使用的空间要大于主库目录的大小
# ${my.cnf}为配置文件地址 # ${user}和${password}变量为数据库账号和密码 # /mnt/databak 为备份存储目录。 # /tmp/mysql.sock 为mysql 的socket连接文件,可写可不写

#命令执行后会在 /mnt/databak/目录下生成对应的备份文件目录: /mnt/databak/2021-12-12_12-12-12

5. 预处理: 进行事务检查(也可以拷贝到从库后再进行检查)

$ innobackupex --defaults-file=${my.cnf} --user=${user} --password=${password} --socket=/tmp/mysql.sock --apply-log --use-memory=1G /mnt/databak/2021-12-12_12-12-12

# 指定 --use-memory 可以加快命令执行速度

6. scp备份目录到从库

scp -r /mnt/databak/2021-12-12_12-12-12  192.168.2.2://mnt/databak/

7. 关闭清理从库

systemctl stop mysqld

rm -rf  /path/mysql/datadir/*
rm -rf  /path/mysql/binlogs/*
rm -rf  /path/mysqlylogs/*

# 具体路径可在mysql配置文件中看到

8. 恢复数据

innobackupex ---defaults-file=${my.cnf}  --socket=/tmp/mysql.sock --user=${user} --password=${password} --copy-back /mnt/databak/2021-12-12_12-12-12

9. 设置权限并启动从库

chown -R mysql:mysql  /path/mysql  
systemctl start mysqld

10. 恢复数据

# 查看主库中master位置
cat /mnt/databak/2021-12-12_12-12-12/xtrabackup_binlog_info
fb-bin.001212   122222222


# 如果是新建主从,需在主库建立用户
mysql> grant replication slave,reload,super on *.* to repluser@192.168.3.13 identified by 'replpass';
mysql> FLUSH PRIVILEGES;


# 登录从库,执行同步
mysql> change master to master_host=${host}, master_user=${user}, master_password=${password}, master_log_file='fb-bin.001212',master_log_pos=122222222;

mysql> start slave;

# 查看从库状态
mysql>  show slave statusG;

#  查看 Slave_IO_Running: Yes  和  Slave_SQL_Running: Yes 是否正常
# 观察 Master_Log_File:  和 Relay_Master_Log_File