企業生產環境數據庫備份鎖表問題

在MySQL數據庫場景,使用mysqldump命令備份時,我們會遇到一個鎖表的問題?如果進行鎖表了,在備份期間用戶就無法訪問數,若是備份時長几個小時,那麼就表示幾個小時內,用戶都無法訪問數據,會對業務造成很大影響;如果不鎖表,又會導致備份的數據不一致,因爲在備份的過程中,有可能會有數據寫入,這樣無法保證備份後的備份文件中的數據是你想要的某個時間點的數據。

如何解決鎖表問題?
關於MySQL備份時,是否需要鎖表,這要根據公司的業務場景進行分析。
案例1:
某金融諮詢公司,公司客戶都是以select爲主,即查詢爲主,公司的數據幾乎全是公司內部導入,並且公司數據庫引擎是混合引擎,MyIsam和Innodb兩種存儲引擎的表。
對於這種業務場景,可以不進行鎖表,直接備份數據庫即可,然後再通過binlog日誌來保證數據的一致性(增量備份)
因爲MySQL默認是開啓--lock-tables參數的,若不需要鎖表,則要關閉此參數--skip-lock-tables。
在用LOCK TABLES給表顯式加表鎖時,必須同時取得所有涉及到表的鎖,也就是說,在執行LOCK TABLES後,只能訪問顯式加鎖的這些表,不能訪問未加鎖的表;同時,如果加的是讀鎖,那麼只能執行鎖表的查詢操作,MyISAM總是一次獲得SQL語句所需要的全部鎖。這也正是MyISAM表不會出現死鎖(Deadlock Free)的原因。

#混合引擎和MyIsam引擎
mysqldump -uroot -p -A -B -F -R --skip-lock-tables --events|gzip >/tmp/all_$(date +%F).sql.gz
案例2:
在用戶對數據更新頻繁的業務場景中,使用mysqldump命令備份MySQL數據庫,可使用鎖表的功能了保證數據的一致性;但這樣帶來了一個問題,在備份鎖表的期間,用戶無法正常訪問和更新數據。
對於這種場景,建議在業務低谷的時候進行備份,正所謂月黑風高殺人夜啊。
另一種更好的解決辦法就是做主從複製,然後在從庫上進行備份,這樣子鎖表產生的影響就會降得更低。
網上也有網友說使用--lock-tables只讀鎖表功能(即不能更新插入數據,只能讀取數據鎖表)來進行備份,然後通過binlog日誌來達到數據一致性。這對於有可能有大量數據插入的場景,效果也不是很佳。
myisam引擎企業生產備份命令(適合所有引擎或混合引擎):
由於MyISAM引擎爲表級鎖,因此,在備份時需要防止在備份期間數據寫入而導致不一致, 所以,在備份時使用--lock-all-tables(-x)鎖表。

mysqldump -uroot -p -A -B -F -R -x -events|gzip >/tmp/all_$(date +%F).sql.gz
innodb引擎企業生產備份名:
InnoDB引擎爲行鎖,因此,備份時可以不對數據庫加鎖的操作,可以加選項--single-transaction進行備份。它有一些要求:只能是 innodb 引擎;導出的過程中,不能有任何人執行 alter table, drop table, rename table, truncate table等DDL語句。實際上DDL會被事務所阻塞,因爲事務持有表的metadata lock 的共享鎖,而DDL會申請metadata lock的互斥鎖,所以阻塞了。

mysqldump -uroot -p -A -B -F -R --events --single-transaction|gzip >/tmp/all_$(date +%F).sql.gz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章