您可以在不停止來源伺服器的情況下,將另一個複本新增至現有的複製設定。若要執行此操作,您可以透過複製現有複本的資料目錄來設定新的複本,並為新的複本提供不同的伺服器 ID (由使用者指定) 和伺服器 UUID (在啟動時產生)。
如果您要複製以建立新副本的複製來源伺服器或現有副本有任何排程事件,請務必在新副本啟動之前停用這些事件。如果一個事件在新副本上執行,而該事件已在來源上執行過,則重複的操作會導致錯誤。事件排程器是由 event_scheduler
系統變數控制,該變數預設為 ON
,因此當新的副本啟動時,在原始伺服器上活動的事件會依預設執行。若要停止所有事件在新副本上執行,請將新副本上的 event_scheduler
系統變數設為 OFF
或 DISABLED
。或者,您可以使用 ALTER EVENT
陳述式將個別事件設為 DISABLE
或 DISABLE ON REPLICA
,以防止它們在新副本上執行。您可以使用 SHOW
陳述式或 Information Schema EVENTS
表格列出伺服器上的事件。如需更多資訊,請參閱第 19.5.1.16 節,「呼叫功能的複製」。
除了以此方式建立新的副本外,MySQL 伺服器的 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
來確保複製尚未啟動。使用 Performance Schema 複製表格或發出SHOW REPLICA STATUS
,以確認與現有副本相比,新副本具有正確的設定。同時顯示伺服器 ID 和伺服器 UUID,並驗證它們對於新的副本而言是正確且唯一的。透過發出
START REPLICA
陳述式來啟動副本執行緒。新的副本現在使用其連線中繼資料儲存庫中的資訊來啟動複製程序。