如何在mysql中使用GTID管理复制

GTID启用需配置enforce-gtid-consistency=ON、gtid-mode=ON、log-bin、log-slave-updates及唯一server-id,主从复制通过MASTER_AUTO_POSITION=1自动同步,简化切换与维护,避免日志位置管理。

在MySQL中使用GTID(Global Transaction Identifier)管理复制可以简化主从同步的配置和维护,避免传统基于二进制日志文件名和位置带来的复杂性。GTID为每个事务分配唯一标识,使得故障切换、主从切换更加可靠和自动化。

启用GTID复制

要在MySQL中使用GTID,必须在主库和从库上正确配置相关参数。以下是在my.cnfmy.ini中需要设置的关键选项:

  • enforce_gtid_consistency = ON:确保所有事务符合GTID安全要求
  • gtid_mode = ON:启用GTID模式
  • log_bin = ON:开启二进制日志(主库必需)
  • log_slave_updates = ON:从库记录回放的事务到自己的binlog(用于级联复制)
  • server_id:每台服务器必须有唯一的ID

示例配置:

[mysqld]
server-id = 1
log-bin = mysql-bin
enforce-gtid-consistency = ON
gtid-mode = ON
log-slave-updates = ON

修改配置后重启MySQL服务,并通过以下命令验证GTID是否启用:

SHOW VARIABLES LIKE 'gtid_mode';
SHOW VARIABLES LIKE 'enforce_gtid_consistency';

配置主从复制使用GTID

在主库上创建用于复制的用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

在从库上使用CHANGE MASTER TO命令配置复制,指定使用GTID:

CHANGE MASTER TO
  MASTER_HOST='master_ip',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_AUTO_POSITION = 1;

MASTER_AUTO_POSITION = 1是关键,它告诉MySQL使用GTID自动定位同步位置,不再需要手动指定binlog文件和pos。

启动复制:

START SLAVE;

检查复制状态:

SHOW SLAVE STATUS\G

关注Slave_IO_RunningSlave_SQL_Running是否为Yes,以及Retrieved_Gtid_SetExecuted_Gtid_Set是否有进展。

常见操作与维护

使用GTID后,一些运维操作变得更简单:

  • 主从切换:新主库会自动包含之前主库的GTID集,从库能识别已执行的事务,避免重复应用
  • 添加新从库:直接配置指向主库,开启自动定位即可,无需手动找位点
  • 跳过错误事务:在紧急情况下可通过注入空事务跳过错误(不推荐常规使用): SET GTID_NEXT='xxx-xxxx-xxx:N';
    BEGIN; COMMIT;
    SET GTID_NEXT='AUTOMATIC';

查看当前实例的GTID执行情况:

SHOW MASTER STATUS;
SELECT @@GLOBAL.gtid_executed;

注意事项

使用GTID时需注意以下几点:

  • 不支持非事务性存储引擎(如MyISAM)跨语句更新,建议使用InnoDB
  • 某些SQL语句(如CREATE TABLE ... SELECT)在GTID模式下被禁止,需拆分为两步
  • 主从版本尽量保持一致,避免GTID解析兼容性问题
  • 定期清理binlog(使用PURGE BINARY LOGS),避免磁盘占用过多

基本上就这些。GTID让MySQL复制更健壮,只要配置得当,日常维护会省心很多。