基于 GTID 实现 MySQL 8.0 的主从复制

以下是 MySQL 8.0 基于 GTID 构建主从复制的详细步骤,适用于已有 小于 100G 数据的主库场景:

一、环境准备与配置检查

  1. 版本与环境要求

    • 主从库均为 MySQL 8.0(版本需一致,避免兼容性问题)
    • 从库磁盘空间至少为 20G(10G 数据 + 日志及冗余空间)
    • 主从服务器网络互通,防火墙开放 3306 端口
    • 主库已启用 GTID(MySQL 8.0 默认部分启用,需确认配置)
  2. 主库 GTID 配置确认

    -- 主库执行,检查 GTID 状态
    SHOW VARIABLES LIKE '%gtid%';
    

    需确保以下参数:

    • gtid_mode = ON
    • enforce_gtid_consistency = ON
    • binlog_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  # 级联复制需开启
    
  3. 从库配置
    在从库 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;

三、主库数据备份(关键步骤)

  1. 执行备份(使用 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';
      
  2. 传输备份文件到从库

    scp /tmp/master_backup_20240901.sql root@192.168.1.102:/tmp/
    

四、从库恢复数据

  1. 恢复前准备
    从库需初始化为空库(若有数据需先清理):

  2. 执行恢复

    mysql -u root -p < /tmp/master_backup_20240901.sql
    
    • 恢复过程中可查看从库日志:tail -f /var/log/mysqld.log
    • 10G 数据恢复可能需要较长时间,耐心等待

五、配置从库复制(从库操作)

  1. 停止从库复制进程(若已存在)

    STOP SLAVE;
    RESET SLAVE ALL;  # 清除原有复制配置
    
  2. 配置主库信息(基于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自动定位(核心参数)
    
  3. 启动复制进程

    START SLAVE;
    

六、主从复制检查与验证

  1. 查看从库复制状态

    SHOW SLAVE STATUS\G
    

    关键参数需满足:

    • Slave_IO_Running: Yes(IO线程正常)
    • Slave_SQL_Running: Yes(SQL线程正常)
    • Seconds_Behind_Master: 0(无延迟,初期可能大于0,需等待追赶)
    • Retrieved_Gtid_SetExecuted_Gtid_Set 不为空,且后者逐渐接近前者
  2. 数据一致性验证

    • 统计主库某张表的记录数:
      -- 主库执行
      SELECT COUNT(*) FROM mysql.user;  # 示例表
      
    • 从库执行相同查询,结果需一致。
  3. 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条记录
      
  4. 延迟监控
    持续观察 Seconds_Behind_Master,确保稳定在 0 或较小值(如 < 10 秒)。

七、注意事项

  1. 备份时机:建议在业务低峰期执行备份,避免 --single-transaction 导致的事务日志膨胀。
  2. 权限问题:从库 read_only 对 super 用户无效,建议从库仅保留必要的管理员账号。
  3. GTID冲突处理:若从库之前有数据,可能存在 GTID 冲突,需执行 RESET MASTER; 清除从库 GTID 历史。
  4. 定期维护
    • 监控复制延迟(可使用 Percona Monitoring 等工具)
    • 定期备份从库,验证数据一致性
    • 避免主库删除 binlog 过快(配置 expire_logs_days 保留足够日志)

通过以上步骤,可基于 GTID 实现 MySQL 8.0 的主从复制,GTID 机制能自动处理复制位置,减少人工干预,提高可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值