您可以在不停止來源伺服器的情況下,將另一個副本新增至現有的複製設定。若要執行此動作,您可以透過複製現有副本的資料目錄來設定新的副本,並為新的副本提供不同的伺服器 ID (使用者指定) 和伺服器 UUID (在啟動時產生)。
如果您要複製以建立新副本的複製來源伺服器或現有副本具有任何排程事件,請確保在新副本啟動之前,這些事件已在新副本上停用。如果事件在新副本上執行,而該事件已在來源上執行,則重複的操作會造成錯誤。事件排程器由 event_scheduler
系統變數控制,預設為 ON
,因此在原始伺服器上處於作用中的事件在新的副本啟動時預設會執行。若要停止所有事件在新副本上執行,請將 event_scheduler
系統變數在新副本上設定為 OFF
或 DISABLED
。或者,您可以使用 ALTER EVENT
陳述式將個別事件設定為 DISABLE
或 DISABLE ON REPLICA
,以防止它們在新副本上執行。您可以使用 SHOW
陳述式或資訊結構描述 EVENTS
資料表來列出伺服器上的事件。如需更多資訊,請參閱第 19.5.1.16 節「複製叫用的功能」。
除了以此方式建立新副本之外,MySQL Server 的 clone 外掛程式可用於將所有資料和複製設定從現有副本傳輸至複製品。如需使用此方法的說明,請參閱第 7.6.7.7 節「複製的複製」。
若要複製現有的副本而不進行複製,請遵循下列步驟
停止現有的副本,並記錄副本狀態資訊,特別是來源二進制日誌檔案和中繼日誌檔案位置。您可以在 Performance Schema 複製資料表中檢視副本狀態 (請參閱第 29.12.11 節「Performance Schema 複製資料表」),或發出
SHOW REPLICA STATUS
,如下所示mysql> STOP REPLICA; mysql> SHOW REPLICA STATUS\G
關閉現有的副本
$> mysqladmin shutdown
將資料目錄從現有的副本複製到新的副本,包括日誌檔案和中繼日誌檔案。您可以使用 tar 或
WinZip
建立封存來執行此動作,或使用 cp 或 rsync 等工具執行直接複製。重要在複製之前,請確認與現有複本相關的所有檔案實際上都儲存在資料目錄中。例如,
InnoDB
系統表空間、還原表空間和重做日誌可能會儲存在替代位置。InnoDB
表空間檔案和每個資料表一個檔案的表空間可能已在其他目錄中建立。複本的二進位日誌和中繼日誌可能位於資料目錄之外的獨立目錄中。檢查為現有複本設定的系統變數,並尋找任何已指定的替代路徑。如果發現任何路徑,也請將這些目錄複製過來。在複製期間,如果檔案已用於複寫中繼資料儲存庫(請參閱第 19.2.4 節:「中繼日誌和複寫中繼資料儲存庫」),請確保您也將這些檔案從現有複本複製到新的複本。如果資料表已用於儲存庫(預設情況下,資料表位於資料目錄中)。
複製完成後,從新複本上資料目錄的副本中刪除
auto.cnf
檔案,以便新的複本以不同的產生的伺服器 UUID 啟動。伺服器 UUID 必須是唯一的。
新增新複本時遇到的一個常見問題是,新複本會因為一系列類似以下的警告和錯誤訊息而失敗
071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a replica and has his hostname changed!! Please use '--relay-log=new_replica_hostname-relay-bin' to avoid this problem. 071118 16:44:10 [ERROR] Failed to open the relay log './old_replica_hostname-relay-bin.003525' (relay_log_pos 22940879) 071118 16:44:10 [ERROR] Could not find target log during relay log initialization 071118 16:44:10 [ERROR] Failed to initialize the master info structure
如果未指定
relay_log
系統變數,則可能會發生這種情況,因為中繼日誌檔案在其檔案名稱中包含主機名稱。如果未使用relay_log_index
系統變數,中繼日誌索引檔案也適用此情況。有關這些變數的更多資訊,請參閱第 19.1.6 節:「複寫和二進位記錄選項和變數」。若要避免此問題,請在新複本上使用與現有複本上相同的值作為
relay_log
。如果未在現有複本上明確設定此選項,請使用
。如果無法做到這一點,請將現有複本的中繼日誌索引檔案複製到新的複本,並將新複本上的existing_replica_hostname
-relay-binrelay_log_index
系統變數設定為與現有複本上使用的相符。如果未在現有複本上明確設定此選項,請使用
。或者,如果您在遵循本節中的其餘步驟後,已嘗試啟動新的複本,並遇到如先前所述的錯誤,則請執行以下步驟existing_replica_hostname
-relay-bin.index如果您尚未執行此操作,請在新複本上發出
STOP REPLICA
。如果您已再次啟動現有複本,請也在現有複本上發出
STOP REPLICA
。將現有複本的中繼日誌索引檔案的內容複製到新複本的中繼日誌索引檔案中,確保覆寫檔案中已有的任何內容。
繼續執行本節中的其餘步驟。
複製完成後,重新啟動現有複本。
在新複本上,編輯組態,並給予新複本一個唯一的伺服器 ID(使用
server_id
系統變數),該 ID 未被來源或任何現有複本使用。啟動新的複本伺服器,請務必指定
--skip-replica-start
,以確保複寫不會立即啟動。使用效能結構描述複寫資料表,或發出SHOW REPLICA STATUS
,以確認與現有複本相比,新的複本是否具有正確的設定。也請顯示伺服器 ID 和伺服器 UUID,並驗證這些對於新的複本而言是否正確且唯一。透過發出
START REPLICA
陳述式來啟動複本執行緒。新的複本現在會使用其連線中繼資料儲存庫中的資訊來啟動複寫程序。