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為變量
?
參考文章:
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
?
總結
以上是生活随笔為你收集整理的MySQL在线备份与恢复工具 -- Xtrabackup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 椭圆曲线:超级完整的椭圆曲线学习记录
- 下一篇: mysql数据库存放视频路径_学习怎样把