在複寫設定中,可以藉由取得全域讀取鎖定並操作 read_only
系統變數,以變更要備份之伺服器的唯讀狀態,來備份來源或副本伺服器。
將伺服器設為唯讀,使其僅處理擷取並封鎖更新。
執行備份。
將伺服器改回其正常的讀取/寫入狀態。
本節中的指示會將要備份的伺服器置於對從伺服器取得資料的備份方法而言是安全的狀態,例如 mysqldump(請參閱第 6.5.4 節「mysqldump — 資料庫備份程式」)。您不應該嘗試使用這些指示來直接複製檔案,以進行二進制備份,因為伺服器可能仍有修改過但快取在記憶體中且未寫入磁碟的資料。
下列指示說明如何對來源和副本執行此操作。對於此處討論的兩種情況,假設您具有下列複寫設定
來源伺服器 S1
以 S1 作為來源的副本伺服器 R1
連線至 S1 的用戶端 C1
連線至 R1 的用戶端 C2
在這兩種情況下,取得全域讀取鎖定並操作 read_only
變數的陳述式會在要備份的伺服器上執行,且不會傳播到該伺服器的任何副本。
情境 1:使用唯讀來源進行備份
藉由在來源 S1 上執行下列陳述式,將其置於唯讀狀態
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;
當 S1 處於唯讀狀態時,下列屬性為真
由於伺服器處於唯讀模式,因此 C1 傳送至 S1 的更新要求會遭到封鎖。
C1 傳送至 S1 的查詢結果要求會成功。
在 S1 上進行備份是安全的。
在 R1 上進行備份是不安全的。此伺服器仍在執行,而且可能會處理來自用戶端 C2 的二進制日誌或更新要求。
當 S1 為唯讀狀態時,執行備份。例如,您可以使用 mysqldump。
在 S1 上的備份操作完成後,執行以下陳述式將 S1 還原至其正常運作狀態
mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;
雖然在 S1 上執行備份是安全的(就備份而言),但效能並非最佳,因為 S1 的客戶端會被阻止執行更新。
此策略適用於備份複製設定中的來源,但也可用於非複製設定中的單一伺服器。
情境 2:使用唯讀副本進行備份
透過在副本 R1 上執行以下陳述式,將 R1 置於唯讀狀態
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SET GLOBAL read_only = ON;
當 R1 處於唯讀狀態時,以下屬性為真
來源 S1 繼續運作,因此在來源上進行備份是不安全的。
副本 R1 已停止,因此在副本 R1 上進行備份是安全的。
這些屬性為一種常見的備份情境提供了基礎:讓一個副本忙於執行備份一段時間不是問題,因為它不會影響整個網路,而且系統在備份期間仍然在運行。 特別是,客戶端仍然可以在來源伺服器上執行更新,而來源伺服器不會受到副本上的備份活動影響。
當 R1 為唯讀狀態時,執行備份。例如,您可以使用 mysqldump。
在 R1 上的備份操作完成後,執行以下陳述式將 R1 還原至其正常運作狀態
mysql> SET GLOBAL read_only = OFF;
mysql> UNLOCK TABLES;
副本還原至正常運作後,會再次透過趕上來源二進位日誌中的任何未完成更新來與來源同步。