以下是 MySQL 8.0 基于 GTID 构建主从复制的详细步骤,适用于已有 小于 100G 数据的主库场景:
一、环境准备与配置检查
-
版本与环境要求
- 主从库均为 MySQL 8.0(版本需一致,避免兼容性问题)
- 从库磁盘空间至少为 20G(10G 数据 + 日志及冗余空间)
- 主从服务器网络互通,防火墙开放 3306 端口
- 主库已启用 GTID(MySQL 8.0 默认部分启用,需确认配置)
-
主库 GTID 配置确认
-- 主库执行,检查 GTID 状态 SHOW VARIABLES LIKE '%gtid%';需确保以下参数:
gtid_mode = ONenforce_gtid_consistency = ONbinlog_gtid_simple_recovery = ON
若未启用,需在
my.cnf中配置并重启主库:[mysqld] server-id = 101 # 主库唯一ID(如101) log_bin = /var/log/mysql/binlog # binlog存储路径 binlog_format = row # 推荐row格式,复制更安全 gtid_mode = ON enforce_gtid_consistency = ON log_slave_updates = ON # 级联复制需开启 -
从库配置
在从库my.cnf中添加:[mysqld] server-id = 102 # 从库唯一ID(需与主库不同,如102) log_bin = /var/log/mysql/binlog # 从库也可开启binlog(可选) relay_log = /var/log/mysql/relaylog gtid_mode = ON enforce_gtid_consistency = ON read_only = ON # 设为只读(super用户除外) skip_slave_start = ON # 避免重启后自动启动复制(手动控制)配置后重启从库:
systemctl restart mysqld
二、创建复制专用账号(主库操作)
MySQL 8.0 默认使用 caching_sha2_password 认证插件,需特别配置:
-- 创建复制用户(指定从库IP,如192.168.1.102)
CREATE USER 'repl_user'@'192.168.1.102' IDENTIFIED WITH mysql_native_password BY 'StrongP@ss123';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.1.102';
-- 刷新权限
FLUSH PRIVILEGES;
三、主库数据备份(关键步骤)
-
执行备份(使用 mysqldump)
因主库已有 10G 数据,且需保证一致性,执行以下命令:mysqldump -u root -p \ --all-databases \ --triggers --routines --events \ --single-transaction \ # 对InnoDB表生成一致性快照,不锁表 --source-data=2 \ # 记录binlog位置(MySQL 8.0推荐用source-data) --set-gtid-purged=ON \ # 记录GTID信息 --hex-blob \ # 二进制数据转十六进制,避免乱码 > /tmp/master_backup_$(date +%F).sql- 备份时间取决于数据量和服务器性能(10G 数据可能需要数分钟到半小时)
- 备份文件会包含类似如下注释(记录GTID和binlog信息):
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000005', MASTER_LOG_POS=156; -- SET @@GLOBAL.GTID_PURGED='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-100';
-
传输备份文件到从库
scp /tmp/master_backup_20240901.sql root@192.168.1.102:/tmp/
四、从库恢复数据
-
恢复前准备
从库需初始化为空库(若有数据需先清理): -
执行恢复
mysql -u root -p < /tmp/master_backup_20240901.sql- 恢复过程中可查看从库日志:
tail -f /var/log/mysqld.log - 10G 数据恢复可能需要较长时间,耐心等待
- 恢复过程中可查看从库日志:
五、配置从库复制(从库操作)
-
停止从库复制进程(若已存在)
STOP SLAVE; RESET SLAVE ALL; # 清除原有复制配置 -
配置主库信息(基于GTID自动同步)
CHANGE MASTER TO MASTER_HOST = '192.168.1.101', # 主库IP MASTER_USER = 'repl_user', # 复制账号 MASTER_PASSWORD = 'StrongP@ss123', # 密码 MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1; # 启用GTID自动定位(核心参数) -
启动复制进程
START SLAVE;
六、主从复制检查与验证
-
查看从库复制状态
SHOW SLAVE STATUS\G关键参数需满足:
Slave_IO_Running: Yes(IO线程正常)Slave_SQL_Running: Yes(SQL线程正常)Seconds_Behind_Master: 0(无延迟,初期可能大于0,需等待追赶)Retrieved_Gtid_Set和Executed_Gtid_Set不为空,且后者逐渐接近前者
-
数据一致性验证
- 统计主库某张表的记录数:
-- 主库执行 SELECT COUNT(*) FROM mysql.user; # 示例表 - 从库执行相同查询,结果需一致。
- 统计主库某张表的记录数:
-
GTID同步测试
- 主库创建测试数据:
CREATE DATABASE IF NOT EXISTS test_repl; USE test_repl; CREATE TABLE t1 (id INT PRIMARY KEY); INSERT INTO t1 VALUES (1), (2), (3); - 从库验证是否同步:
SELECT * FROM test_repl.t1; # 应返回3条记录
- 主库创建测试数据:
-
延迟监控
持续观察Seconds_Behind_Master,确保稳定在 0 或较小值(如 < 10 秒)。
七、注意事项
- 备份时机:建议在业务低峰期执行备份,避免
--single-transaction导致的事务日志膨胀。 - 权限问题:从库
read_only对 super 用户无效,建议从库仅保留必要的管理员账号。 - GTID冲突处理:若从库之前有数据,可能存在 GTID 冲突,需执行
RESET MASTER;清除从库 GTID 历史。 - 定期维护:
- 监控复制延迟(可使用 Percona Monitoring 等工具)
- 定期备份从库,验证数据一致性
- 避免主库删除 binlog 过快(配置
expire_logs_days保留足够日志)
通过以上步骤,可基于 GTID 实现 MySQL 8.0 的主从复制,GTID 机制能自动处理复制位置,减少人工干预,提高可靠性。
809

被折叠的 条评论
为什么被折叠?



