MySQL在線備份與恢復工具 --> Xtrabackup

Xtrabackup原理簡介mysql

xtrabackup是一個對InnoDB作數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。 
    xtrabackup有兩個主要的工具:xtrabackup、innobackupex 
  (1)xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表   
sql

  (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)。    
app

  (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,而且會作二步操做: 
socket

 
  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-ivhxtrabackup-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(分鐘)
解壓縮:[root@localhost~]# tar -izxvfalldb.tar.gz-C backup

2.3恢復
先中止數據庫service mysqldstop;
(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-Rmysql:mysql/data/mbdata/open
(5)service mysqldstart;

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 --remote-host=root@10.100.200.53 --scpopt="-Cp-carcfour"/home/backup/all/alldb_$tday2>>/home/backup/all/allbackup.log
ps:$tday2爲變量
相關文章
相關標籤/搜索