本節討論如何使用 NDB Cluster 複製進行備份和從備份還原。我們假設複製伺服器已依照先前涵蓋的內容進行設定(請參閱第 25.7.5 節,「為複製準備 NDB Cluster」,以及緊接其後的章節)。完成此操作後,進行備份然後從備份還原的程序如下
有兩種不同的方法可以啟動備份。
方法 A. 此方法需要先前在啟動複製程序之前,在來源伺服器上啟用叢集備份程序。這可以透過在
my.cnf file
中[mysql_cluster]
區段中包含下列這一行來完成,其中management_host
是來源叢集的NDB
管理伺服器的 IP 位址或主機名稱,而port
是管理伺服器的埠號ndb-connectstring=management_host[:port]
注意只有在未使用預設埠 (1186) 時,才需要指定埠號。如需有關 NDB Cluster 中的埠和埠配置的詳細資訊,請參閱第 25.3.3 節,「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;
使用在上一個步驟中取得的 epoch 值
@latest
,您可以從來源上的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
欄位中顯示的值,來取得類似的資訊,此值的檔案名稱的字尾具有File
欄位中顯示的所有檔案中的最大值。在此情況下,您必須判斷此檔案為何,並在下一個步驟中手動提供名稱或透過使用指令碼剖析輸出來提供。使用在上一個步驟中取得的值,您現在可以在複本的 mysql 用戶端中發出適當的指令。使用下列
CHANGE REPLICATION SOURCE TO
陳述式mysqlR> CHANGE REPLICATION SOURCE TO -> SOURCE_LOG_FILE='@file', -> SOURCE_LOG_POS=@pos;
現在複本已知道要從來源二進位日誌檔案的哪個位置開始讀取資料,您可以讓複本使用此陳述式開始複製
mysqlR> START REPLICA;
若要在第二個複製通道上執行備份和還原,只需要重複這些步驟,並將輔助來源和複本的主機名稱和 ID 取代為主要來源和複本伺服器的主機名稱和 ID(若適當),並在其上執行上述陳述式即可。
如需有關執行叢集備份和從備份還原叢集的其他資訊,請參閱第 25.6.8 節,「NDB Cluster 的線上備份」。