@@GLOBAL.GTID_MODE = OFF 问题

在尝试使用mysqlbinlog进行增量恢复时遇到@@GLOBAL.GTID_MODE=OFF错误。解决方案涉及配置GTID选项。GTID是全局唯一事务ID,由UUID+TID组成,确保每个事务在MySQL实例上仅执行一次,提供更安全的复制和故障切换。然而,它不支持非事务引擎和特定SQL语句,并要求在同一复制组中所有实例统一GTID模式。开启或关闭GTID可能需要重启,并且不兼容非GTID模式的复制。

背景

mysql 用binlog文件进行增量恢复时

mysqlbinlog temp\mysql-bin.002559 --start-datetime="2020-04-29 00:29:30" --database=campus | mysql -uroot -p

提示报错:

ERROR 1781 (HY000) at line 14: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.

【解决方案】

配置gtid选项

配置前:

show global variables like 'gtid_mode';

配置后:

set @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

 

知识增加:

GTID相关知识:

GTID(GlobalTransaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

MySQL5.6增加了GTID复制。

一个事务对应一个唯一ID。

一个GTID在一个服务器上只会执行一次。

GTID是用来替代以前classic的复制方法。

 

优点:

相对于行复制来讲数据安全性更高;

故障切换更简单;

 

GTID的使用局限:

不支持非事务引擎(从库报错,stopslave; start slave; 忽略);

不支持create table … select 语句复制(主库直接报错);不支持sql_slave_skip_counter;

对于createtemporary table 和drop temporary table语句不支持;

不允许在一个SQL同时更新一个事务引擎和非事务引擎的表;

在一个复制组中,必须要求统一开启CTID或是关闭GTID;

开启DTID需要重启(5.7中可能不需要);

开启DTID后,就不在使用原来的传统的复制方式;

gtid和非gtid的mysql实例是不能复制数据的,要么都是gtid,要么都是普通的;

更新非事务引擎表,在同一事务中更新事务表与非事务表将导致多个GTIDs分配给同一事务;

临时表,事务内部不能执行创建删除临时表语句,但可以在事务外执行,但必须设置set autocommit = 1;

 

CREATE TABLE … SELECTstatements

不安全的基于语句复制,实际是两个独立的事件,一个用于建表,一个用于向新表插入源表数据。

 

不执行不支持的语句

启用--enforce-gtid-consistency选项启动GTID模式,上述不支持的语句将会返回错误。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值