中繼日誌如同二進位日誌,包含一組編號檔案,其中包含描述資料庫變更的事件,以及一個索引檔案,其中包含所有已使用中繼日誌檔案的名稱。中繼日誌檔案的預設位置是資料目錄。
術語 「中繼日誌檔案」 通常表示包含資料庫事件的個別編號檔案。術語 「中繼日誌」 統稱表示一組編號的中繼日誌檔案加上索引檔案。
中繼日誌檔案的格式與二進位日誌檔案相同,可以使用 mysqlbinlog 讀取(請參閱 第 6.6.9 節, 「mysqlbinlog — 用於處理二進位日誌檔案的工具」)。如果正在使用二進位日誌交易壓縮,則寫入中繼日誌的交易酬載會以與二進位日誌相同的方式壓縮。有關二進位日誌交易壓縮的詳細資訊,請參閱 第 7.4.4.5 節, 「二進位日誌交易壓縮」。
對於預設複製通道,中繼日誌檔案名稱具有預設格式
,其中 host_name
-relay-bin.nnnnnn
host_name
是複本伺服器主機的名稱,而 nnnnnn
是序號。會使用連續序號建立連續的中繼日誌檔案,從 000001
開始。對於非預設複製通道,預設基本名稱是
,其中 host_name
-relay-bin-channel
channel
是記錄在中繼日誌中的複製通道名稱。
複本使用索引檔案來追蹤目前正在使用的中繼日誌檔案。預設中繼日誌索引檔案名稱對於預設通道為
,對於非預設複製通道為 host_name
-relay-bin.index
。host_name
-relay-bin-channel
.index
可以使用 relay_log
和 relay_log_index
系統變數分別覆寫預設的中繼日誌檔案和中繼日誌索引檔案名稱和位置(請參閱 第 19.1.6 節, 「複製與二進位日誌選項與變數」)。
如果複本使用預設的基於主機的 relay log 檔案名稱,在設定複寫之後變更複本的主機名稱可能會導致複寫失敗,並出現 Failed to open the relay log 和 Could not find target log during relay log initialization 的錯誤。這是一個已知的問題(請參閱 Bug #2122)。如果您預期複本的主機名稱將來可能會變更(例如,如果在複本上設定網路,使其主機名稱可以使用 DHCP 修改),您可以使用 relay_log
和 relay_log_index
系統變數,在最初設定複本時明確指定 relay log 檔案名稱,以完全避免此問題。這會使名稱與伺服器主機名稱的變更無關。
如果在複寫已經開始後遇到此問題,一種解決方法是停止複本伺服器,將舊的 relay log 索引檔案的內容添加到新的索引檔案中,然後重新啟動複本。在 Unix 系統上,可以這樣做:
$> cat new_relay_log_name.index >> old_relay_log_name.index
$> mv old_relay_log_name.index new_relay_log_name.index
複本伺服器會在下列情況下建立新的 relay log 檔案:
每次複寫 I/O (接收器) 執行緒啟動時。
當日誌被刷新時(例如,使用
FLUSH LOGS
或 mysqladmin flush-logs)。當目前的 relay log 檔案大小變得太大時,其判斷方式如下:
如果
max_relay_log_size
的值大於 0,則該值為最大的 relay log 檔案大小。如果
max_relay_log_size
的值為 0,則由max_binlog_size
決定最大的 relay log 檔案大小。
複寫 SQL (套用) 執行緒會在執行完檔案中的所有事件且不再需要該檔案後,自動刪除每個 relay log 檔案。沒有明確的機制來刪除 relay log,因為複寫 SQL 執行緒會負責執行此操作。然而,FLUSH LOGS
會輪替 relay log,這會影響複寫 SQL 執行緒刪除它們的時間。