兩個數據庫同步備份
我有一個需要兩個數據庫才能工作的系統。我需要一個腳本在給定的時間點備份兩個數據庫。我需要數據庫保持同步,因此我需要確保在備份另一個數據庫時備份不允許更改其中一個數據庫。
mysqldump db1 db2 > db1_db2.sql
上面的程式碼是否適合這個。它會在備份時鎖定兩個數據庫,所以我會得到同步備份嗎?實現這一目標的正確方法是什麼?我將如何做到這一點,但每個數據庫都有單獨的文件?
編輯:
大多數表使用 InnoDB 引擎,但很少有不太重要的表使用歸檔引擎。
您的最佳選擇如下
mysqldump --single-transaction --databases db1 db2 > db1_db2.sql
選項–single-transaction為轉儲中的所有數據創建一個時間點視窗。唯一的限制是您不執行任何 DDL
ALTER TABLE
CREATE TABLE
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
- 請參閱我的 DBA StackExchange 文章
row locking within ACID transaction innodb
以查看所有可能間歇性損害事務的語句。只要您在 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 的其他移動部分:
請閱讀如何 FLUSH TABLES WITH READ LOCK 與 Innodb 表一起使用(MySQL 性能部落格),了解針對 InnoDB 鎖定所有表的其他不良影響。