Mysql

是什麼影響了 MySQL UPDATE 的事務大小?

  • November 15, 2021

背景

我們在一些 Java 服務後面執行 MySQL 8 INNODB 集群。我們收到來自應用程序的錯誤,因為我們超出了組複製事務大小限制(“執行複制掛鉤’before_commit’時觀察者出錯”)。當時我們的限制設置為 150Mb。

問題

查看所涉及的交易,我不明白它如何涉及 150Mb 之類的東西。

它涉及對兩個表的更新

update my_table mt 
inner join my_table_aud mta on mt.id = mta.id 
 set mt.boolean_column_1 = TRUE, 
     mt.boolean_column_2 = TRUE, 
     mt.varchar_column = coalesce(mt.varchar_column, ?2), 
     mta.varchar_column = coalesce(mta.varchar_column, ?2) 
where mt.boolean_column_1 = FALSE 
AND mta.rev <= ?1

其中涉及 my_table 中大約 100 行,my_table_aud 中可能有 200 行。加上另一個簡單的插入到不同的表。varchar 列更新了大約 10 個字節的數據。

但是,UPDATE 中涉及的兩個表都具有不同的 longtext 列,該列未更新。在這些列中更新的每行平均可能有 1MB 的文本。

我能想到的對我們超出事務限制的唯一解釋是,長文本列中的文本會影響事務大小,即使更新中沒有引用它們。

我搜尋了有關影響 MySQL 中事務的事務大小的文件,但找不到任何有用的東西。

請有人可以幫助我了解在這種情況下如何超出交易大小限制?

事務大小不僅僅基於您實際更改的數據量,而是在您進行更改之前的行的整個狀態被保留以防回滾,因此整個行基本上被複製。從進一步的研究看來,甚至整個行頁面都被複製到回滾段,因此根據包含您要更新的行的頁面數量,很容易在事務中生成更多數據然後什麼你實際上是在更新。

引用自:https://dba.stackexchange.com/questions/283305