天天看點

17.1.2.2 Usage of Row-Based Logging and Replication

17.1.2.2 Usage of Row-Based Logging and Replication 基于行複制的使用

MySQL 使用基于語句的記錄(SBL),基于記錄的記錄(RBL) 或則混合記錄。

這種類型的binary log 影響日志的大小和效率。是以選擇在基于行複制或者基于語句的複制依賴你的應用

和環境。本章節描述基于行的日志,并讨論了在複制中使用它的一些最佳做法。

有關更多的資訊,請參見Section 17.1.2, “Replication Formats”, and Section 17.1.2.1, “Advantages and

Disadvantages of Statement-Based and Row-Based Replication”.

基于行記錄的臨時表, 在Section 17.4.1.23指出,複制和臨時表,

臨時表不會被複制當使用基于行的格式。 當使用混合格式記錄時, “safe” 語句使用臨時表

被記錄 使用基于語句的格式。更多的資訊,請參見第17.1.2.1,”優勢和基礎,基于行的複制”語句的缺點。

臨時表不會被複制當使用基于行格式的複制,因為沒有必要.此外,

因為臨時表是隻讀的 ,是以很少有負載它們,即使使用基于語句的格式。

在MySQL 5.6,你可以切換從基于語句的到基于行記錄模式的切換, 即使當臨時表被建立。

然而,當使用基于行的格式,MySQL server 不能确定記錄模式 是否有效,當一個給定的臨時表被建立。

由于這個原因,server 在這種情況下記錄一個DROP TEMPORARY TABLE IF EXISTS 語句對于每個臨時表

在MySQL 5.6.6 和早期版本, –disable-gtid-unsafe-statements 選項導緻任何非事務的DML語句涉及臨時表

抛出一個錯誤當使用基于行的記錄,事實上,它們是不會寫入binary log.在MySQL 5.6.7 以後,

這樣的語句允許當binlog_format=ROW,對于任何被影響的非事務表。

RBL和同步非事務表, 當很多的記錄受到影響,改變的組被分成幾個events, 當語句送出時,

所有這些evnets被寫入到binary log. 當在slave上執行時,一個table lock 是在所有的表上涉及,

然後行記錄被應用于批處理模式中。(這個可能或者不能生效,依賴用于slave拷貝的表的引擎)

延遲和binary log size,RBL 寫改變對于每個行到binary log,是以它的大小可以增加的很怪。

這個會顯著的增加slave上比對master 更改需要的時間。 你應該意識到 潛在的延遲。

讀取binary log,mysqlbinlog 顯示基于行的events 在binary log 使用BINLOG語句。

這個語句顯示了 一個基于64編碼的字元竄作為events,其含義是不明顯的。

當調用 –base64-output=DECODE-ROWS and –verbose 選項, mysqlbinlog 格式binary log的内容對人類可讀。

當binary log events 被寫基于行的格式,你從複制或者資料庫failure 需要讀取或者恢複。

Binary log 執行錯誤和 slave_exec_mode.如果 slave_exec_mode 是幂等的,從RBL應用改變失敗

因為原始的記錄不能被找到 不觸發一個錯誤或者導緻複制失敗 這意味着 它是可能的 更新沒有被應用到slave,

是以master 和slave 不再是同步的。

注意:

slave_exec_mode=IDEMPOTENT 通常隻用于某種循環複制或者多個master的複制在MySQL Cluster裡

缺乏binary log 的checksums,RBL 不使用checksums,是以網絡,磁盤,和其他錯誤不可能确定

當處理binary log時。 為了確定資料是傳輸的 在沒有網絡腐敗使用SSL用于複制連接配接。

不支援基于server ID的過濾,在MySQL 5.6,你可以基于server id過濾 通過使用IGNORE_SERVER_IDS

選項來 CHANGE MASTER TO statement.這個選項和基于語句和基于行格式一起工作。

另外的方式是過濾出的變化在一些slave上來使用where 子句 包括@@server_id <> id_value關系的子句