在 MySQL 9.0 中,當 binlog_format
設定為 ROW
或 MIXED
時,僅使用暫存表格的陳述式不會記錄在來源上,因此不會複寫暫存表格。混合使用暫存表格和非暫存表格的陳述式只會記錄非暫存表格的操作,而不會記錄暫存表格的操作。這表示複本上永遠不會有任何暫存表格會在複本發生意外關機時遺失。如需關於基於列的複寫和暫存表格的詳細資訊,請參閱暫存表格的基於列記錄。
當 binlog_format
設定為 STATEMENT
時,暫存表格上的操作會記錄在來源上,並複寫到複本上,前提是涉及暫存表格的陳述式可以使用基於陳述式的格式安全記錄。在這種情況下,複本上遺失複寫的暫存表格可能會是一個問題。在基於陳述式的複寫模式下,當伺服器上正在使用 GTID 時(也就是說,當 enforce_gtid_consistency
系統變數設定為 ON
時),CREATE TEMPORARY TABLE
和 DROP TEMPORARY TABLE
陳述式無法在交易、程序、函數或觸發程序內使用。當正在使用 GTID 時,且設定了 autocommit=1
時,則可以在這些內容之外使用。
由於基於列或混合式複寫模式與基於語句的複寫模式在臨時表格的行為上存在差異,如果變更套用於包含任何開啟的臨時表格的內容 (全域或工作階段),則您無法在執行期間切換複寫格式。如需更多詳細資訊,請參閱 binlog_format
選項的說明。
使用臨時表格時的安全複本關閉。在基於語句的複寫模式中,臨時表格會被複寫,但如果您停止複本伺服器 (不僅是複寫執行緒) 且您有已複寫的臨時表格,這些表格開啟以供尚未在複本上執行的更新使用,則此情況除外。如果您停止複本伺服器,當複本重新啟動時,這些更新所需的臨時表格將不再可用。為避免此問題,請勿在複本開啟臨時表格時關閉複本。請改為使用以下程序
發出
STOP REPLICA SQL_THREAD
陳述式。使用
SHOW STATUS
來檢查Replica_open_temp_tables
狀態變數的值。如果值不是 0,請使用
START REPLICA SQL_THREAD
重新啟動複寫 SQL 執行緒,並稍後重複此程序。當值為 0 時,發出 mysqladmin shutdown 命令以停止複本。
臨時表格和複寫選項。依預設,使用基於語句的複寫時,所有臨時表格都會被複寫;無論是否有任何相符的 --replicate-do-db
、 --replicate-do-table
或 --replicate-wild-do-table
選項生效,都會如此。但是,--replicate-ignore-table
和 --replicate-wild-ignore-table
選項則適用於臨時表格。例外情況是,為了在工作階段結束時正確移除臨時表格,複本始終會複寫 DROP TEMPORARY TABLE IF EXISTS
陳述式,無論指定表格是否通常會套用任何排除規則。
當使用基於語句的複寫時,建議的做法是指定一個前置詞,專用於命名您不希望複寫的臨時表格,然後使用 --replicate-wild-ignore-table
選項來比對該前置詞。例如,您可以將所有這類表格的名稱以 norep
開頭 (例如 norepmytable
、 norepyourtable
等),然後使用 --replicate-wild-ignore-table=norep%
來防止它們被複寫。