INNOBACKUPEX的全備和增量備份恢復學習筆記

czxin788發表於2015-07-28

INNOBACKUPEX 的全備和增量備份恢復學習筆記

 

 

    說到備份MySQL資料庫,不少人可能會先想到其自帶的命令列工具mysqldump,要說這個工具確實不錯,操作簡單呼叫靈活,不過mysqldump屬於邏輯備份工具,類似ORACLE資料庫中的export,小資料量時效率尚可,當資料量達到一定規模時,使用mysqldump執行備份的時間也許還可接受,但恢復時間基本就不能忍受了。

 

這種情況下就需要一種好用又高效的工具,xtrabackup就是其中一款,號稱免費版的InnoDB HotBackup。

 

Xtrabackup提供了兩種命令列工具:

?1)xtrabackup:專用於備份InnoDB引擎的資料;

?2)innobackupex:這是一個perl指令碼,在執行過程中會呼叫xtrabackup命令,這樣

用該命令即可以實現備份InnoDB,也可以備份MyISAM引擎的物件。

 

Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫),是商業備份工具InnoDBHotbackup的一個很好的替代品。

(1)備份過程快速、可靠;

(2)備份過程不會打斷正在執行的事務;

(3)能夠基於壓縮等功能節約磁碟空間和流量;

(4)自動實現備份檢驗;

(5)還原速度快;

 

xtrabackup軟體可以到免費下載。

 

關於對xtrabackup安裝方法,可以參見:http://blog.itpub.net/28916011/viewspace-1753483/

一、備份

1.1、建立全備份集

[root@drbd-01 backup]# innobackupex --defaults-file=/etc/my.cnf --host 10.72.16.116 --port=3306 --user=root --password=123 --socket=/tmp/mysql.scok  /data/backup/full

 

執行完全備份後,可以對資料庫建幾張表,插入點資料,模擬資料庫完全備份後資料的增長,然後再執行增量備份。

 

1.2增量備份

1.2.1執行基於2015-07-28_12-10-45(全備)的增量備份

這時候可以在資料庫做點操作,模擬資料庫的資料有更新。

增量備份僅針對InnoDB這類支援事務的引擎,對於MyISAM等引擎,則仍然是全備了。
[root@drbd-01 backup]#  innobackupex --defaults-file=/etc/my.cnf -no-timestamp --incremental --incremental-basedir=/data/backup/full/2015-07-28_12-10-45/ --user=root --password=123 /data/backup/001

 

--incremental       說明是什麼備份 ,後面跟要增量備份的路徑

--incremental-basedir          指向上一次的增量備份所在的目錄

--no-timestamp        innobackupex--defaults-file=/etc/my.cnf --user=root --no-timestamp /data/backup/001使用--no-timestamp時,後面的這個011目錄必須跟上且不能提前自己建立,它由innobackupex自動建立,否則會報innobackupex: Error: Failed to create backup directory/data/backup/001: File exists at /usr/bin/innobackupex line 3899.)

 

1.2.2 執行基於/data/backup/001進行增量備份

這時候可以再對資料庫做點操作,模擬資料又進行增長,然後再做第二次增量備份。

[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf -no-timestamp --incremental --incremental-basedir=/data/backup/001  /data/backup/002

1.3 檢視備份資訊

INNOBACKUPEX的全備和增量備份恢復學習筆記可以透過以下檔案檢視備份資訊。

 [root@drbd-01 backup]# cat /data/backup/full/2015-07-28_12-10-45/xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 3194902

last_lsn = 3194902

compact = 0

[root@drbd-01 backup]# cat /data/backup/001/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 3194902

to_lsn = 3198776

last_lsn = 3198776

compact = 0

[root@drbd-01 backup]# cat /data/backup/002/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 3198776

to_lsn = 3202726

last_lsn = 3202726

compact = 0

 

上面看到,可以透過lsn看到這3個備份集關係。

 

 

小知識:

也可以透過此命令來進行指定lsn的方式進行備份

[root@drbd-01 backup]# innobackupex --user=root --password=123 --defaults-file=/etc/my.cnf --no-timestamp --incremental --incremental-lsn=3198776 /data/backup/003

 

 

二 恢復

刪除原來的mysql資料目錄/data/mysql,建立新的資料庫目錄,用來模擬資料庫損壞。

[root@drbd-01 data]#rm –rf /data/mysql

[root@drbd-01 data]# cd /data/

[root@drbd-01 data]# mkdir mysql

[root@drbd-01 data]# chown mysql.mysql mysql

 

2.1 先Prepare完整備份集(應用日誌)

一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”即prepare的主要作用正是透過回滾未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態,innobakupex命令的--apply-log選項可用於實現上述功能。

 

[root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/

 

--apply-log         在資料庫備份好後,這些備份的資料並不能立即用於恢復,因為這些剛備份的資料裡包含了未提交的資料,需要回滾,oracle裡稱undo資料!也包括的已完成的事務在重做日誌檔案中並沒有寫入資料檔案中,這些資料需要重做!oracle裡稱redo!  這個引數正是用於做這些事情,以保證資料檔案的一致性!在資料庫恢復之前,須先對備份的資料檔案應用此引數!(innobackup會重現重做日誌檔案(redo log file)中的事務條目,重做已經提交的事務和回滾未提交的事務!)

 

--redo-only          該選項表示在應用完成redo日誌之後,針對未提交的事務不執行回滾操作,因為前一個沒有提交的事務有可能在下一個備份中提交了,否則後續的增量備份無法進行恢復了。該選項需要結合--apply-log選項一起使用用。 但是最後一個增量備份的資料檔案恢復時不要加--redo-only了。


2.2 Prepare增量備份集

2.2.1 合併第一個增量備份到完全備份裡面

 [root@drbd-01 mysql]# innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/001/

 

INNOBACKUPEX的全備和增量備份恢復學習筆記2.2.2 將最後一次增量備份應用日誌(不用--redo-only)並且合併到全備庫中

為什麼這次不用 —redo-only 了呢?這是因為除了最後的一個增量備份外,前面的事務都不應該進行回滾因為有可能前一個沒有提交的事物在下一個備份中提交了,如果進行了回滾則有可能導致資料不一致從而無法進行還原。

[root@drbd-01 data]# innobackupex --defaults-file=/etc/my.cnf --apply-log  /data/backup/full/2015-07-28_12-10-45/ --incremental-dir=/data/backup/002

 

2.3 執行恢復操作

[root@drbd-01 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2015-07-28_12-10-45/

           上述恢復時,只指定完全恢復的目錄就行,因為前面已經做過把其他增量備份的資料合併到全備份目錄裡面了。

  --copy-back     把備份資料複製回server的datadir,它決定於my.cnf中的datadir引數,另外在恢復時datadir目錄必須是空的,並且mysql資料庫必須是shudown的!

 

修改許可權及屬主:

chown -R  mysql:mysql  /data/mysql

 

2.4、恢復完成,接下來啟動mysql服務

servce mysql start

 

2.5 登入資料庫進行驗證資料是否恢復到最新資料狀態

 

2.6 附錄

2.6.1 增量備份指令碼

此指令碼出自:

http://blog.csdn.net/yangzhawen/article/details/30282993

 

#cat backup.sh

 

點選( 此處)摺疊或開啟

  1. # ! /bin /sh
  2.  #
  3.  # 第一次執行它的時候它會檢查是否有完全備份 ,否則先建立一個全庫備份
  4. # 當你再次執行它的時候,它會根據指令碼中的設定來基於之前的全庫備份進行增量備份
  5. #備份的日誌在$BACKUP_DIR目錄下,
  6. #ocpyang@126 .com
  7.  
  8. INNOBACKUPEX_PATH =innobackupex  #INNOBACKUPEX的命令
  9. INNOBACKUPEXFULL = /usr /bin / $INNOBACKUPEX_PATH  #INNOBACKUPEX的命令路徑
  10.  
  11. #mysql目標伺服器以及使用者名稱和密碼
  12. MYSQL_CMD = "--host=10.72.16.116 --user=root --password=123 --port=3306"
  13.  
  14. MYSQL_UP = "--user=root --password=123 " #mysql的使用者名稱和密碼
  15.  
  16. TMPLOG = "/tmp/innobackupex.$$.log"
  17.  
  18. MY_CNF = /etc /my .cnf #mysql的配置檔案
  19.  
  20. MYSQL = /usr /bin /mysql
  21.  
  22. MYSQL_ADMIN = /usr /bin /mysqladmin
  23.  
  24. BACKUP_DIR = /backup # 備份的主目錄
  25.  
  26. FULLBACKUP_DIR = $BACKUP_DIR /full # 全庫備份的目錄
  27.  
  28. INCRBACKUP_DIR = $BACKUP_DIR /incre # 增量備份的目錄
  29.  
  30. FULLBACKUP_INTERVAL =604800 # 全庫備份的間隔週期,時間:秒,604800是間隔7天
  31.  
  32. KEEP_FULLBACKUP =1 # 至少保留幾個全庫備份
  33.  
  34. logfiledate =backup . `date + %Y%m%d% H %M` .txt
  35. LOG_DIR = /backup /log
  36.  
  37. #開始時間
  38. STARTED_TIME = `date + % s `
  39. #date + %s從 1970 年 1 月 1 日 00 :00 :00 UTC 到目前為止的秒數
  40.  
  41.  
  42. #############################################################################
  43.  
  44. # 顯示錯誤並退出
  45.  
  46. #############################################################################
  47.  
  48. error ( )
  49.   {
  50.      echo "$1" 1 > &2
  51.      exit 1
  52.   }
  53.  
  54.  
  55.  
  56. # 檢查執行環境
  57.  
  58. if [ ! -x $INNOBACKUPEXFULL ] ; then
  59.    error "$INNOBACKUPEXFULL未安裝或未連結到/usr/bin."
  60.  fi
  61. # -x 測試是否有執行許可權
  62.  
  63.  
  64. if [ ! -d $BACKUP_DIR ] ; then
  65.    error "備份目標資料夾:$BACKUP_DIR不存在."
  66. fi
  67.  
  68.  
  69.  
  70. if [ -z "`$MYSQL_ADMIN $MYSQL_UP status | grep 'Uptime'`" ] ; then
  71.   error "MySQL 沒有啟動執行."
  72. fi
  73.  
  74.  # -z   空字串
  75.  
  76.  
  77.  
  78. if ! `echo 'exit' | $MYSQL - s $MYSQL_CMD` ; then
  79.   error "提供的資料庫使用者名稱或密碼不正確!"
  80. fi
  81.  
  82. #mysql - s , - -silent / /一行一行輸出,中間用tab分隔
  83.  
  84.  
  85. # 備份的頭部資訊
  86.  
  87. echo "----------------------------"
  88. echo
  89.  echo "$0: MySQL備份指令碼"
  90. echo "開始於: `date +%F' '%T' '%w`"
  91.  echo
  92. #上面的$0 表示當前執行的程式名或是當前執行的指令碼名
  93.  
  94.  
  95. #新建全備和差異備份的目錄
  96.  
  97. mkdir - p $FULLBACKUP_DIR
  98.  mkdir - p $INCRBACKUP_DIR
  99.  mkdir - p $LOG_DIR
  100.  
  101.  
  102. #查詢最新的完全備份
  103. LATEST_FULL_BACKUP = `find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 - type d -printf "%P\n" | sort -nr | head -1`
  104.  
  105. # -mindepthd 1 ,表示從$FULLBACKUP_DIR目錄的第0層開始查; -maxdepth 1,表示列出$FULLBACKUP_DIR內的檔案時深度最多為0層
  106.  
  107.  
  108. # 查詢最近修改的最新備份
  109.  
  110. LATEST_FULL_BACKUP_CREATED_TIME = `stat -c %Y $FULLBACKUP_DIR / $LATEST_FULL_BACKUP`
  111. #stat -c %Y 獲取檔案的修改時間
  112.  
  113.  #如果全備有效進行增量備份否則執行完全備份
  114. if [ "$LATEST_FULL_BACKUP" - a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
  115.  # 如果最新的全備未過期則以最新的全備檔名命名在增量備份目錄下新建目錄
  116. echo -e "完全備份$LATEST_FULL_BACKUP未過期,將根據$LATEST_FULL_BACKUP名字作為增量備份目錄命名"
  117. echo "        "
  118.  NEW_INCRDIR = $INCRBACKUP_DIR / $LATEST_FULL_BACKUP
  119.  mkdir - p $NEW_INCRDIR
  120.  
  121.  
  122.  
  123. # 查詢最新的增量備份是否存在 .指定一個備份的路徑作為增量備份的基礎
  124. LATEST_INCR_BACKUP = `find $NEW_INCRDIR -mindepth 1 -maxdepth 1 - type d | sort -nr | head -1`
  125.  
  126. if [ ! $LATEST_INCR_BACKUP ] ; then
  127.  INCRBASEDIR = $FULLBACKUP_DIR / $LATEST_FULL_BACKUP
  128.  echo -e "增量備份將以$INCRBASEDIR作為備份基礎"
  129. echo "        "
  130.  else
  131.  INCRBASEDIR = $LATEST_INCR_BACKUP
  132.  echo -e "增量備份將以$INCRBASEDIR作為備份基礎"
  133. echo "        "
  134.  fi
  135.  
  136.  
  137.  
  138. echo "使用$INCRBASEDIR作為基礎做新的增量備份."
  139.  $INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G $MYSQL_CMD - -incremental $NEW_INCRDIR - -incremental -basedir $INCRBASEDIR > $TMPLOG 2 > &1
  140.  else
  141.  echo "*********************************"
  142.  echo -e "正在執行全新的完全備份...請稍等..."
  143. echo "*********************************"
  144. #$INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2 > &1
  145. $INNOBACKUPEXFULL - -defaults - file = $MY_CNF - -use -memory =4G - - rsync - - compress - - compress - threads = 5 - - compress - chunk - size =64K - -slave - info $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2 > &1
  146. #上面黃色是czxin加的,為了壓縮備份
  147.  fi
  148. # - -use -memory該引數在 prepare 的時候使用,控制 prepare 時 innodb 例項使用的記憶體量
  149.  
  150.  #保留一份備份的詳細日誌
  151.  
  152. cat $TMPLOG > $LOG_DIR / $logfiledate
  153.  
  154.  
  155.  
  156. if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then
  157.   echo "$INNOBACKUPEX命令執行失敗:" ; echo
  158.   echo -e "---------- $INNOBACKUPEX_PATH錯誤 ----------"
  159.   cat $TMPLOG
  160.   rm -f $TMPLOG
  161.   exit 1
  162.  fi
  163.  
  164.  
  165.  
  166. THISBACKUP = `awk - - "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
  167.  rm -f $TMPLOG
  168.  
  169.  
  170.  
  171. echo -n "資料庫成功備份到:$THISBACKUP"
  172.  echo
  173.  
  174.  
  175.  
  176. # 提示應該保留的備份檔案起點
  177. LATEST_FULL_BACKUP = `find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 - type d -printf "%P\n" | sort -nr | head -1`
  178.  echo -e "必須保留$KEEP_FULLBACKUP份全備和全備$LATEST_FULL_BACKUP以後的所有增量備份."
  179.  
  180.  
  181.  #刪除過期的全備
  182. #echo -e "尋找過期的全備檔案並刪除" > > $LOG_DIR / $logfiledate
  183.   for efile in $ ( /usr /bin /find $FULLBACKUP_DIR / -mindepth 1 -maxdepth 1 -mtime +8 )
  184.  do
  185.   if [ -d $efile ] ; then
  186.    /bin /rm rm -rf $efile
  187.   echo -e "刪除過期全備目錄:$efile" > > $LOG_DIR / $logfiledate
  188. #  elif [ -f $efile ] ; then
  189. # /bin /rm rm -rf $ file
  190. #  echo -e "刪除過期全備檔案:$efile" > > $LOG_DIR / $logfiledate
  191.   fi ;
  192.  
  193.  done
  194.  
  195. if [ $ ? -ne "0" ] ;then
  196.     echo
  197.     echo -e "未找到可以刪除的過期全備檔案" > > $LOG_DIR / $logfiledate
  198. fi
  199.  
  200. #刪除過期增量備份
  201. #echo -e "尋找過期的增量備份目錄並刪除" > > $LOG_DIR / $logfiledate
  202.   for efile in $ ( /usr /bin /find $INCRBACKUP_DIR / -mindepth 1 -maxdepth 1 -mtime +8 )
  203.  do
  204.   if [ -d $efile ] ; then
  205.    /bin /rm -rf $efile
  206.   echo -e "刪除過期增量備份目錄:$efile" > > $LOG_DIR / $logfiledate

  207.   fi ;
  208.  
  209.  done
  210.  
  211. if [ $ ? -ne "0" ] ;then
  212.     echo
  213.     echo -e "未找到可以刪除的過期增量備份檔案" > > $LOG_DIR / $logfiledate
  214. fi

  215.  
  216. echo
  217.  echo "完成於: `date +%F' '%T' '%w`"
  218.  exit 0



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

    相關文章