mysql从库在开启GTID时跳过错误的方法

本文介绍了解决MySQL在GTID模式下遇到特定错误时的处理方式,提供了跳过指定GTID的方法,并展示了如何通过解析二进制日志来确定需要跳过的GTID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

未开启GTID的处理:

set global sql_slave_skip_counter=1;

如果开启了GTID,则会报错:

ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction

处理参考:

1、解析二进制日志,找出gtid点
mysqlbinlog --no-defaults cdbxxxxx_bin_mysqlbin.000002 > cdb002bin.sql
或通过下述sql查出:
select * from performance_schema.replication_applier_status_by_worker where LAST_ERROR_NUMBER=1050;
1050为show SLAVE STATUS ; 查出的Last_Errno;

跳过报错gtid点,如果有多个,重复执行,注意不要搞错了!!
stop slave ;
set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298637';
begin;
commit;
set @@session.gtid_next=automatic;
start slave;

原创总结,多次实用验证,没毛病!


如果需要一次跳过多条,通过binlog找出需要跳过的gtid,批量执行:

set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298637';begin;commit;
set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298638';begin;commit;
set @@session.gtid_next='7661d18c-8e10-11e7-8e9c-6c0b84d5a868:298639';begin;commit;
......
然后再
set @@session.gtid_next=automatic;
start slave;

即可。



<think>我们正在讨论MySQL主从复制中的GTID配置。根据引用内容,GTID(全局事务标识符)是MySQL复制中用于跟踪事务的唯一标识。GTID主从复制相比传统主从复制更易于管理和维护,因为每个事务都有全局唯一的ID。 步骤概述: 1. 配置主(Master)的my.cnf文件,开启GTID模式。 2. 配置从Slave)的my.cnf文件,同样开启GTID模式。 3. 在主上创建复制用户并授权。 4. 在从上配置指向主,并启动复制。 详细步骤: 1. 主配置(Master): 编辑主的配置文件(通常为/etc/my.cnf或/etc/mysql/my.cnf),在[mysqld]部分添加以下内容: ``` [mysqld] server_id=1 # 设置服务器唯一ID,主从不能相同 log_bin=mysql-bin # 开启二进制日志 gtid_mode=ON # 开启GTID模式 enforce_gtid_consistency=ON # 强制GTID一致性 ``` 2. 重启主MySQL服务使配置生效: ```bash systemctl restart mysqld ``` 3. 在主上创建复制用户并授权: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` 4. 从配置(Slave): 编辑从的配置文件,在[mysqld]部分添加: ``` [mysqld] server_id=2 # 设置不同的服务器ID log_bin=mysql-bin # 开启二进制日志(可选,但建议开启gtid_mode=ON enforce_gtid_consistency=ON read_only=ON # 设置从为只读(推荐) ``` 5. 重启从MySQL服务: ```bash systemctl restart mysqld ``` 6. 在从上配置主信息并启动复制: 使用以下命令连接主并启动复制: ```sql CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='repl', MASTER_PASSWORD='your_password', MASTER_AUTO_POSITION=1; # 使用GTID自动定位,无需指定binlog文件和位置 START SLAVE; ``` 7. 检查从复制状态: ```sql SHOW SLAVE STATUS\G ``` 查看输出中的`Slave_IO_Running`和`Slave_SQL_Running`是否为`Yes`,以及是否有错误信息。 注意:在配置GTID主从之前,如果主中已有数据,需要先备份主数据并恢复到从,以保证数据一致性。可以使用mysqldump或xtrabackup等工具进行备份恢复,并在备份加上`--set-gtid-purged=ON`选项。 引用[^1]中提到了在从数据中查看数据是否同步,可以通过在从上查询数据来验证同步情况。 引用[^3]提供了主配置的示例,其中特别强调了开启GTID的两个参数:`gtid_mode=ON`和`enforce-gtid-consistency=ON`(注意在配置文件中应使用下划线,但MySQL也接受减号,不过通常使用下划线)。 引用[^2]概述了主从复制的作用、形式和原理,以及GTID的概念和组成,并简要提到了配置步骤。 以上步骤即为配置MySQL GTID主从复制的基本方法。 相关问题: 1. 如何验证GTID主从复制是否正常工作? 2. 如果主已有数据,如何初始化从? 3. GTID主从复制相比传统主从复制有哪些优势?</think>### MySQL主从复制配置GTID方法和步骤 根据引用内容[^1][^2][^3],GTID(Global Transaction Identifier)主从复制通过全局唯一事务ID简化复制管理,配置步骤如下: #### 一、主配置 1. **修改配置文件**(如`/etc/my.cnf`): ```ini [mysqld] server_id=10 # 唯一ID(主从不能重复) log_bin=mysql-bin # 启用二进制日志 gtid_mode=ON # 开启GTID模式[^3] enforce_gtid_consistency=ON # 强制GTID一致性[^3] binlog_format=ROW # 推荐使用ROW格式 ``` 2. **重启MySQL服务**: ```bash systemctl restart mysqld ``` 3. **创建复制用户**: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` #### 二、从配置 1. **修改配置文件**: ```ini [mysqld] server_id=20 # 不同于主的ID relay_log=mysql-relay-bin read_only=ON # 设置只读[^2] gtid_mode=ON enforce_gtid_consistency=ON ``` 2. **重启MySQL服务**: ```bash systemctl restart mysqld ``` #### 三、初始化数据同步 1. **主备份**: ```bash mysqldump --all-databases --master-data -u root -p > db_backup.sql ``` 2. **导入从**: ```bash mysql -u root -p < db_backup.sql ``` #### 四、启动GTID复制 在从执行: ```sql CHANGE MASTER TO MASTER_HOST='主IP', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_AUTO_POSITION=1; # 关键!启用GTID自动定位[^1] START SLAVE; ``` #### 五、验证复制状态 ```sql SHOW SLAVE STATUS\G ``` 检查关键指标: - `Slave_IO_Running: Yes` - `Slave_SQL_Running: Yes` - `Retrieved_Gtid_Set`(已接收事务) - `Executed_Gtid_Set`(已执行事务) #### 六、测试数据同步 在主插入数据: ```sql INSERT INTO runtime.student(name) VALUES ('test_gtid'); ``` 在从查询验证(如引用[^1]示例): ```sql SELECT * FROM runtime.student; ``` ### 关键注意事项 1. **GTID组成**:`server_uuid:事务ID`[^2] 2. **一致性要求**:所有节点需同启用`gtid_mode`和`enforce_gtid_consistency` 3. **故障处理**:出现复制错误,可通过`SET GLOBAL gtid_purged`跳过事务 > 配置成功后,GTID自动跟踪事务位置,无需手动管理binlog文件和位置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值