解決mysql二進制日誌恢復數據報錯:@@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模式,上述不支持的語句將會返回錯誤。
解決mysql二進制日誌恢復數據報錯:@@GLOBAL.GTID_MODE = OFF.