XtraBackup完整備份與增量備份的原理

zping發表於2017-03-15

MySQL資料庫實現備份的操作包括完整備份增量備份等,本文我們主要介紹一下增量備份和完整備份的原理,接下來我們就一起來了解一下這部分內容。

完整備份的原理:

對於InnoDB,XtraBackup基於InnoDB的crash-recovery功能進行備份。

crash-recovery是這樣的:InnoDB維護了一個redo log,又稱為 transaction log,也叫事務日誌,它包含了InnoDB資料的所有改動情況。InnoDB啟動的時候先去檢查datafile和transaction log,然後應用所有已提交的事務並回滾所有未提交的事務。

XtraBackup在備份的時候並不鎖定表,而是一頁一頁地複製InnoDB的資料,與此同時,XtraBackup還有另外一個執行緒監視著transactions log,一旦log發生變化,就把變化過的log pages複製走(因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,新資料可能會覆蓋到舊的資料,所以一旦變化就要立刻複製走)。在全部資料檔案複製完成之後,停止複製logfile。

XtraBackup採用了其內建的InnoDB庫以read-write模式開啟InnoDB的資料檔案,然後每次讀寫1MB(1MB/16KB=64page)的資料,一頁一頁地遍歷,同時用InnoDB的buf_page_is_corrupted()函式檢查此頁的資料是否正常,如果正常則進行復制,如不正常則重新讀取,最多重讀10次,如果還是失敗,則備份失敗退出。複製transactions log的原理也是一樣的,只不過每次讀寫512KB(512KB/16KB=32page)的資料。

由於XtraBackup其內建的InnoDB庫開啟檔案的時候是rw的,所以執行XtraBackup的使用者,必須對InnoDB的資料檔案具有讀寫許可權。

由於XtraBackup要從檔案系統中複製大量的資料,所以它儘可能地使用posix_fadvise(),來告訴OS不要快取讀取到的資料(因為這些資料不會重用到了),從而提升效能。如果要快取的話,大量的資料會對OS的虛擬記憶體造成很大的壓力,其它程式如mysqld)很有可能會被swap出去,這樣就出問題了。同時,XtraBackup在讀取資料的時候還儘可能地預讀。

由於不鎖表,所以複製出來的資料是不一致的,資料的一致性是在恢復的時候使用crash-recovery進行實現的。

對於MyISAM,XtraBackup還是首先鎖定所有的表,然後複製所有檔案。

增量備份的原理:

在完整備份和增量備份檔案中都有一個檔案xtrabackup_checkpoints會記錄備份完成時檢查點的LSN。在進行新的增量備份時,XtraBackup會比較表空間中每頁的LSN是否大於上次備份完成的LSN,如果是,則備份該頁,並記錄當前檢查點的LSN。

相關文章