MySQL關於GTID的一些功能限制


參考文獻:https://www.cnblogs.com/luckcs/articles/6295992.html

更新非事務引擎:

  1. Case重現:
    master:對一個innodb表做一個多sql更新的事物,效果是產生一個GTID。
    slave:對應的表是MYISAM引擎,執行這個GTID的第一個語句后就會報錯,因為非事務引擎一個sql就是一個事務。

  2. 錯誤編號:
    last_Errno:1756

  3. 異常恢復方案:
    (1)、簡單的stop slave; start slave;就能夠忽略錯誤。但是這個時候主從的一致性已經出現問題。需要手工的把slave差的數據補上。
    (2)、首先將引擎調整為一樣的,slave也改為事務引擎。

create table ....select statements

  1. case重現:
    master:直接執行一個create table select * from table;的sql

  2. 報錯:
    error 1786: Statement violates GTID consistency: CREATE TABLE ... SELECT.

  3. 原理:
    由於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

  1. update t1,t2 set t1.id=1000,t2.id=1000 where t1.id=t2.id;

  2. 報錯:1785

  3. 原理和第二個相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM