只有在符合下列兩個條件之一時,複本才會檢查並評估表格選項
找不到相符的資料庫選項。
找到一個或多個資料庫選項,並根據上一節中描述的規則進行評估,以得出 「執行」 條件(請參閱 第 19.2.5.1 節,「資料庫層級複寫和二進制記錄選項的評估」)。
首先,作為初步條件,複本會檢查是否已啟用基於陳述式的複寫。如果是,且陳述式發生在預存函數中,則複本會執行陳述式並結束。如果已啟用基於列的複寫,則複本不知道陳述式是否發生在來源上的預存函數中,因此此條件不適用。
對於基於陳述式的複寫,複寫事件代表陳述式(構成給定事件的所有變更都與單一 SQL 陳述式相關聯);對於基於列的複寫,每個事件代表單一表格列中的變更(因此,單一陳述式(例如 UPDATE mytable SET mycol = 1
)可能會產生許多基於列的事件)。從事件的角度來看,檢查表格選項的過程對於基於列的複寫和基於陳述式的複寫是相同的。
到達此處後,如果沒有表格選項,則複本會簡單執行所有事件。如果有任何 --replicate-do-table
或 --replicate-wild-do-table
選項,則事件必須符合其中一個選項才能執行;否則,將會忽略。如果有任何 --replicate-ignore-table
或 --replicate-wild-ignore-table
選項,則會執行所有事件,但符合任何這些選項的事件除外。
表格層級複寫篩選器僅適用於查詢中明確提及和操作的表格。它們不適用於查詢隱含更新的表格。例如,GRANT
陳述式會更新 mysql.user
系統表格,但未提及該表格,因此不受指定 mysql.%
作為萬用字元模式的篩選器影響。
下列步驟更詳細地描述此評估。起點是資料庫層級選項評估的結尾,如 第 19.2.5.1 節,「資料庫層級複寫和二進制記錄選項的評估」中所述。
是否有任何表格複寫選項?
是。繼續步驟 2。
否。執行更新並結束。
使用哪種記錄格式?
STATEMENT。針對每個執行更新的陳述式執行剩餘步驟。
列 (ROW). 針對資料表列的每個更新執行剩餘步驟。
是否有任何
--replicate-do-table
選項?是 (Yes). 此資料表是否符合其中任何一個選項?
是 (Yes). 執行更新並結束。
否 (No). 繼續執行步驟 4。
否 (No). 繼續執行步驟 4。
是否有任何
--replicate-ignore-table
選項?是 (Yes). 此資料表是否符合其中任何一個選項?
是 (Yes). 忽略更新並結束。
否 (No). 繼續執行步驟 5。
否 (No). 繼續執行步驟 5。
是否有任何
--replicate-wild-do-table
選項?是 (Yes). 此資料表是否符合其中任何一個選項?
是 (Yes). 執行更新並結束。
否 (No). 繼續執行步驟 6。
否 (No). 繼續執行步驟 6。
是否有任何
--replicate-wild-ignore-table
選項?是 (Yes). 此資料表是否符合其中任何一個選項?
是 (Yes). 忽略更新並結束。
否 (No). 繼續執行步驟 7。
否 (No). 繼續執行步驟 7。
是否有其他要測試的資料表?
是 (Yes). 回到步驟 3。
否 (No). 繼續執行步驟 8。
是否有任何
--replicate-do-table
或--replicate-wild-do-table
選項?是 (Yes). 忽略更新並結束。
否。執行更新並結束。
如果單一 SQL 陳述式同時操作以下兩種資料表,則基於陳述式的複製會停止:一種是包含在 --replicate-do-table
或 --replicate-wild-do-table
選項中的資料表,另一種是被 --replicate-ignore-table
或 --replicate-wild-ignore-table
選項忽略的資料表。副本必須執行或忽略完整的陳述式(構成複製事件),且在邏輯上無法同時執行這兩者。這也適用於針對 DDL 陳述式的基於列的複製,因為 DDL 陳述式始終以陳述式形式記錄,而無論有效的記錄格式為何。唯一可以更新包含和忽略的資料表,且仍能成功複製的陳述式類型是使用 binlog_format=ROW
記錄的 DML 陳述式。