1. 程式人生 > >解決mysql二進制日誌恢復數據報錯:@@GLOBAL.GTID_MODE = OFF.

解決mysql二進制日誌恢復數據報錯:@@GLOBAL.GTID_MODE = OFF.

實例 多個 ons bar $? on() false ria echo

解決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模式,上述不支持的語句將會返回錯誤。


解決mysql二進制日誌恢復數據報錯:@@GLOBAL.GTID_MODE = OFF.