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