副本伺服器會建立兩個複製中繼資料儲存庫,即連線中繼資料儲存庫和套用程式中繼資料儲存庫。複製中繼資料儲存庫在副本伺服器關閉後仍然存在。如果正在使用基於二進制日誌檔位置的複製,則當副本重新啟動時,它會讀取這兩個儲存庫,以判斷先前從來源讀取二進制日誌和處理其自身中繼日誌的進度。如果正在使用基於 GTID 的複製,則副本不會將複製中繼資料儲存庫用於該目的,但確實需要它們來儲存其中包含的其他中繼資料。
副本的連線中繼資料儲存庫包含複製 I/O(接收器)執行緒需要連線到複製來源伺服器並從來源的二進制日誌中擷取交易的資訊。此儲存庫中的中繼資料包含連線設定、複製使用者帳戶詳細資訊、連線的 SSL 設定,以及複製接收器執行緒目前正在從來源二進制日誌中讀取的檔案名稱和位置。
副本的套用程式中繼資料儲存庫包含複製 SQL(套用程式)執行緒需要讀取和套用副本中繼日誌中交易的資訊。此儲存庫中的中繼資料包含複製套用程式執行緒已在其中執行中繼日誌中交易的檔案名稱和位置,以及來源二進制日誌中的等效位置。它還包含套用交易流程的中繼資料,例如工作執行緒的數量以及通道的
PRIVILEGE_CHECKS_USER
帳戶。
連線中繼資料儲存庫會寫入 mysql
系統綱要中的 slave_master_info
表格,而套用程式中繼資料儲存庫會寫入 mysql
系統綱要中的 slave_relay_log_info
表格。如果 mysqld 無法初始化複寫中繼資料儲存庫的表格,則會發出警告訊息,但允許複本繼續啟動。這種情況最有可能發生在從不支援使用表格來儲存中繼資料的 MySQL 版本升級到支援的版本時。
請勿嘗試手動更新或插入
mysql.slave_master_info
或mysql.slave_relay_log_info
表格中的列。這樣做可能會導致未定義的行為,且不受支援。在複寫進行期間,不允許執行任何需要在slave_master_info
和slave_relay_log_info
表格上取得寫入鎖定的語句(但允許隨時執行僅執行讀取的語句)。連線中繼資料儲存庫表格
mysql.slave_master_info
的存取權限應限制為資料庫管理員,因為其中包含連線到來源的複寫使用者帳戶名稱和密碼。使用受限的存取模式來保護包含此表格的資料庫備份。您可以從連線中繼資料儲存庫中清除複寫使用者帳戶憑證,而改為始終使用START REPLICA
語句來啟動複寫通道。這種方法表示複寫通道總是需要操作員介入才能重新啟動,但帳戶名稱和密碼不會記錄在複寫中繼資料儲存庫中。
RESET REPLICA
會清除複寫中繼資料儲存庫中的資料,但複寫連線參數除外(取決於 MySQL 伺服器版本)。如需詳細資訊,請參閱 RESET REPLICA
的說明。
您可以設定 CHANGE REPLICATION SOURCE TO
語句的 GTID_ONLY
選項,以停止複寫通道將檔案名稱和檔案位置保留在複寫中繼資料儲存庫中。這樣可以避免在基於 GTID 的複寫實際上不需要它們的情況下,對表格進行寫入和讀取。使用 GTID_ONLY
設定時,當複本在交易中將事件排入佇列並套用時,或當複寫執行緒停止和啟動時,不會更新連線中繼資料儲存庫和套用程式中繼資料儲存庫。檔案位置會在記憶體中追蹤,如果需要,可以使用 SHOW REPLICA STATUS
來檢視。複寫中繼資料儲存庫僅在以下情況下同步
當發出
CHANGE REPLICATION SOURCE TO
語句時。當發出
RESET REPLICA
語句時。RESET REPLICA ALL
會刪除而非更新儲存庫,因此它們會隱式同步。當初始化複寫通道時。
如果複寫中繼資料儲存庫從檔案移至表格。
將複寫中繼資料儲存庫建立為表格是預設值;使用檔案已棄用。
mysql.slave_master_info
和 mysql.slave_relay_log_info
表格是使用 InnoDB
交易式儲存引擎建立的。對套用程式中繼資料儲存庫表格的更新會與交易一起提交,這表示記錄在該儲存庫中的複本進度資訊始終與已套用到資料庫的內容一致,即使發生意外的伺服器停止事件也是如此。如需在複本上設定最能抵禦意外停止的設定組合的資訊,請參閱第 19.4.2 節「處理複本意外停止」。
當您備份複本的資料或傳輸其資料快照以建立新的複本時,請確保包含含有複寫中繼資料儲存庫的 mysql.slave_master_info
和 mysql.slave_relay_log_info
表格。對於複製操作,請注意,當複寫中繼資料儲存庫建立為表格時,它們會在複製操作期間複製到接收者,但是當它們建立為檔案時,則不會複製。當使用基於二進位記錄檔位置的複寫時,需要複寫中繼資料儲存庫才能在重新啟動還原、複製或複製的複本後恢復複寫。如果您沒有中繼記錄檔,但仍然有套用程式中繼資料儲存庫,您可以檢查它以判斷複寫 SQL 執行緒在來源的二進位記錄檔中執行了多遠。然後,您可以使用帶有 SOURCE_LOG_FILE
和 SOURCE_LOG_POS
選項的 CHANGE REPLICATION SOURCE TO
語句,告知複本從該點重新讀取來源的二進位記錄(前提是來源上仍然存在所需的二進位記錄)。
另一個額外的儲存庫,套用程式工作執行緒中繼資料儲存庫,主要是為內部使用而建立,並保存多執行緒複本上的工作執行緒的狀態資訊。套用程式工作執行緒中繼資料儲存庫包含每個工作執行緒的中繼記錄檔和來源的二進位記錄檔的名稱和位置。如果套用程式中繼資料儲存庫建立為表格(這是預設值),則套用程式工作執行緒中繼資料儲存庫會寫入 mysql.slave_worker_info
表格。如果套用程式中繼資料儲存庫寫入檔案,則套用程式工作執行緒中繼資料儲存庫會寫入 worker-relay-log.info
檔案。對於外部使用,工作執行緒的狀態資訊會在效能綱要 replication_applier_status_by_worker
表格中呈現。
複寫中繼資料儲存庫最初包含類似於 SHOW REPLICA STATUS
語句的輸出中顯示的資訊,該語句會在第 15.4.2 節「用於控制複本伺服器的 SQL 語句」中討論。自此之後,複寫中繼資料儲存庫中新增了 SHOW REPLICA STATUS
語句未顯示的進一步資訊。
對於連線中繼資料儲存庫,下表顯示 mysql.slave_master_info
表格中的欄、SHOW REPLICA STATUS
顯示的欄以及已棄用的 master.info
檔案中的行之間的對應關係。
slave_master_info 表格欄 |
SHOW REPLICA STATUS 欄 |
master.info 檔案行 |
說明 |
---|---|---|---|
Number_of_lines |
[無] | 1 | 表格中的欄數(或檔案中的行數) |
Master_log_name |
Source_Log_File |
2 | 目前從來源讀取的二進位記錄的名稱 |
Master_log_pos |
Read_Source_Log_Pos |
3 | 已從來源讀取的二進位記錄中的目前位置 |
Host |
Source_Host |
4 | 複寫來源伺服器的主機名稱 |
User_name |
Source_User |
5 | 用於連線到來源的複寫使用者帳戶名稱 |
User_password |
密碼(SHOW REPLICA STATUS 未顯示) |
6 | 用於連線到來源的複寫使用者帳戶密碼 |
Port |
Source_Port |
7 | 用於連線到複寫來源伺服器的網路連接埠 |
Connect_retry |
Connect_Retry |
8 | 複本在嘗試重新連線到來源之前等待的時間(以秒為單位) |
Enabled_ssl |
Source_SSL_Allowed |
9 | 複本是否支援 SSL 連線 |
Ssl_ca |
Source_SSL_CA_File |
10 | 用於憑證授權單位 (CA) 憑證的檔案 |
Ssl_capath |
Source_SSL_CA_Path |
11 | 憑證授權單位 (CA) 憑證的路徑 |
Ssl_cert |
Source_SSL_Cert |
12 | SSL 憑證檔案的名稱 |
Ssl_cipher |
Source_SSL_Cipher |
13 | SSL 連線交握中使用的可能密碼清單 |
Ssl_key |
Source_SSL_Key |
14 | SSL 金鑰檔案的名稱 |
Ssl_verify_server_cert |
Source_SSL_Verify_Server_Cert |
15 | 是否驗證伺服器憑證 |
Heartbeat |
[無] | 16 | 複寫活動訊號之間的間隔(以秒為單位) |
Bind |
Source_Bind |
17 | 複本的哪個網路介面應使用於連線到來源 |
Ignored_server_ids |
Replicate_Ignore_Server_Ids |
18 | 要忽略的伺服器 ID 清單。請注意,對於 Ignored_server_ids ,伺服器 ID 清單前面會加上要忽略的伺服器 ID 總數。 |
Uuid |
Source_UUID |
19 | 來源的唯一 ID |
Retry_count |
Source_Retry_Count |
20 | 允許的最大重新連線嘗試次數 |
Ssl_crl |
[無] | 21 | SSL 憑證撤銷清單檔案的路徑 |
Ssl_crlpath |
[無] | 22 | 包含 SSL 憑證撤銷清單檔案的目錄路徑 |
Enabled_auto_position |
Auto_position |
23 | 是否正在使用 GTID 自動定位 |
Channel_name |
Channel_name |
24 | 複寫通道的名稱 |
Tls_version |
Source_TLS_Version |
25 | 來源上的 TLS 版本 |
Public_key_path |
Source_public_key_path |
26 | RSA 公開金鑰檔案的名稱 |
Get_public_key |
Get_source_public_key |
27 | 是否從來源請求 RSA 公開金鑰 |
Network_namespace |
Network_namespace |
28 | 網路命名空間 |
Master_compression_algorithm |
[無] | 29 | 允許用於連線到來源的壓縮演算法 |
Master_zstd_compression_level |
[無] | 30 | zstd 壓縮層級 |
Tls_ciphersuites |
[無] | 31 | 允許用於 TLSv1.3 的密碼套件 |
Source_connection_auto_failover |
[無] | 32 | 是否啟動非同步連線容錯移轉機制 |
Gtid_only |
[無] | 33 | 通道是否僅使用 GTID 而不保留位置 |
對於套用程式中繼資料儲存庫,下表顯示 mysql.slave_relay_log_info
表格中的欄、SHOW REPLICA STATUS
顯示的欄以及已棄用的 relay-log.info
檔案中的行之間的對應關係。
slave_relay_log_info 表格欄 |
SHOW REPLICA STATUS 欄 |
relay-log.info 檔案中的行 |
說明 |
---|---|---|---|
Number_of_lines |
[無] | 1 | 表格中的欄數或檔案中的行數 |
Relay_log_name |
Relay_Log_File |
2 | 目前的中繼記錄檔的名稱 |
Relay_log_pos |
Relay_Log_Pos |
3 | 中繼記錄檔中的目前位置;已在複本資料庫上執行至此位置的事件 |
Master_log_name |
Relay_Source_Log_File |
4 | 從中讀取中繼記錄檔中的事件的來源二進位記錄檔的名稱 |
Master_log_pos |
Exec_Source_Log_Pos |
5 | 已在複本上執行的事件在來源二進位記錄檔中的等效位置 |
Sql_delay |
SQL_Delay |
6 | 複本必須延遲來源的秒數 |
Number_of_workers |
[無] | 7 | 用於平行套用複寫交易的工作執行緒數 |
Id |
[無] | 8 | 用於內部用途的 ID;目前此值永遠為 1 |
Channel_name |
Channel_name |
9 | 複寫通道的名稱 |
Privilege_checks_username |
[無] | 10 | 通道的 PRIVILEGE_CHECKS_USER 帳戶的使用者名稱 |
Privilege_checks_hostname |
[無] | 11 | 通道的 PRIVILEGE_CHECKS_USER 帳戶的主機名稱 |
Require_row_format |
[無] | 12 | 通道是否僅接受以列為基礎的事件 |
Require_table_primary_key_check |
[無] | 13 | 通道的策略,關於在 CREATE TABLE 和 ALTER TABLE 操作中,資料表是否必須具有主鍵 |
Assign_gtids_to_anonymous_transactions_type |
[無] | 14 | 如果通道使用副本的本機 UUID,為尚未具有 GTID 的複製交易指派 GTID,則此值為 LOCAL ;如果通道改為使用已手動設定的 UUID 來執行此操作,則該值為 UUID 。如果通道在這種情況下不指派 GTID,則該值為 OFF 。 |
Assign_gtids_to_anonymous_transactions_value |
[無] | 15 | 在指派給匿名交易的 GTID 中使用的 UUID |