Mysql

即使使用 –lock-tables=false 在 mysqldump 期間寫入鎖

  • August 21, 2017

當我嘗試使用 轉儲線上數據庫--lock-tables=false時,其他人無法更新表。有什麼方法可以解決這個問題嗎?

當我使用 MyISAM 時,--single-transaction對 InnoDB 有幫助嗎?

此外,主從架構是處理備份線上數據庫的終極方法嗎?

謝謝!

您的問題:當我嘗試使用 轉儲線上數據庫--lock-tables=false時,其他人無法更新表。有什麼方法可以解決這個問題嗎?

您需要了解為什麼其他人無法更新。使用 MyISAM,每個表在每次 INSERT、UPDATE 和 DELETE 時都會經歷一個全表鎖。使用 –lock-tables 將嘗試鎖定每個表,但會阻止在重讀環境中發出 SELECT。還有其他選擇。

您的問題:當我使用 MyISAM 時,--single-transaction對 InnoDB 有幫助嗎?

InnoDB 是一個符合 ACID 的儲存引擎,可以在事務中更新和讀取數據。行級鎖定通常在 InnoDB 中發出,這允許其他人在備份表時讀取和寫入表。鑑於其全表鎖定協議,MyISAM 不允許這樣做。因此,MyISAM 根本沒有得到任何幫助--single-transaction。如果您創建的每個表都是 InnoDB,那麼您可以在正在執行的 master 上執行線上備份。

您的問題:此外,主從架構是處理備份線上數據庫的最終方法嗎?

Master/Slave 確實使備份線上數據庫更容易,因為您在從屬伺服器上使用 mysqldump 執行備份,而 Master 繼續接受 INSERT、UPDATE 和 DELETE。此外,這允許進行允許時間點恢復的備份。您只需在從站上執行以下步驟:

  • STOP SLAVE;
  • mysql轉儲
  • START SLAVE;

如果您在午夜在 Slave 上發出此消息,則數據會及時凍結。這樣,當您恢復 mysqldump 時,所有表都來自同一時間範圍。

旁注:您沒有義務將 Slave 上的所有表都轉換為 InnoDB。

如果所有表都是 InnoDB,則 usingsingle-transaction將創建時間點備份,也可以作為 master。既然你有 MyISAM 表,那麼 Master-Slave 是理想的解決方案,不一定是終極解決方案。還有其他方法,但為了簡單起見:GO WITH MASTER-SLAVE !!!

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