MySQL二進位日誌恢複資料報錯:@@GLOBAL.GTID_MODE = OFF.
解決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模式,上述不支援的語句將會返回錯誤。