共計 1997 個字符,預計需要花費 5 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這期內容當中丸趣 TV 小編將會給大家帶來有關 MySql 備份時怎么保持數據一致性,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1、直接拷貝整個數據目錄下的所有文件到新的機器。優點是簡單、快速,只需要拷貝;缺點也很明顯,在整個備份過程中新機器處于完全不可用的狀態,且目的無法釋放源數據文件中因為碎片導致的空間浪費和無法回收已發生擴展的 innodb 表空間。
2、用 xtrabackup 進行熱備。優點是備份過程中可繼續提供服務;缺點和第一種方法差不多,目的分區無法釋放源數據文件中因為碎片導致的空間浪費和無法回收已發生擴展的 innodb 表空間。
3、使用官方自帶的 mysqldump 邏輯重做。優點是在整個備份過程中可以向外提供服務,最重要的一點是可以解決碎片浪費。
以上幾種方法相信大家也都很熟悉,就不再詳細介紹。下面主要講解一下 mysqldump 備份時如何保持數據的一致性。
mysqldump 對不同類型的存儲引擎,內部實現也不一樣。主要是針對兩種類型的存儲引擎:支持事務的存儲引擎(如 InnoDB)和不支持事務的存儲引擎(如 MyISAM),下面分別看看這兩種存儲引擎的實現:
1、對于支持事務的引擎如 InnoDB,參數上是在備份的時候加上 –single-transaction 保證數據一致性
–single-transaction 實際上通過做了下面兩個操作:
①、在開始的時候把該 session 的事務隔離級別設置成 repeatable read;
②、然后啟動一個事務(執行 bigin),備份結束的時候結束該事務(執行 commit)
有了這兩個操作,在備份過程中,該 session 讀到的數據都是啟動備份時的數據(同一個點)。可以理解為對于 innodb 引擎來說加了該參數,備份開始時就已經把要備份的數據定下來了,備份過程中的提交的事務時是看不到的,也不會備份進去。
2、對于不支持事務的引擎如 MyISAM,只能通過鎖表來保證數據一致性,這里分三種情況:
①、導出全庫:加 –lock-all-tables 參數,這會在備份開始的時候啟動一個全局讀鎖(執行 flush tables with read lock),其他 session 可以讀取但不能更新數據,備份過程中數據沒有變化,所以最終得到的數據肯定是完全一致的;
②、導出單個庫:加 –lock-tables 參數,這會在備份開始的時候鎖該庫的所有表,其他 session 可以讀但不能更新該庫的所有表,該庫的數據一致;
③、導出單個表:加 –lock-tables 參數,這會在備份開始的時候鎖該表,其他表不受影響,該表數據一致。
上面只是展示了對不同引擎來講加的參數只是為了讓數據保持一致性,但在備份中業務并沒有停止,時刻可能有新的數據進行寫入,為了讓我們知道備份時是備份了哪些數據,或者截止到那個指針(二進制日志),我們可以再加入 –master-data 參數,備份好的 sql 文件就會記錄從備份截至到哪個指針,指針之后的數據更新我們可以通過二進制日志進行恢復。
# mysqldump -u root -p --single-transaction --master-data --flush-log --database test test.sql -- --flush-log 表示備份開始之后的更行都切到下一個二進制日志
可以在備份的 test.sql 文件中前幾行看到記錄著備份當時的二進制日志信息
# vim test.sql
--CHANGE MASTER TO MASTER_LOG_FILE= mysql-bin.000004 , MASTER_LOG_POS=436263492;
---- Current Database: `test`
.....
# mysqlbinlog --start-position=436263492 mysql-bin.000004 00004.sql -- 在全備恢復之后,我們可以通過之后的二進制日志進行恢復
另外解釋下 mysqldump 備份時為什么要鎖表才能保持數據的一致性:

說明:
1、在 t1 時間點,用 mysqldump 啟動不鎖表備份;
2、先導出 a 表,共耗時 5 分鐘,因為沒有鎖表,在這 5 分鐘內 b 表 insert 了 10 行數據;
3、到了 t2 時間點,a 表導出完成,開始導出 b 表;
4、導出 b 表耗時 10 分鐘,在導出 b 表的過程中,a、b 表均沒有數據變化;
5、到了 t3 時間點,b 表導出完成,全部備份結束;
6、然后備機從 t1 時間點的 binlog 位置開始應用 binlog,最后備機中 b 表的數據比主機多 10 行,數據不一致。
上述就是丸趣 TV 小編為大家分享的 MySql 備份時怎么保持數據一致性了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。
向 AI 問一下細節