mysql 開發進階篇系列 48 物理備份與恢復(xtrabackup 的增量備份與恢復,以及備份總結)


一.增量備份概述

  xtrabackup  和innobackupex  二個工具都支持增量備份,這意味着能復制自上次備份以來更改的數據。可以在每個完整備份之間執行許多增量備份,因此,您可以設置一個備份過程,例如每周一次完整備份和每天一次增量備份,或者每天一次完整備份和每小時一次增量備份。對於定期自動備份可以在備份目錄里生成帶有時間戳的目錄。

  增量備份之所以有效,是因為每個InnoDB頁面都包含一個日志序列號(LSN)。每個頁面的LSN顯示了最近的變化。增量備份復制每個頁面,對比增量備份或完整備份的LSN, 查找要復制的頁面集。有二個算法來查找LSN。第一個算法是:直接通過讀取所有數據頁來檢查LSN頁面。Percona服務器提供的第二個算法是:在服務器上啟用已更改的頁面跟蹤功能,當頁面被更改時,該功能會注意到這些頁面。

  這些信息將被寫入一個緊湊的單獨的位圖文件。xtrabackup二進制文件將僅使用該文件讀取增量備份所需的數據頁,從而可能節省許多讀取請求。如果xtrabackup二進制文件找到位圖文件,則默認啟用后一種算法。即使位圖數據可用,也可以使用xtrabackup --incremental-force-scan強制掃描來讀取所有頁面。

  增量備份實際上不會將數據文件與前一個備份的數據文件進行比較。實際上,您可以使用xtrabackup--incremental-lsn來執行增量備份,甚至不需要以前的備份,如果你知道它的LSN。增量備份只需讀取頁面並將其LSN與上一個備份的LSN進行比較。但是,您仍然需要一個完整的備份來恢復增量更改;如果沒有作為基礎的完整備份,增量備份是無用的。

 

二. 增量備份案例

  要進行增量備份,請像往常一樣從完全備份開始,xtrabackup二進制文件寫入一個名為xtrabackup_checkpoints 進入備份的目標目錄,這個文件包含一行內容to_lsn,是備份結束時數據庫的LSN。

  步驟1: 創建完整數據庫備份,這里不在演示(上一篇有講到)。完全備份結束后,如果您查看xtrabackup_checkpoints文件,會看到LSN  number相關的版本號。以及備份類型為full -backuped。

        
    最后我把/data/backups的完整備份目錄改成了/data/backups/base。

  步驟2:現在已經有了完整的備份,可以基於它進行增量備份。首先創建/data/backups/inc1 目錄。

[root@hsr backups]# mkdir inc1
[root@hsr backups]# chmod 777 inc1
[root@hsr backups]# ls
base  inc1
-- 下面新增一條數據
INSERT INTO test.`testbackup` VALUES(11,'小王')

  步驟3:增量備份

 [root@hsr backups]# xtrabackup  --host=127.0.0.1 --user bkpuser --password=123456   --backup  --target-dir=/data/backups/inc1 
                           --incremental-basedir=/data/backups/base

    增量備份完成后,查看增量備份的xtrabackup_checkpoints文件,這里的from_lsn是備份的起始LSN,對於增量備份,它必須與完整備份或上一次增量備份的to_lsn(如果它是最后一個檢查點)相同,這里的完全備份to_lsn與增量備份from_lsn 相同都是125146873序號。這里備份類型為incremental。如下圖所示:
        

  步驟4 : 增量備份(2)
    現在可以使用inc1這個目錄作為另一個增量備份的基礎了,下面先插入一條數據,開始第二次增量備份。首先創建/data/backups/inc2目錄

[root@hsr backups]# mkdir inc2
[root@hsr backups]# chmod 777 inc2
[root@hsr backups]# ls -l
總用量 0
drwxr-xr-x 6 root root 235 10月 10 12:53 base
drwxrwxrwx 6 root root 261 10月 10 13:05 inc1
drwxrwxrwx 2 root root   6 10月 10 13:15 inc2

-- 下面新增一條數據
INSERT INTO test.`testbackup` VALUES(12,'小李')
[root@hsr backups]# xtrabackup  --host=127.0.0.1 --user bkpuser --password=123456   --backup  --target-dir=/data/backups/inc2 
                           --incremental-basedir=/data/backups/inc1

    第二次增量備份成功后,下面是查看第二次增量備份的xtrabackup_checkpoints文件,起始的LSN 的 from_lsn序號與第一次增量備份的to_lsn 相同。
      

    注意:to_lsn(最后一個檢查點LSN)和last_lsn(最后一個復制的LSN)之間存在差異較大時,這意味着在備份過程中服務器上有一些流量。

 

三. prepare增量備份

  prepare參數,一般情況下,在備份完成后,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據 文件仍處於不一致狀態。-apply-log-only的作用是通過回滾未提交的事務以及同步已經提交的事務,使數據文件處於一致性狀態。
  警告:如果沒有使用 xtrabackup --apply-log-only 選項,防止回滾階段,那么增量備份將是無用的。
  上面創建了完全備份后,可以使用prepare增量備份,然后對完全備份應用增量差異。上面的備份目錄如下:
    /data/backups/base

    /data/backups/inc1

    /data/backups/inc2

  步驟1:prepare到完全備份,需要運行xtrabackup --prepare 防止回滾階段.

[root@hsr backups]# xtrabackup  --host=127.0.0.1 --user bkpuser --password=123456  --prepare --apply-log-only  --target-dir=/data/backups/base

  步驟2:prepare第一個增量備份應用於完整備份

[root@hsr backups]# xtrabackup  --host=127.0.0.1 --user bkpuser --password=123456  --prepare --apply-log-only  --target-dir=/data/backups/base 
                    --incremental-dir=/data/backups/inc1

  步驟3:准備第二個增量備份的過程與上面類似:將增量備份應用於(修改后的)基礎備份,然后將其數據及時向前滾動到第二個增量備份點:

[root@hsr backups]# xtrabackup  --host=127.0.0.1 --user bkpuser --password=123456  --prepare  --target-dir=/data/backups/base
                     --incremental-dir=/data/backups/inc2

  注意:xtrabackup  --apply-log-only合並除最后一個以外的所有增量備份,上面的prepare運用並沒有使用 --apply-log-only選項。即使在最后一步中使用了--apply-log-only選項。備份仍然是一致的,但在這種情況下,服務器將執行回滾階段。

  一旦准備好的增量備份與完全備份相同,它們可以以相同的方式恢復。上面將增量備份文件都應用到了/data/backup /base文件中,如下圖所示 完全備份的xtrabackup_checkpoints文件此時類型是 log-applied, 它的lsn與第二次增量備份的lsn相同了。
      

四. 恢復還原

-- 先停掉服務
[root@hsr data]# service mysql stop
-- 刪除data目錄下所有數據文件,安全起見可以先保存原有副本
[root@hsr data]# rm  -rf  /usr/local/mysql/data/*
-- 恢復
[root@hsr backups]# xtrabackup  --defaults-file=/etc/my.cnf  --host=127.0.0.1  --user bkpuser --password=123456 --copy-back --target-dir=/data/backups/base
-- 恢復之后,更改data目錄權限為mysql
[root@hsr data]# pwd
/usr/local/mysql/data
[root@hsr data]# chown -R mysql:mysql  ../data
-- 啟動服務成功
[root@hsr data]# service mysql start
Starting MySQL.. SUCCESS!

  最后查看test.`testbackup`表,二次增量備份的數據出來了。

 

   總結:學習xtrabackup差不多有5篇了,根據官網的文檔來學習還有壓縮備份、加密備份、部分備份等,還有一些高級功能:節流備份、無鎖二進制日志信息、加密的InnoDB表空間備份。以及不完全恢復,克隆到從庫slave。要完全掌握這個備份工具,還有很多知識點。這次學習算入門,以后在慢慢了解,並不斷完善整合到文章中。

     從42篇開始 到 48篇里,介紹了邏輯備份和物理備份, 邏輯備份保存是sql文本,可以在各種條件下恢復,但對於大數據量的系統,備份和恢復時間都會比較長。 物理備份則正好相反,由於它是基於文件的cp, 備份和恢復時間比較短,但備份的文件在不同平台上不一定兼容。 

       邏輯備份介紹了mysqldump工具是基於innodb引擎的,對於mysqlhotcopy工具沒有介紹,該工具是基於myisam引擎的,最后介紹了物理備份的熱備份工具xtrabackup。

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM