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-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(40G 45分鐘)
解壓縮:[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為變數
MySQL管理之使用XtraBackup進行熱備
MySQL開源備份工具Xtrabackup備份部署
MySQL Xtrabackup備份和恢複
用XtraBackup實現MySQL的主從複製快速部署【主不鎖表】
安裝和使用 Percona 推出的 Xtrabackup 備份 MySQL
XtraBackup 的詳細介紹:請點這裡
XtraBackup 的:請點這裡
本文永久更新連結地址: