作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等)
公众号:老苏畅谈运维
一、背景
如何基于 XtraBackup 搭建从库?
整个过程其实比较简单,无非是备份还原。唯一需要注意的是建立复制时位置点的选择,包括:
在基于位置点的复制中,CHANGE MASTER TO 语句中 MASTER_LOG_FILE 和 MASTER_LOG_POS 的选择。
在GTID 复制中,在执行CHANGE MASTER TO 命令之前,必须首先设置 GTID_PURGED。
在 MySQL 8.0 中,得益于performance_schema.log_status 的引入( 注意,不是备份锁 ),XtraBackup 8.0 在备份的过程中不再加全局读锁。
而备份集对应的位置点信息,是 XtraBackup 8.0 在备份结束时查询performance_schema.log_status 获取的,包括 GTID 和 Binlog 的位置点。
理论上,备份集里保存的 GTID 和 Binlog 位置点,指向的应该是同一个事务。
但在 XtraBackup 8.0 中,却并非如此。
由此带来的问题是,在 GTID 复制中,如果我们还是按照 MySQL 5.6,5.7( 对应 XtraBackup 2.4 )中的方法来搭建从库,大概率会导致主从数据不一致,甚至主从复制中断。
那么,在 XtraBackup 8.0 中,我们又该如何搭建从库呢,下面将为您详细介绍。
二、XtraBackup搭建从库
以下是测试环境信息。
下面我们看看具体的搭建步骤。
2.1主库上创建复制账号
mysql>create user ‘repl’@‘%’ identified by ‘repl123’;
QueryOK, 0 rows affected (0.01 sec)
mysql>grant replication slave on . TO ‘repl’@‘%’;
QueryOK, 0 rows affected (0.00 sec)
2.2对主库进行备份
在 10.0.0.118 上执行备份命令。
#xtrabackup --user=backup_user --password=backup_pass --socket=/data/mysql/3306/data/mysql.sock --backup --parallel=10 --slave-info --target-dir=/data/backup/full
2.3将备份文件传输到从库上
#scp -r /data/backup/full/* root@10.0.0.195:/data/backup/full
2.4从库上准备好 MySQL 安装包及参数文件
#tar xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
#cd /usr/local/
#ln -s mysql-8.0.27-linux-glibc2.12-x86_64 mysql
2.5在从库上进行 Prepare 和恢复
#xtrabackup --prepare --target-dir=/data/backup/full
#xtrabackup --defaults-file=/etc/my.cnf --copy-back --parallel=10 --target-dir=/data/backup/full
###恢复命令中的 /etc/my.cnf 是从库的配置文件。
其中,第 2,3,5 步可以简化为下面这两条命令。
#xtrabackup \
–user=backup_user–password=backup_pass --socket=/data/mysql/3306/data/mysql.sock \
–backup–stream=xbstream --slave-info --parallel=10 | lz4 | \
sshmysql@10.0.0.195 ‘cat - | lz4 -d | xbstream -p10 -x -C /data/mysql/3306/data/’
#xtrabackup --prepare --target-dir=/data/mysql/3306/data/
第一条命令是线上搭建从库时的一条常用命令,它将流式备份、管道结合在一起,具有以下优点:
边备份,边解压。相对于备份、传输、再解压,花费的时间更短。
备份集是直接解压到从库服务器,并不会保存到本地。这样,对于主库服务器,一可减少磁盘空间,二可减小磁盘 IO 压力。
/data/mysql/3306/data/ 是从库的数据目录,在恢复时,无需 --copy-back,直接 Prepare 即可。
2.6启动实例
#chown -R mysql.mysql /data/mysql/3306/data/
#/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
很多人有个误区,认为搭建从库,需要提前创建个空白实例。对于逻辑备份确实如此,但对于物理备份,则无此必要,直接使用 mysqld_safe 启动还原后的备份文件即可。
2.7建立复制
这里需要区分两种场景:GTID 复制和基于位置点的复制。
首先查看备份集中的xtrabackup_binlog_info 文件的内容。
#cat xtrabackup_binlog_info
mysql-bin.000002882880068 2cbdc21a-db11-11ec-83bf-020017003dc4:1-223148
如果 xtrabackup_binlog_info 中存在 GTID 信息,则代表备份实例开启了 GTID,这个时候就需要建立 GTID 复制。
2.7.1GTID 复制
对于 GTID 复制,在建立复制前,必须首先设置 GTID_PURGED。
设置 GTID_PURGED 时,注意备份实例的版本。
在 MySQL 8.0 中,无需设置 GTID_PURGED。
至于为什么不用设置,后面会有详细介绍。这里,大家记住这个结论就可以了。
设置完 GTID_PURGED,接下来执行 CHANGE MASTER TO 命令。
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.118’,
MASTER_USER=‘repl’,
MASTER_PASSWORD=‘repl123’,
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
对于 GTID 复制,需将 MASTER_AUTO_POSITION 设置为 1。
在 MySQL 8.0 中,CHANGE MASTER TO 语句中还需添加 GET_MASTER_PUBLIC_KEY = 1。
2.7.2基于位置点的复制
如果 xtrabackup_binlog_info 没有 GTID 信息,则代表备份实例没有开启 GTID,这个时候就无需设置 GTID_PURGED,直接执行 CHANGE MASTER TO 命令即可。
CHANGE MASTER TO
MASTER_HOST=‘10.0.0.118’,
MASTER_USER=‘repl’,
MASTER_PASSWORD=‘repl123’,
MASTER_PORT=3306,
MASTER_LOG_FILE=‘mysql-bin.000002’,
MASTER_LOG_POS=882880068;
CHANGE MASTER TO 语句中的 MASTER_LOG_FILE 和 MASTER_LOG_POS 的值分别取自 xtrabackup_binlog_info 中的 filename 和 position。
2.8开启复制
mysql>start slave;
2.9检查主从复制是否正常
mysql>show slave status\G
Slave_IO_Running 和Slave_SQL_Running 均为 Yes 代表复制正常。
以上就是使用 XtraBackup 搭建从库的基本步骤。