參考文獻:https://www.cnblogs.com/luckcs/articles/6295992.html
更新非事務引擎:
-
Case重現:
master:對一個innodb表做一個多sql更新的事物,效果是產生一個GTID。
slave:對應的表是MYISAM引擎,執行這個GTID的第一個語句后就會報錯,因為非事務引擎一個sql就是一個事務。 -
錯誤編號:
last_Errno:1756 -
異常恢復方案:
(1)、簡單的stop slave; start slave;就能夠忽略錯誤。但是這個時候主從的一致性已經出現問題。需要手工的把slave差的數據補上。
(2)、首先將引擎調整為一樣的,slave也改為事務引擎。
create table ....select statements
-
case重現:
master:直接執行一個create table select * from table;的sql -
報錯:
error 1786: Statement violates GTID consistency: CREATE TABLE ... SELECT. -
原理:
由於create table ...select語句會生成兩個sql,一個是DDL創建表SQL,一個是insert into 插入數據的sql。由於DDL會導致自動提交,所以這個sql至少需要兩個GTID,但是GTID模式下,只能給這個sql生成一個GTID,如果強制執行會導致和上面更新非事務引擎一樣的結果。
create table xxx as select 的方式會被拆分成兩部分。
create table xxxx like data_mgr;
insert into xxxx select * from data_mgr;
一個sql同時操作innodb引擎和myisam引擎:
case重現:t1表是innodb,t2表是myisam
-
update t1,t2 set t1.id=1000,t2.id=1000 where t1.id=t2.id;
-
報錯:1785
-
原理和第二個相同。