Mysql

快速、保存和重新啟動更大的 MySQL/MariaDB 數據庫

  • May 6, 2020

我必須通過 ssh/scp 將帶有 43GB MariaDB DB 的 Drupal 站點轉移到另一台伺服器。

我一大早就有一個有限的停機時間視窗。過去,我通過這樣的管道直接傳輸較小的數據庫(<3GB):

ssh -l webuser 10.0.0.99 "cd /var/www/drupal7/htdocs/site_name && drush sql-dump | xz -1 -" | xz -d - | drush sqlc

但是有了這個更大的數據庫,我擔心這個管道的某些部分會失敗,我必須重新啟動一切,這幾乎肯定意味著我會超過停機時間視窗。

因此,顯而易見的解決方案是將其拆分為單個獨立的步驟,以便我可以重做部分任務,以防其中一個失敗:

ssh -l webuser 10.0.0.99 "cd /var/www/drupal7/htdocs/site_name && drush sql-dump | xz -1 - &gt; /home/webuser/db_dump.sql.xz"
scp webuser@10.0.0.99:/home/webuser/db_dump.sql.xz .
xzcat /home/webuser/db_dump.sql.xz | drush sqlc

但是現在這些步驟是連續的,需要更多時間,這意味著在出現問題時重做步驟的時間更少。

所以我想我正在尋找一種在舊伺服器上創建數據庫轉儲的方法,並有第二個獨立的程序將數據傳輸到新伺服器並開始在新伺服器上恢復數據庫。

只需使用

scp webuser@10.0.0.99:/home/webuser/db_dump.sql.xz .

在尚未完成的數據庫轉儲上將不起作用,因為 scp 不會等到 MariaDB 完成寫入數據庫轉儲。

有人知道一個命令,它會繼續傳輸或輸出數據,直到數據庫轉儲完成?

或者有人知道轉移數據庫的更好方法嗎?


更新:

我想我可以使用這樣的tee命令:

ssh -l webuser 10.0.0.99 "cd /var/www/drupal7/htdocs/site_name && drush sql-dump | xz -1 - | tee -a /home/webuser/db_dump.sql.xz" | xz -d - | drush sqlc

然而,這將改善這種情況,想像一下仍然寫入數據庫轉儲並且在網路傳輸或恢復期間出現問題的情況。然後你必須用轉儲文件重新啟動,但你不能只是通過複製它,scp因為 MariaDB 仍在寫入它,所以和以前一樣的問題。

聽起來您想要實現的目標最好使用一些額外的工具來實現:

screen - 即使 ssh 會話斷開連接也使程序執行 pxz - 通過使用所有可用核心來加速壓縮 rsync - 使傳輸可恢復

您描述的三個步驟將變為:

ssh -l webuser 10.0.0.99 'screen -d -m "cd /var/www/drupal7/htdocs/site_name && drush sql-dump | nice -n19 pxz -1 &gt; /home/webuser/db_dump.sql.xz"'
rsync -a webuser@10.0.0.99:/home/webuser/db_dump.sql.xz db_dump.sql.xz
xzcat /home/webuser/db_dump.sql.xz | drush sqlc

轉儲過程將在分離的螢幕會話中執行,因此如果 ssh 會話中斷,它仍將繼續進行直到完成。

rsync 可以在執行時重複drush sql-dump執行,並且它將增量傳輸自上次 rsync 以來出現的文件的額外部分。

您將需要以某種方式標記完成,以便在轉儲和 rsync 完成之前不要執行最後一步。

我希望這能為您指明正確的方向,以實現您正在嘗試做的事情。

同步數據庫最直接的方法是rsync在數據儲存本身上使用並忽略所有的壓縮包、轉儲等。在停機時間視窗之前進行初始rsync設置(如果您願意,可以多次執行它;每次更改的“增量”應該減少,因為執行之間的時間減少了),然後當停機時間開始時,停止數據庫伺服器,對新機器進行最後一次rsync執行,在新機器上啟動數據庫伺服器,就完成了。

引用自:https://serverfault.com/questions/1014948