Linux

兩個數據庫同步備份

  • June 26, 2014

我有一個需要兩個數據庫才能工作的系統。我需要一個腳本在給定的時間點備份兩個數據庫。我需要數據庫保持同步,因此我需要確保在備份另一個數據庫時備份不允許更改其中一個數據庫。

mysqldump db1 db2 > db1_db2.sql

上面的程式碼是否適合這個。它會在備份時鎖定兩個數據庫,所以我會得到同步備份嗎?實現這一目標的正確方法是什麼?我將如何做到這一點,但每個數據庫都有單獨的文件?

編輯:

大多數表使用 InnoDB 引擎,但很少有不太重要的表使用歸檔引擎。

您的最佳選擇如下

mysqldump --single-transaction --databases db1 db2 > db1_db2.sql

選項–single-transaction為轉儲中的所有數據創建一個時間點視窗。唯一的限制是您不執行任何 DDL

只要您在 mysqldump 期間不執行任何這些操作,從 mysqldump 啟動的那一刻起,db1 和 db2 將是一個完美的快照。

你的非 InnoDB 表應該沒問題,只要你對它們什麼都不做:沒有 DDL,沒有 INSERT,沒有 UPDATE,沒有 DELETE。

更新 2014-06-26 19:43 EDT

您詢問

單事務和鎖定所有表是互斥的嗎?其中之一是隱含的\預設的嗎?

直接來自關於–single-transaction的 MySQL 文件

–single-transaction 選項和 –lock-tables 選項是互斥的,因為 LOCK TABLES 會導致任何未決事務被隱式送出。

是的,它們是相互排斥的。

直接來自–lock-all-tables上的 MySQL 文件

鎖定所有數據庫中的所有表。這是通過在整個轉儲期間獲取全域讀鎖來實現的。此選項會自動關閉 –single-transaction 和 –lock-tables。

因此,lock-all-tables將禁用--single-transaction

CAVEAT :請記住,FLUSH TABLES WITH READ LOCK;所有其他笨拙的(全有或全無)鎖定機制不會完全阻止 InnoDB 對系統表空間進行寫入。我之前在 DBA StackExchange 中寫過

這是 InnoDB 的地圖,供您查看 InnoDB 的其他移動部分:

InnoDB 架構

請閱讀如何 FLUSH TABLES WITH READ LOCK 與 Innodb 表一起使用(MySQL 性能部落格),了解針對 InnoDB 鎖定所有表的其他不良影響。

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