天天看點

MySQL線上備份與恢複工具 --> Xtrabackup - 風言楓語

MySQL線上備份與恢複工具 --> Xtrabackup

1 Xtrabackup原理簡介

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

    xtrabackup有兩個主要的工具:xtrabackup、innobackupex 

  (1)xtrabackup隻能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表   

  (2)innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的,innobackupex是一個perl腳本封裝,封裝了xtrabackup,是以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖。并且加入了一些使用的選項,如slave-info可以記錄備份恢複後,作為slave需要的一些資訊,根據這些資訊,可以很友善的利用備份來重做slave。   

  (3)使用幫助:http://www.percona.com/docs/wiki/percona-xtrabackup:start  

  (4)Xtrabackup可以做什麼  

  線上(熱)備份整個庫的InnoDB、 XtraDB表  

  在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)   

  以流的形式産生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)   

  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保持資料的一緻。  

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。  

 (5)實作細節  

  XtraBackup以read-write模式打開innodb的資料檔案,然後對其進行複制。其實它不會修改此檔案。也就是說,運作 XtraBackup的使用者,必須對innodb的資料檔案具有讀寫權限。之是以采用read-write模式是因為XtraBackup采用了其内置的 innodb庫來打開檔案,而innodb庫打開檔案的時候就是rw的。  

  XtraBackup要從檔案系統中複制大量的資料,是以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的資料,從 而提升性能。因為這些資料不會重用到了,OS卻沒有這麼聰明。如果要緩存一下的話,幾個G的資料,會對OS的虛拟記憶體造成很大的壓力,其它程序,比如 mysqld很有可能被swap出去,這樣系統就會受到很大影響了。  

  在備份innodb page的過程中,XtraBackup每次讀寫1MB的資料,1MB/16KB=64個page。這個不可配置。讀1MB資料之 後,XtraBackup一頁一頁地周遊這1MB資料,使用innodb的buf_page_is_corrupted()函數檢查此頁的資料是否正常, 如果資料不正常,就重新讀取這一頁,最多重新讀取10次,如果還是失敗,備份就失敗了,退出。在複制transactions log的時候,每次讀寫512KB的資料。同樣不可以配置。

2.1 Xtrabackup開源工具

支援線上熱備與恢複

大資料量的時候,備份恢複都比較快快

支援複制模式下的從機備份恢複備份恢複

缺點:在增量備份的時候,作為備份基礎的全備檔案不能壓縮,否則備份失效;增量的時候,表結構變更的話,變更部分備份無效。

安裝

rpm

版本

rpm-

ivh

xtrabackup-1.6-245.rhel5.x86_64.rpm

2.2 壓縮備份與解壓

備份:

innobackupex

  --user=root --port=3306--defaults-file=/etc/my.cnf --no-lock --socket=/data/

mbdata

/open/

mysql.sock

--stream=tar /home/backup/all/

alldb

  |

gzip

     1>/home/backup/all/

alldb.tar.gz

(40G 45

分鐘

)

解壓縮:

[

root@localhost

~]# tar -

izxvf

alldb.tar.gz

-C backup

2.3恢複

先停止資料庫

service

mysqld

stop;

(1)

innobackupex

--apply-log --user=root --defaults-file=/etc/my.cnf --no-lock /root/

alldb

(2)

:備份并删除原目錄

/open/

mbdata

/open/

下所有檔案

(3)

innobackupex

--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /root/

alldb

    【】如果磁盤不夠,直接[root@clonedb-m209alldb]#mv */data/mbdata/open/

(4)

chown

-R

mysql:mysql

/data/

mbdata

/open

(5)

service 

mysqld

start;

2.4增量備份

必須要有未壓縮的全量備份檔案目錄,先全量再增量

(1)

:周一全量備份,

   time /usr/bin/innobackupex  --user=root --password=******--host=127.0.0.1 --port=3307 --defaults-file=/etc/my.cnf --slave-info  --socket=/data/mbdata/open/mysql.sock--no-timestamp /home/backup/all/alldb  2>$dirlog

(2)

:剩下的周二到周日做增量備份

;

2.5 增量備份腳本

time /

usr

/bin/

innobackupex

  --user=root --password=****   --socket=/data/

mbdata

/open/

mysql.sock

--port=3307  --slave-info--defaults-file=/etc/my.cnf --no-timestamp --safe-slave-backup --incremental --incremental-

basedir

=/home/backup/all/

alldb

/home/backup/daily/daily_20120409 2>>/home/backup/daily/

dailybackup_$tday.log

2.5增量恢複(1)

•解壓縮檔案

•先全量恢複,然後增量恢複

•(1):首先恢複全備innobackupex--apply-log --user=root --defaults-file=/data/mbdata/my.cnf--no-lock /home/backup/all/alldb 

   PS:/home/backup/all/alldb是全量備份目錄

•(2):再恢複增量備份innobackupex/home/backup/all/alldb--incremental –incremental dir=/home/backup/daily/daily_2012_03_22 --apply-log

   PS:/home/backup/daily/daily_2012_03_22是增量備份目錄

•(3):停止資料庫,servicemysqldstop;然後備份并删除原目錄/open/mbdata/open/下所有檔案

•(4):還原資料庫到預設目錄 innobackupex--copy-back --user=root --defaults-file=/etc/my.cnf --no-lock /home/backup/all/alldb

2.5增量恢複(2)

•(5):chown-R mysql:mysql/data/mbdata/open

•(6):service  mysqldstart;

•(7):登陸mysql,驗證資料。

•總恢複時間:

45

分鐘左右

2.6遠端備份

/

usr

/bin/

innobackupex

  --user=root --port=3306--defaults-file=/data/

mbdata

/open/my.cnf  --slave-info --socket=/data/

mbdata

/open/

mysql.sock

--no-timestamp [email protected] --

scpopt

="-Cp-c

arcfour

"/home/backup/all/

alldb_$tday

2>>/home/backup/all/allbackup.log

ps:$tday2為變量

參考文章:

http://wenku.baidu.com/view/7a5d1e2f0722192e4536f656.html  

http://blog.csdn.net/ghosc/article/details/8211418 

http://www.percona.com/docs/wiki/percona-xtrabackup:xtrabackup_manual

posted on

2013-09-11 19:26 

風言楓語 

閱讀(215) 

評論(0) 

編輯 

收藏 

舉報

MySQL線上備份與恢複工具 --> Xtrabackup - 風言楓語