本節討論使用 NDB Cluster 複製進行備份和從備份還原。我們假設複製伺服器已按照先前所述進行配置 (請參閱第 25.7.5 節「準備 NDB Cluster 以進行複製」,以及緊接其後的章節)。完成此操作後,進行備份然後從備份還原的程序如下
有兩種不同的方法可以開始備份。
方法 A. 此方法要求在開始複製程序之前,先前已在來源伺服器上啟用叢集備份程序。這可以透過在
[mysql_cluster]
區段的my.cnf
檔案中加入以下程式碼行來完成,其中management_host
是來源叢集的NDB
管理伺服器的 IP 位址或主機名稱,而port
是管理伺服器的連接埠號碼ndb-connectstring=management_host[:port]
注意只有在未使用預設連接埠 (1186) 時才需要指定連接埠號碼。請參閱第 25.3.3 節「NDB Cluster 的初始配置」,以取得更多關於 NDB Cluster 中連接埠和連接埠配置的資訊。
shellS> ndb_mgm -e "START BACKUP"
方法 B. 如果
my.cnf
檔案未指定在哪裡尋找管理主機,您可以將此資訊傳遞給NDB
管理用戶端,作為START BACKUP
命令的一部分,來啟動備份程序。這可以按此處所示的方式完成,其中management_host
和port
是管理伺服器的的主機名稱和連接埠號碼shellS> ndb_mgm management_host:port -e "START BACKUP"
在我們先前概述的案例中 (請參閱第 25.7.5 節「準備 NDB Cluster 以進行複製」),這將按以下方式執行
shellS> ndb_mgm rep-source:1186 -e "START BACKUP"
將叢集備份檔案複製到正在上線的複本。每個為來源叢集執行 ndbd 程序的系統都有位於其上的叢集備份檔案,並且必須將所有這些檔案複製到複本,以確保成功還原。備份檔案可以複製到複本管理主機所在的電腦上的任何目錄,只要 MySQL 和 NDB 二進制檔具有該目錄的讀取權限即可。在此情況下,我們假設這些檔案已複製到目錄
/var/BACKUPS/BACKUP-1
。雖然複本叢集的資料節點數量不需要與來源相同,但強烈建議此數量相同。當複本伺服器啟動時,必須阻止複製程序開始。您可以使用
--skip-replica-start
來啟動複本來完成此操作。在複本叢集上建立來源叢集上存在且要複製的任何資料庫。
重要必須在複本叢集中的每個 SQL 節點上執行與每個要複製的資料庫對應的
CREATE DATABASE
(或CREATE SCHEMA
) 陳述式。使用 mysql 用戶端中的此陳述式重設複本叢集
mysqlR> RESET REPLICA;
您現在可以使用 ndb_restore 命令,依序對每個備份檔案啟動複本上的叢集還原程序。對於第一個檔案,必須包含
-m
選項來還原叢集元資料,如下所示shellR> ndb_restore -c replica_host:port -n node-id \ -b backup-id -m -r dir
dir
是備份檔案已放置在複本上的目錄路徑。對於對應於其餘備份檔案的 ndb_restore 命令,不應使用-m
選項。對於從具有四個資料節點的來源叢集進行還原 (如第 25.7 節「NDB Cluster 複製」中的圖所示),其中備份檔案已複製到目錄
/var/BACKUPS/BACKUP-1
,要在複本上執行的正確命令順序可能如下所示shellR> ndb_restore -c replica-host:1186 -n 2 -b 1 -m \ -r ./var/BACKUPS/BACKUP-1 shellR> ndb_restore -c replica-host:1186 -n 3 -b 1 \ -r ./var/BACKUPS/BACKUP-1 shellR> ndb_restore -c replica-host:1186 -n 4 -b 1 \ -r ./var/BACKUPS/BACKUP-1 shellR> ndb_restore -c replica-host:1186 -n 5 -b 1 -e \ -r ./var/BACKUPS/BACKUP-1
重要本範例中最後一次呼叫 ndb_restore 中的
-e
(或--restore-epoch
) 選項是必要的,以確保 epoch 寫入複本的mysql.ndb_apply_status
表格。如果沒有此資訊,複本將無法與來源正確同步。(請參閱第 25.5.23 節「ndb_restore — 還原 NDB Cluster 備份」。)現在您需要從複本上的
ndb_apply_status
表格取得最新的 epoch (如第 25.7.8 節「使用 NDB Cluster 複製實作容錯移轉」中所述)mysqlR> SELECT @latest:=MAX(epoch) FROM mysql.ndb_apply_status;
使用
@latest
作為上一步取得的 epoch 值,您可以從來源上的mysql.ndb_binlog_index
表格取得正確的起始位置@pos
,以及正確的二進制日誌檔案@file
。此處顯示的查詢會從邏輯還原位置之前套用的最後一個 epoch 的Position
和File
欄位取得這些值mysqlS> SELECT -> @file:=SUBSTRING_INDEX(File, '/', -1), -> @pos:=Position -> FROM mysql.ndb_binlog_index -> WHERE epoch > @latest -> ORDER BY epoch ASC LIMIT 1;
如果目前沒有複製流量,您可以透過在來源上執行
SHOW BINARY LOG STATUS
來取得類似的資訊,並使用輸出中Position
欄位中顯示的值,用於其名稱具有最大值後綴的所有檔案中。在此情況下,您必須判斷這是哪個檔案,並在下一步中手動提供名稱,或透過使用指令碼剖析輸出。使用上一步取得的值,您現在可以在複本的 mysql 用戶端中發出適當的指令。使用以下
CHANGE REPLICATION SOURCE TO
陳述式mysqlR> CHANGE REPLICATION SOURCE TO -> SOURCE_LOG_FILE='@file', -> SOURCE_LOG_POS=@pos;
現在複本知道要從哪個二進制日誌檔案的哪個點開始從來源讀取資料,您可以使用此陳述式使複本開始複製
mysqlR> START REPLICA;
若要在第二個複製通道上執行備份和還原,只需重複這些步驟,適當地將第二個來源和複本的主機名稱和 ID 替換為主要來源和複本伺服器的值,並在它們上執行前面的陳述式即可。
如需關於執行叢集備份和從備份還原叢集的其他資訊,請參閱第 25.6.8 節「NDB Cluster 的線上備份」。