在 MySQL 8.4 中,當 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%
來防止它們被複製。