在複製設定中,可以透過取得全域讀取鎖定並操作 read_only
系統變數,變更要備份的伺服器的唯讀狀態,來備份來源或複本伺服器
將伺服器設為唯讀,使其僅處理擷取並封鎖更新。
執行備份。
將伺服器變回其正常的讀取/寫入狀態。
本節中的說明將要備份的伺服器置於安全狀態,適用於從伺服器取得資料的備份方法,例如 mysqldump (請參閱第 6.5.4 節,「mysqldump — 資料庫備份程式」)。您不應嘗試使用這些說明透過直接複製檔案來進行二進位備份,因為伺服器可能仍有修改過的資料快取在記憶體中,尚未刷新到磁碟。
以下說明如何在來源伺服器和複本伺服器上執行此操作。對於此處討論的兩種情況,假設您有以下複製設定:
來源伺服器 S1
複本伺服器 R1,其來源為 S1
連線至 S1 的用戶端 C1
連線至 R1 的用戶端 C2
在任一種情況下,取得全域讀取鎖定和操作 read_only
變數的語句,都在要備份的伺服器上執行,不會傳播到該伺服器的任何複本。
情境 1:使用唯讀來源進行備份
透過在 S1 上執行以下語句,將來源 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;
在複本恢復正常運作後,它會透過趕上來源二進位日誌中的任何未完成更新,再次與來源同步。