Mysql

為什麼 MySQL 上沒有預設的混合模式複制

  • August 20, 2021

眾所周知,混合模式複制是從 MySQL 5.1.12 到 MySQL 5.1.28 的預設設置。但是,這已被恢復,目前,基於語句的複制是預設設置。

在聲明基於語句的複制是預設設置的公告中,Oracle聲稱這只是因為混合模式複制構成了一種行為變化,可能會讓一些使用者不知道。(另見錯誤 39812。)然而,MySQL 5.1 有許多行為變化,這是因為混合基複制的好處如此明顯(我相信每個 DBA 都遇到過複製失敗的情況,因為使用者送出了一個查詢沒有正確複製並導致他們的數據庫出現分歧),這似乎不是一個特別強烈的理由。

有人抱怨說混合複製“可以提供兩全其美,但需要測試”,但我們已經在 MySQL 5.1.61 上,希望現在所有的錯誤都已經解決。所以這讓我們很困惑。為什麼混合模式複制不是預設的?

我最近也問過自己這個問題。首先,我研究了為什麼預設情況下不啟用基於行的複制。顯然,基於行的複制通過可能寫入二進制日誌的數據量來創建磁碟上的 IO 應變的可能性。

毫不奇怪,這是MySQL 文件提到的基於行的複制的第一個缺點。再往下一點,另一個缺點是 MyISAM 的性能潛在問題:

對於使用 MyISAM 儲存引擎的表,在將 INSERT 語句作為基於行的事件應用到二進制日誌時,比將它們作為語句應用時,在從屬上需要更強的鎖定。這意味著在使用基於行的複制時,不支持對 MyISAM 表的並發插入。

MyISAM 是 5.1 系列的預設引擎。直到 5.5 才預設使用 InnoDB。對我來說,這種對 MyISAM 的複制影響是預設情況下不使用 RBR 的一個重要理由。

但是您的問題圍繞MIXED 格式。在 MIXED 格式下,預設使用基於語句的複制,直到呼叫需要基於行的複制的語句。上面的連結很好地概述了在某些情況下(安全、不安全、行注入)執行的日誌記錄類型。

我認為有太多的潛在情況會導致複製切換到基於行的複制,從而在非最佳硬體上導致上面提到的一些性能問題。讓我們面對現實吧,MySQL 有大量使用者在非最佳硬體上執行它。

這種情況最讓我印象深刻:

如果語句按行記錄並且執行該語句的會話有任何臨時表,則按行記錄將用於所有後續語句(訪問臨時表的語句除外),直到刪除該會話使用的所有臨時表。

請注意,在基於行的日誌記錄中涉及臨時表的所有語句都被認為是不安全的,因此這可能會導致您的複制設置出現問題。

歸根結底,我認為將 STATEMENT 設為預設設置是一個好主意,因為必須做出有意識的、受過教育的決定才能切換到 MIXED。

根據目前文件,SBR 是 MySQL 5.5 的預設設置

在問題中,它說It is well known that mixed-mode replication was default from MySQL 5.1.12 to MySQL 5.1.28.

然而,值得注意的是

鑑於此,從技術上講,MySQL 5.1 的早期 GA 版本始終預設為 SBR。此外

  • 甲骨文於 2009 年 4 月 20 日收購了 Sun,早於甲骨文參與 MySQL 5.1 rc 版本
  • Sun 於 2008 年 1 月收購 MySQL,早於 Sun 最初參與 MySQL 5.1 rc 版本

所以,正確的問題是Why did MySQL AB not incorporate mixed-mode replication in MySQL 5.1?

恕我直言,我可以很容易地看到這種情況。甲骨文自然會採取不干涉的方式來描述問題並承擔任何責任。雖然甲骨文一直在其旗艦數據庫中使用 RBR,但我不認為甲骨文會介入以使 RBR 在 MySQL 中引起關注。

從另一個角度來看,由於 MySQL 可以很容易地在商用硬體上執行,所以 SBR 就綽綽有餘了。一個人也不會被快速增長的二進制日誌打死。具有高級複製設置的大型 MySQL 安裝將更適合 RBR。

解決使用 SBR、RBR 和 Mixed 的問題應該像清除所有中繼日誌並在任何給定的 Slave 上從頭開始複製一樣簡單

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