僅當以下兩種情況之一為真時,副本才會檢查並評估表格選項
未找到相符的資料庫選項。
找到一個或多個資料庫選項,並根據上一節描述的規則評估為「執行」條件(請參閱第 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
選項?是。 資料表是否符合任何一個?
是。 執行更新並結束。
否。 繼續執行步驟 4。
否。 繼續執行步驟 4。
是否有任何
--replicate-ignore-table
選項?是。 資料表是否符合任何一個?
是。 忽略更新並結束。
否。 繼續執行步驟 5。
否。 繼續執行步驟 5。
是否有任何
--replicate-wild-do-table
選項?是。 資料表是否符合任何一個?
是。 執行更新並結束。
否。 繼續執行步驟 6。
否。 繼續執行步驟 6。
是否有任何
--replicate-wild-ignore-table
選項?是。 資料表是否符合任何一個?
是。 忽略更新並結束。
否。 繼續執行步驟 7。
否。 繼續執行步驟 7。
是否有另一個資料表需要測試?
是。 回到步驟 3。
否。 繼續執行步驟 8。
是否有任何
--replicate-do-table
或--replicate-wild-do-table
選項?是。 忽略更新並結束。
否。 執行更新並結束。
如果單個 SQL 語句同時操作由 --replicate-do-table
或 --replicate-wild-do-table
選項包含的資料表,以及由 --replicate-ignore-table
或 --replicate-wild-ignore-table
選項忽略的另一個資料表時,基於語句的複製會停止。從機必須執行或忽略整個語句(構成一個複製事件),但它在邏輯上無法這樣做。這也適用於 DDL 語句的基於列的複製,因為 DDL 語句始終以語句的形式記錄,而與生效的日誌格式無關。唯一可以更新包含的資料表和忽略的資料表,並仍能成功複製的語句類型,是用 binlog_format=ROW
記錄的 DML 語句。