MySQL 5.6 xtrabackup 全量和增量的備份和恢復

urgel_babay發表於2016-02-29

xtrabackup 備份和恢復

    較之於MySQL自身的備份mysqldump,類似於Oracle的export。小資料量時效率還行,當資料量達到一定規模時,使用mysqldump執行備份的時間也許還可接受,但恢復時間基本就不能忍受了。
這時就需要一種好用又高效的工具,xtrabackup就是其中一款,號稱免費版的InnoDB HotBackup。
Xtrabackup提供了兩種命令列工具:
xtrabackup:專用於備份InnoDB引擎的資料;
innobackupex:這是一個perl指令碼,在執行過程中會呼叫xtrabackup命令,這樣用該命令即可以實現備份InnoDB,也可以備份MyISAM引擎的物件。
 
一、Xtrabackup備份原理
  XtraBackup基於InnoDB的crash-recovery功能。它會複製innodb的data file,由於不鎖表,複製出來的資料是不一致的,在恢復的時候使用crash-recovery,使得資料恢復一致。
  InnoDB維護了一個redo log,又稱為transaction log,事務日誌,它包含了innodb資料的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,並且會做二步操作:
  XtraBackup在備份的時候, 一頁一頁地複製innodb的資料,而且不鎖定表,與此同時,XtraBackup還有另外一個執行緒監視著transactions log,一旦log發生變化,就把變化過的log pages複製走。為什麼要急著複製走呢? 因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,所以新資料可能會覆蓋到舊的資料。在prepare過程中,XtraBackup使用複製到的transactions log對備份出來的innodb data file進行crash recovery。

注意:xtrabackup只備份資料檔案,並不備份資料表結構(.frm),所以使用xtrabackup恢復的時候,你必須有對應表結構檔案(.frm)。
所以要手動備份一下,以便xtrabackup恢復的時候使用。


二、備份操作:
   1 . 全量備份操作:

點選(此處)摺疊或開啟

  1. [root@zhanglin bin]./xtrabackup --backup --log-stream --target-dir=/mysqlbak/xtrabackup/20141022 --datadir=/usr/local/mysql/data
  2. ./xtrabackup version 2.2.3 based on MySQL server 5.6.17 Linux (x86_64) (revision id: )
  3. xtrabackup: uses posix_fadvise().
  4. xtrabackup: cd to /usr/local/mysql/data
  5. xtrabackup: open files limit requested 0, set to 1024
  6. xtrabackup: using the following InnoDB configuration:
  7. xtrabackup: innodb_data_home_dir = ./
  8. xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
  9. xtrabackup: innodb_log_group_home_dir = ./
  10. xtrabackup: innodb_log_files_in_group = 2
  11. xtrabackup: innodb_log_file_size = 50331648

  12. -------略
  13. [01] Copying ./mdm_pro/org_organ_business_group.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_business_group.ibd
  14. [01] ...done
  15. [01] Copying ./mdm_pro/coding_rule.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/coding_rule.ibd
  16. [01] ...done
  17. [01] Copying ./mdm_pro/org_store_channel.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_store_channel.ibd
  18. [01] ...done
  19. [01] Copying ./mdm_pro/dim_org_store.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/dim_org_store.ibd
  20. [01] ...done
  21. [01] Copying ./mdm_pro/org_organ_region.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_region.ibd
  22. [01] ...done
  23. [01] Copying ./mdm_pro/org_organ_managing_city.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_managing_city.ibd
  24. [01] ...done
  25. [01] Copying ./mdm_pro/pro_barcode.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/pro_barcode.ibd
  26. [01] ...done
  27. [01] Copying ./mdm_pro/type_duibi_back.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/type_duibi_back.ibd
  28. [01] ...done
  29. >> log scanned up to (18573586827)
  30. [01] Copying ./mdm_pro/org_store.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_store.ibd
  31. [01] ...done
  32. >> log scanned up to (18573586827)
  33. xtrabackup: The latest check point (for incremental): \'18573586827\'
  34. xtrabackup: Stopping log copying thread.
  35. .>> log scanned up to (18573586827)

  36. xtrabackup: Transaction log of lsn (18573586258) to (18573586827) was copied.
  37. [root@zhanglin bin]


2. 增量備份概念:

MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。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保持資料的一致。
  在增量備份的目錄下,資料檔案都是以.delta結尾的。增量備份只備份上一次全量備份後被修改過的page,所以增量備份只暫用較少的空間。增量備份可以在增量備份的基礎上增量。
增量備份優點:
  1、資料庫太大沒有足夠的空間全量備份,作增量備份有效節省空間,且效率高。
  2、支援熱備份。備份過程不鎖表,不受時間限制,不影響使用者使用。
  3、每日備份只產生少量資料,遠端備份傳輸更方便。同時節省空間。
  4、備份恢復基於檔案操作,降低直接對資料庫操作風險。
  5、備份效率更高,恢復效率更高。

提醒一下可能出現的錯誤:
(a)、在做增量備份的時候,如果--target-dir跟全量的一樣,就會出現下面的報錯
[root@zhanglin bin]# ./xtrabackup --backup --log-stream --target-dir=/mysqlbak/xtrabackup/20141022 --datadir=/usr/local/mysql/data --incremental-

basedir=/mysqlbak/xtrabackup/20141022_full_in
xtrabackup: Error: cannot open /mysqlbak/xtrabackup/20141022_full_in/xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from /mysqlbak/xtrabackup/20141022_full_in/xtrabackup_checkpoints

(b)、 同時如果--incremental-basedir= 引數的最後目錄不是base也會出錯。
[root@zhanglin bin]# ./xtrabackup --backup --log-stream --target-dir=/mysqlbak/xtrabackup/20141022_full_in --datadir=/usr/local/mysql/data --incremental-

basedir=/mysqlbak/xtrabackup/20141022-test
xtrabackup: Error: cannot open /mysqlbak/xtrabackup/20141022-test/xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from /mysqlbak/xtrabackup/20141022-test/xtrabackup_checkpoints

增量備份操作:

點選(此處)摺疊或開啟

  1. [root@zhanglin bin]# ./xtrabackup --backup --log-stream --target-dir=/mysqlbak/xtrabackup/20141022_full_in --datadir=/usr/local/mysql/data --incremental-basedir=/mysqlbak/xtrabackup/base
  2. ./xtrabackup version 2.2.3 based on MySQL server 5.6.17 Linux (x86_64) (revision id: )
  3. incremental backup from 16888466657 is enabled.
  4. xtrabackup: uses posix_fadvise().
  5. xtrabackup: cd to /usr/local/mysql/data
  6. xtrabackup: open files limit requested 0, set to 1024
  7. xtrabackup: using the following InnoDB configuration:
  8. xtrabackup: innodb_data_home_dir = ./
  9. xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
  10. xtrabackup: innodb_log_group_home_dir = ./
  11. xtrabackup: innodb_log_files_in_group = 2
  12. xtrabackup: innodb_log_file_size = 50331648
  13. >> log scanned up to (18580258871)
  14. >> log scanned up to (18580258871)
  15. xtrabackup: using the full scan for incremental backup
  16. [01] Copying ./ibdata1 to /mysqlbak/xtrabackup/20141022_full_in/ibdata1.delta

  17. ----
  18. [01] Copying ./mdm_pro/mid_org_area.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/mid_org_area.ibd.delta
  19. [01] ...done
  20. [01] Copying ./mdm_pro/org_organ_business_group.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_business_group.ibd.delta
  21. [01] ...done
  22. [01] Copying ./mdm_pro/coding_rule.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/coding_rule.ibd.delta
  23. [01] ...done
  24. [01] Copying ./mdm_pro/org_store_channel.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_store_channel.ibd.delta
  25. [01] ...done
  26. [01] Copying ./mdm_pro/dim_org_store.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/dim_org_store.ibd.delta
  27. [01] ...done
  28. [01] Copying ./mdm_pro/org_organ_region.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_region.ibd.delta
  29. [01] ...done
  30. [01] Copying ./mdm_pro/org_organ_managing_city.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_managing_city.ibd.delta
  31. [01] ...done
  32. [01] Copying ./mdm_pro/pro_barcode.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/pro_barcode.ibd.delta
  33. [01] ...done
  34. [01] Copying ./mdm_pro/type_duibi_back.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/type_duibi_back.ibd.delta
  35. >> log scanned up to (18580258871)
  36. [01] ...done
  37. [01] Copying ./mdm_pro/org_store.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_store.ibd.delta
  38. [01] ...done
  39. xtrabackup: The latest check point (for incremental): \'18580258871\'
  40. xtrabackup: Stopping log copying thread.
  41. .>> log scanned up to (18580258871)

  42. xtrabackup: Transaction log of lsn (18580258871) to (18580258871) was copied.
  43. [root@zhanglin bin]#

3、xtrabackup 引數介紹:

--defaults-file=#
預設配置檔案的路徑,如果不該引數,xtrabackup將從依次從以下位置查詢配置檔案/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,並讀取配置檔案中的[mysqld]和


[xtrabackup]配置段。[mysqld]中只需要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size

6個引數即可讓xtrabackup正常工作。

--defaults-extra-file=# 如果使用了該引數,在讀取了全域性配置檔案之後,會再讀取這裡指定的配置檔案
--target-dir=name 備份檔案的存放目錄路徑
--backup 實施備份到target-dir
--prepare 實施對備份檔案進行恢復前的準備(生成InnoDB log file)
--print-param 列印備份或恢復時需要的引數
--use-memory=# 該引數在 prepare 的時候使用,控制prepare時innodb例項使用的記憶體量
--suspend-at-end 在target-dir目錄下產生一個xtrabackup_suspended檔案,將xtrabackup程式掛起,不停地將資料檔案的變化同步到備份檔案,直到使用者手工刪除

xtrabackup_suspended檔案
--throttle=# 每秒IO次數,限制backup時使用的I/O操作量,使備份對資料庫正常業務的影響最小化
--log-stream 該引數在backup的時候使用,將xtrabackup_logfile的內容標準輸出,使用該引數時會自動使用suspend-at-end引數,innobackupex指令碼的stream 模式會使用該引數。
--incremental-lsn=name 增量備份時只複製LSN比該引數指定值新的ibd pages,前次備份到了哪個LSN可以看前次備份集的xtrabackup_checkpoints檔案
--incremental-basedir=name 該引數在backup的時候使用,備份比該引數指定位置的備份集新的idb pages
--incremental-dir=name 該引數在prepare的時候使用,指定prepare時產生的.delta 檔案和日誌檔案的存放路徑
--tables=name 在備份file-per-table型別的資料檔案時使用,使用正規表示式指定需要備份的innodb表
--datadir=name MySQL資料庫的資料檔案目錄。


三、全量和增量恢復:
我們需要分別對全量、增量備份各做一次prepare操作。如果只是做全量恢復,就只需要執行一次你之前的全量就可以了,這裡給出命令。
./xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/mysqlbak/xtrabackup/20141022

./xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/mysqlbak/xtrabackup/20141022_full_in --incremental-basedir=/mysqlbak/xtrabackup/base

 

提醒:xtrabackup只備份InnoDB資料檔案,表結構是不備份的,所以恢復的時候,你必須有對應表結構檔案(.frm)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30936525/viewspace-2016606/,如需轉載,請註明出處,否則將追究法律責任。

相關文章