MySQL 系列連載之 XtraBackup 備份原理(1)
導讀
在日常的linux運維工作中,大資料量備份與還原,始終是個難點。關於mysql的備份和恢復,比較傳統的是用mysqldump工具,今天本文推薦另一個備份工具innobackupex。
如果您在本文遇到任何問題或疑問請到QQ群中與我們交流。也可在下方進行評論。我將在第一時間和您進行交流,共同學習。
QQ群:201777608、526871767、1689067(加群時註明:運維派)
Xtrabackup簡介
innobackupex和mysqldump都可以對mysql進行熱備份的,mysqldump對mysql的innodb的備份可以使用single-transaction引數來開啟一個事務,利用innodb的mvcc來不進行鎖表進行熱備份,mysqldump備份是邏輯備份,備份出來的檔案是sql語句,所以備份和恢復的時候很慢,但是備份和恢復時候很清楚。當MYSQL資料超過10G時,用mysqldump來匯出備份就比較慢了,此種情況下用innobackupex這個工具就比mysqldump要快很多。利用它對mysql做全量和增量備份.
- Percona XtraBackup可以說是一個相對完美的免費開源資料備份工具,是使用perl語言完成的指令碼工具,能夠非常快速地備份與恢復mysql資料庫,且支援線上熱備份(備份時不影響資料讀寫)
此工具呼叫xtrabackup和tar4ibd工具,實現很多對效能要求並不高的任務和備份邏輯,可以說它是innodb熱備工具ibbackup的一個開源替代品。
XtraBackup是目前首選的備份方案之一
原理
1、MySQL主從同步原理
- MySQL主從同步是在MySQL主從複製(Master-Slave Replication)基礎上實現的
通過設定在Master MySQL上的binlog(使其處於開啟狀態),Slave MySQL上通過一個I/O執行緒從Master MySQL上讀取binlog,然後傳輸到Slave MySQL的中繼日誌中,然後Slave MySQL的SQL執行緒從中繼日誌中讀取中繼日誌,然後應用到Slave MySQL的資料庫中。這樣實現了主從資料同步功能。
2、XtraBackup備份原理
innobackupex在後臺執行緒不斷追蹤InnoDB的日誌檔案,然後複製InnoDB的資料檔案。資料檔案複製完成之後,日誌的複製執行緒也會結束。這樣就得到了不在同一時間點的資料副本和開始備份以後的事務日誌。完成上面的步驟之後,就可以使用InnoDB崩潰恢復程式碼執行事務日誌(redo log),以達到資料的一致性。
3、備份的兩個過程
backup,備份階段,追蹤事務日誌和複製資料檔案(物理備份)。
preparing,重放事務日誌,使所有的資料處於同一個時間點,達到一致性狀態。
4、XtraBackup的優點
1、可以快速可靠的完成資料備份(複製資料檔案和追蹤事務日誌)
2、資料備份過程中不會中斷事務的處理(熱備份)
3、節約磁碟空間和網路頻寬
4、自動完成備份鑑定
5、因更快的恢復時間而提高線上時間
5、Xtrabackup的兩個工具
1)xtrabackup :只能用於熱備份innodb,xtradb兩種資料引擎表的工具,不能備份其他表。
2)innobackupex:是一個對xtrabackup封裝的perl指令碼,提供了用於myisam(會鎖表)和innodb引擎,及混合使用引擎備份的能力。主要是為了方便同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作為slave需要的一些資訊,根據這些資訊,可以很方便的利用備份來重做slave。 innobackupex比xtarbackup有更強的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量備份/恢復,還可以基於時間的增量備份與恢復。innobackupex同時支援innodb,myisam。
6、Xtrabackup可以做什麼
1)線上(熱)備份整個庫的InnoDB, XtraDB表
2)在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)
3)以流的形式產生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)
MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。
7、Xtrabackup工具工作原理
支援對InnoDB儲存引擎的增量備份
1)首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)。
2)在進行增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN。首先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的資料檔案.ibd;在拷貝全部資料檔案結束之後,才停止拷貝logfile。因為logfile裡面記錄全部的資料修改情況,所以,即時在備份過程中資料檔案被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持資料的一致。
8、innobackupex備份mysql資料的流程
innobackupex首先呼叫xtrabackup來備份innodb資料檔案,當xtrabackup完成後,innobackupex就檢視檔案xtrabackup_suspended ;然後執行“FLUSH TABLES WITH READ LOCK”來備份其他的檔案。
9、innobackupex恢復mysql資料的流程
innobackupex首先讀取my.cnf,檢視變數(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)對應的目錄是存在,確定相關目錄存在後,然後先copy myisam表和索引,然後在copy innodb的表、索引和日誌。
10、innobackupex備份和恢復的工作原理
(1)備份的工作原理
1、備份開始時首先會開啟一個後臺檢測程序,實時檢測mysql redo的變化,一旦發現redo中有新的日誌寫入,立刻將日誌記入後臺日誌檔案xtrabackup_log中。
2、之後複製innodb的資料檔案和系統表空間檔案ibdata1,待複製結束後。
3、執行flush tables with read lock操作。
4、複製.frm,MYI,MYD,等檔案(執行flush tableswith read lock的目的是為了防止資料表發生DDL操作,並且在這一時刻獲得binlog的位置)。
5、最後會發出unlock tables,把表設定為可讀可寫狀態。
6、最終停止xtrabackup_log。
(2)恢復的工作原理
1、為了恢復一個備份,innobackupex需要以–copy-back選項啟動。
2、innobackupex將會首先通過my.cnf檔案讀取如下變數:datadir,innodb_data_home_dir,innodb_data_file_path, innodb_log_group_home_dir,並確定這些目錄存在。
3、接下來,此指令碼將會首先拷貝MyISAM表、索引檔案、其他型別的檔案(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files)
4、接下來拷貝InnoDB表資料檔案,最後拷貝日誌檔案。
5、拷貝執行時將會保留檔案屬性,在使用備份檔案啟動MySQL前,可能需要更改檔案的owener(如從拷貝檔案的user更改到mysql使用者)。
後記
感謝您閱讀。