首页 > 数据库 > MySQL > 正文

解决mysql二进制日志恢复数据报错

2024-07-24 12:35:50
字体:
来源:转载
供稿:网友
  解决mysql利用二进制日志恢复数据报错:ERROR 1781 (HY000) at line 16: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.
 
  工作中,运用二进制日志,帮开发的同事恢复数据时,出现了报错告警:
 
  [root@localhost tmp]# mysqlbinlog --no-defaults mysql-bin.000614|mysql -uroot -p
  Enter password:
  ERROR 1781 (HY000) at line 16: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.
  [root@localhost tmp]# mysqlbinlog --no-defaults mysql-bin.000614|mysql -uroot -p
  Enter password:
  [root@localhost tmp]# echo $?
  0
  服务器相关环境参数:
 
  服务器系统:CentOS Linux release 7.3.1611 (Core)
 
  MySQL版本:
 
  mysql> select version();
  +-----------+
  | version() |
  +-----------+
  | 5.7.13    |
  +-----------+
  1 row in set (0.00 sec)
  解决办法:
 
  配置gtid选项
 
  配置前:
 
  mysql> show global variables like 'gtid_mode';
  ERROR 2006 (HY000): MySQL server has gone away
  No connection. Trying to reconnect...
  Connection id:    24
  Current database: gold
  +---------------+-------+
  | Variable_name | Value |
  +---------------+-------+
  | gtid_mode     | OFF   |
  +---------------+-------+
  1 row in set (0.10 sec)
  配置后:
 
  mysql> set @@GLOBAL.GTID_MODE = on;
  ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
  mysql> set @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
  mysql> show global variables like 'gtid_mode';
  +---------------+----------------+
  | Variable_name | Value          |
  +---------------+----------------+
  | gtid_mode     | OFF_PERMISSIVE |
  +---------------+----------------+
  1 row in set (0.00 sec)
   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模式,上述不支持的语句将会返回错误。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表