Mariadb

多個DB按順序恢復

  • January 15, 2022

我正在將多個 MariaDB 數據庫從同一 VPC/區域等中的 AWS EC2 機器恢復到 Amazon AWS RDS MariaDB 實例中。

我正在使用這樣的shell腳本:

mysql -u root -h hostname.amazonaws.com -ppassword < db1.sql
mysql -u root -h hostname.amazonaws.com -ppassword < db2.sql
mysql -u root -h hostname.amazonaws.com -ppassword < db3.sql
...

順序很重要,因為後面的數據庫有引用早期數據庫的 VIEWS 和 JOINS。我已經弄清楚了那個部分,並且一次手動地做一個數據庫,就像預期的那樣。

問題是,當我將 DB 連結到單個 shell 腳本中時,稍後為 DB2 進行的還原會抱怨 DB1 中的某些表不存在。確切的錯誤消息如下:

ERROR 1146 (42S02) at line 482: Table 'db1.table_name' doesn't exist

我的猜測是 MySQL 客戶端將整個 SQL 文件發送到 RDS 伺服器並從下一個 SQL 文件開始,而無需等待上一個成功完成。

有什麼方法可以阻止早期的 SQL 文件,直到它成功完成或失敗併中斷後續 SQL 文件的執行?

客戶端和伺服器資訊如下:

mysql client  Ver 15.1 Distrib 10.0.34-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Server version: 10.0.31-MariaDB MariaDB Server

我的猜測是 MySQL 客戶端將整個 SQL 文件發送到 RDS 伺服器並從下一個 SQL 文件開始,而無需等待上一個成功完成。

那不是問題。

問題是,mysqldump如果您按預期使用它,只會自動處理這個問題:

mysqldump [options] --databases db1 db2 db3

否則,它本質上假定當您恢復轉儲文件時,伺服器上已經滿足任何依賴關係,因此除了正在恢復的單個數據庫中之外,它不會解決它們。

如果您像這樣創建一個轉儲文件,指定您需要的所有數據庫但使用該--no-data選項,您將獲得一個包含所有表和視圖的小文件,但沒有數據。首先恢復它,然後恢復你的 3 個單獨的文件。

感謝所有提供意見的人。通過使用 sleep 命令在 db1 還原後添加 60 秒的延遲,我可以為我工作:

mysql -u root -h hostname.amazonaws.com -ppassword < db1.sql
sleep 60
mysql -u root -h hostname.amazonaws.com -ppassword < db2.sql
mysql -u root -h hostname.amazonaws.com -ppassword < db3.sql
...

我隨機選擇了1分鐘,背後沒有真正的理由。

引用自:https://dba.stackexchange.com/questions/204327