01
引言
1、主从复制的作用和优势
主从复制是 MySQL 中常用的一种数据同步机制,通过将主服务器(Master)的数据实时复制到一个或多个从服务器(Slave),可以实现负载均衡、数据备份、高可用性等目标。例如,主服务器负责写操作,而从服务器可以分担读操作的压力,从而提高系统的整体性能。2、Xtrabackup 工具的作用
Xtrabackup 是 Percona 公司开发的一款开源备份工具,支持 MySQL 的热备份(即在数据库运行时不锁定表的情况下进行备份)。它特别适合用于大数据量的备份和恢复,并且能够保证数据的一致性。3、本文目标
本文将详细介绍如何在 MySQL 8 环境中,使用 Xtrabackup 工具在线搭建主从复制架构,确保数据的高可用性和一致性。02
环境准备
操作系统:建议使用 Linux 发行版(如 CentOS 7/8 或 Ubuntu 18.04/20.04)。
MySQL 版本:MySQL 8.x,确保主从服务器的 MySQL 版本一致。
Xtrabackup 版本:Percona Xtrabackup 8.x,与 MySQL 8 兼容。
2.1 系统要求
2.2 安装 MySQL 8
在主从服务器上分别安装 MySQL 8。可以通过官方仓库或 MySQL 官网下载安装包。安装完成后,确保 MySQL 服务正常运行。2.3 安装 Xtrabackup
Xtrabackup 可以通过 Percona 的官方仓库安装。安装完成后,使用xtrabackup --version
命令验证是否安装成功。
03
主从复制原理
二进制日志(Binary Log)
MySQL 的主从复制依赖于二进制日志。主服务器将所有写操作记录到二进制日志中,从服务器通过读取这些日志来同步数据。GTID(全局事务标识符)
GTID 是 MySQL 5.6 引入的特性,用于简化主从复制的管理。每个事务都有一个唯一的 GTID,从服务器可以通过 GTID 精确地定位需要同步的数据。复制线程
IO Thread:从服务器连接到主服务器,读取二进制日志并保存到本地的中继日志(Relay Log)。
SQL Thread:从服务器读取中继日志中的事件并执行,从而实现数据同步。
04
主库配置
4.1 修改主服务器配置文件
编辑 MySQL 的配置文件(通常为 /etc/my.cnf
或 /etc/mysql/mysql.conf.d/mysqld.cnf
)
[root@node1 soft]# grep server-id etc/my.cnf
server-id= 1
[root@node1 soft]# grep log-bin etc/my.cnf
log-bin=/data/mysql/data/mysql-bin
[root@node1 soft]# grep gtid_mode etc/my.cnf
#gtid_mode = on
[root@node1 soft]# grep enforce_gtid_consistency etc/my.cnf
#enforce_gtid_consistency = on
#发现被注释了,因此进行生效
[root@node1 soft]# vi etc/my.cnf
[root@node1 soft]#
[root@node1 soft]#
[root@node1 soft]# grep gtid_mode etc/my.cnf
gtid_mode = on
[root@node1 soft]# grep enforce_gtid_consistency etc/my.cnf
enforce_gtid_consistency = on
[root@node1 soft]#
复制
保存后重启 MySQL 服务。
在主服务器上创建一个专门用于复制的用户,并授予复制权限:
create user 'mysql_rep'@'%' IDENTIFIED WITH mysql_native_password BY 'Vdj8v0+b+0+XyrJRrG2e';
GRANT ALL PRIVILEGES ON *.* TO 'mysql_rep'@'%';
flush privileges;
复制
重启 MySQL 以使配置生效:
service mysql restart
复制
05
Xtrabackup备份主库数据
在主库上使用 Xtrabackup 执行全量备份:
/data/soft/percona-xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --no-server-version-check --host=localhost --port=3306 --compress --compress-threads=2 --user=root --password=***** --backup --target-dir=/data/backup/
复制
06
从库配置操作
6.1 修改从服务器配置文件
配置
my.cnf
文件,启用 GTID 和设置唯一的server-id
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
[root@node2 soft]# grep server-id etc/my.cnf
server-id= 20
[root@node2 soft]# grep gtid_mode etc/my.cnf
gtid_mode = on
[root@node2 soft]# grep enforce_gtid_consistency etc/my.cnf
enforce_gtid_consistency = on
[root@node2 soft]#
复制
通过scp命令传输完成后,使用 --decompress 选项解压备份数据
[root@node2 soft]# data/soft/percona-xtrabackup/bin/xtrabackup --no-server-version-check --decompress --target-dir=/data/backup
2025-03-21T15:35:08.408410+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --datadir=/data/mysql/data --server-id=20 --open_files_limit=65535 --innodb_file_per_table=1 --log_bin=/data/mysql/data/mysql-bin --innodb_log_files_in_group=5 --innodb_undo_directory=/data/mysql/data --innodb_buffer_pool_size=8455346892 --innodb_log_file_size=1G --innodb_log_buffer_size=100M
2025-03-21T15:35:08.408688+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized client arguments: --socket=/data/mysql/data/mysql.sock --no-server-version-check=1 --decompress=1 --target-dir=/data/backup
/data/soft/percona-xtrabackup/bin/xtrabackup version 8.3.0-1 based on MySQL server 8.3.0 Linux (x86_64) (revision id: 3e4e7ce9)
2025-03-21T15:35:08.409329+08:00 0 [Note] [MY-011825] [Xtrabackup] decompressing ./xtrabackup_logfile.zst
2025-03-21T15:35:08.425631+08:00 0 [Note] [MY-011825] [Xtrabackup] decompressing ./ibdata1.zst
2025-03-21T15:35:08.441156+08:00 0 [Note] [MY-011825] [Xtrabackup] decompressing ./sys/sys_config.ibd.zst
2025-03-21T15:35:08.446337+08:00 0 [Note] [MY-011825] [Xtrabackup] decompressing ./mysql.ibd.zst
复制

解压完成后,使用
--prepare
选项准备备份数据,确保数据的一致性:
/data/soft/percona-xtrabackup/bin/xtrabackup --prepare --target-dir=/data/backup
复制

备库恢复数据文件:
/data/soft/percona-xtrabackup/bin/xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/data/backup
复制
修改数据目录的权限以确保 MySQL 可以访问。
chown -R mysql:mysql data/mysq/data
复制
6.6 启动从服务器 MySQL 服务
启动 MySQL 服务并检查数据是否恢复成功。
07
配置主从同步
这个文件里面有相关对应信息:xtrabackup_info
[root@node2 backup]# grep binlog_pos xtrabackup_info
binlog_pos = filename 'mysql-bin.000004', position '198', GTID of the last change '730fb145-0623-11f0-b824-000c29706275:1-8'
复制
reset master;
#8.4.3版本使用replication而不是slave
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='192.168.**.***',
SOURCE_PORT=3306,
SOURCE_USER='mysql_rep',
SOURCE_PASSWORD='****',
SOURCE_AUTO_POSITION=1;
复制
启动复制进程并检查状态。
start replica;
show replica status\G
复制

08
验证主从复制
8.1 检查复制状态
使用
SHOW SLAVE STATUS\G
检查复制是否正常运行。8.2 测试数据同步
在主服务器上创建测试数据,验证从服务器是否同步成功。
总结:
通过本文的步骤,您可以成功使用 Xtrabackup 在 MySQL 8 中在线搭建主从复制环境。
主从复制不仅提高了系统的可用性和性能,还为数据备份和灾难恢复提供了保障。
建议进一步学习 MySQL 的高级复制特性,如半同步复制、多线程复制等。
参考资料
MySQL 8 官方文档:https://dev.mysql.com/doc/refman/8.0/en/
Percona Xtrabackup 官方文档:https://www.percona.com/software/mysql-database/percona-xtrabackup