使用xtrabackup對MySQL進行備份和恢復

轉自 : http://blog.csdn.net/yongsheng0550/article/details/6682162

Xtrabackup 是percona公司的開源項目,用以實現類似innodb官方的熱備份工具InnoDB Hot Backup的功能,能夠非常快速地備份與恢復mysql數據庫。 Xtrabackup中包含兩個工具:

xtrabackup是用於熱備份innodb, xtradb表中數據的工具,不能備份其他類型的表,也不能備份數據表結構;

innobackupex是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。

由於innobackupex的功能更爲全面和完善,所以,本文以innobackupex作爲基礎進行研究描述。

下載和安裝

在以下地址可以下載到xtrabackup:http://www.percona.com/downloads/XtraBackup/,可以根據自己的需要選擇穩定版本或者最新版本以及操作系統、源碼包或者rpm包等等。

我下載到的是xtrabackup-1.6.tar,是一個二進制壓縮包,解壓後可直接使用。

將下載到的文件包進行解壓 tar zxvf xtrabackup-1.6.tar,然後在/usr/bin中建立相關應用的鏈接:

[plain] view plain copy

  1. ln -s /usr/bin/innobackupex /root/xtrabackup-1.6/bin/innobackupex  

  2.   

  3. ln -s /usr/bin/xtrabackup /root/xtrabackup-1.6/bin/xtrabackup  

  4.   

  5. ln -s /usr/bin/xtrabackup_51 /root/xtrabackup-1.6/bin/xtrabackup_51  

  6.   

  7. ln -s /usr/bin/tar4ibd /root/xtrabackup-1.6/bin/tar4ibd  

其中,

innobackupex是我們要使用的備份工具;

xtrabackup是被封裝在innobackupex之中的,innobackupex運行時需要調用它;

xtrabackup_51是xtrabackup運行時需要調用的工具;

tar4ibd是以tar流的形式產生備份時用來打包的工具。

進行備份

完整備份:

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --database=test /mysqlbackup/  

其中,--user指定連接數據庫的用戶名,--password指定連接數據庫的密碼,--defaults-file指定數據庫的配置文件,innobackupex要從其中獲取datadir等信息;--database指定要備份的數據庫,這裏指定的數據庫只對MyISAM表和InnoDB表的表結構有效,對於InnoDB 數據來說都是全備(所有數據庫中的InnoDB數據都進行了備份,不是隻備份指定的數據庫,恢復時也一樣);/mysqlbackup是備份文件的存放位置。

完整備份並打包:

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --database=test --stream=tar /mysqlbackup > /mysqlbackup/dbbackup20110809.tar  

其中,--stream指定流的格式,目前只支持tar。

完整備份並打包壓縮:

[plain] view plain copy

  1. <strong></strong>innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --database=test --stream=tar /mysqlbackup/ | gzip /mysqlbackup/dbbackup20110809.tar.gz  

完整備份到遠程主機: 

[plain] view plain copy

  1. innobackupex --user=root --password= MySQLPASSWORD --defaults-file=/etc/my.cnf --database=test --stream=tar /mysqlbackup | ssh root@remote-host cat ">"   /mysqlbackup/dbbackup20110809.tar  

增量備份:

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --database=test --incremental --incremental-basedir=/mysqlbackup/2011-08-09_14-50-20/ /mysqlbackup/trn/  

其中,--incremental指明是增量備份,--incremental-basedir指定上次完整備份或者增量備份文件的位置。這裏的增量備份其實只針對的是InnoDB,對於MyISAM來說,還是完整備份。

進行恢復

完整備份恢復:

在進行恢復前,如果完整備份在遠程主機上,首先將完整備份複製到本地主機上,如果是tar包,則需要先解包,解包命令爲:tar –izxvf dbbackup20110809.tar,這裏必須使用-i參數。然後停止mysql數據庫並刪除欲恢復的數據庫文件夾,如:

[plain] view plain copy

  1. service mysql stop  

  2.   

  3. rm /var/lib/mysql/test –rf  

然後將備份文件中的日誌應用到備份文件中的數據文件上

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --apply-log /mysqlbackup/full/2011-08-09_14-50-20/  

這裏的--apply-log指明是將日誌應用到數據文件上,完成之後將備份文件中的數據恢復到數據庫中:

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --copy-back /mysqlbackup/full/2011-08-09_14-50-20/  

這裏的—copy-back指明是進行數據恢復。數據恢復完成之後,需要修改相關文件的權限mysql數據庫才能正常啓動。

[plain] view plain copy

  1. chown mysql:mysql /var/lib/mysql/ib*  

  2.   

  3. chown mysql:mysql /var/lib/mysql/test  

  4.   

  5. service mysql start  

注意:這裏我雖然指定的是test數據庫,但實際上如果其他數據庫中也有InnoDB表,那麼這些InnoDB表中的數據也會被恢復了。

增量備份恢復:

增量備份恢復的步驟和完整備份恢復的步驟基本一致,只是應用日誌的過程稍有不同。增量備份恢復時,是先將所有的增量備份挨個應用到完整備份的數據文件中,然後再將完整備份中的數據恢復到數據庫中。命令如下:

應用第一個增量備份

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --apply-log /mysqlbackup/full/2011-08-09_14-50-20/ --incremental-dir=/mysqlbackup/trn/2011-08-09_15-12-43/  

應用第二個增量備份

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --apply-log /mysqlbackup/full/2011-08-09_14-50-20/ --incremental-dir=/mysqlbackup/trn/2011-08-05_15-15-47/  

將完整備份中的數據恢復到數據庫中

[plain] view plain copy

  1. innobackupex --user=root --password=MySQLPASSWORD --defaults-file=/etc/my.cnf --copy-back /mysqlbackup/full/2011-08-05_14-50-20/  

其中,--incremental-dir指定要恢復的增量備份的位置

相關原理

完整備份的原理:

對於InnoDB,XtraBackup基於InnoDB的crash-recovery功能進行備份。

crash-recovery是這樣的:InnoDB維護了一個redo log,又稱爲 transaction log,也叫事務日誌,它包含了InnoDB數據的所有改動情況。InnoDB啓動的時候先去檢查datafile和transaction log,然後應用所有已提交的事務並回滾所有未提交的事務。

XtraBackup在備份的時候並不鎖定表,而是一頁一頁地複製InnoDB的數據,與此同時,XtraBackup還有另外一個線程監視着transactions log,一旦log發生變化,就把變化過的log pages複製走(因爲transactions log文件大小有限,寫滿之後,就會從頭再開始寫,新數據可能會覆蓋到舊的數據,所以一旦變化就要立刻複製走)。在全部數據文件複製完成之後,停止複製logfile。

XtraBackup採用了其內置的InnoDB庫以read-write模式打開InnoDB的數據文件,然後每次讀寫1MB(1MB/16KB=64page)的數據,一頁一頁地遍歷,同時用InnoDB的buf_page_is_corrupted()函數檢查此頁的數據是否正常,如果正常則進行復制,如不正常則重新讀取,最多重讀10次,如果還是失敗,則備份失敗退出。複製transactions log的原理也是一樣的,只不過每次讀寫512KB(512KB/16KB=32page)的數據。

由於XtraBackup其內置的InnoDB庫打開文件的時候是rw的,所以運行XtraBackup的用戶,必須對InnoDB的數據文件具有讀寫權限。

由於XtraBackup要從文件系統中複製大量的數據,所以它儘可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據(因爲這些數據不會重用到了),從而提升性能。如果要緩存的話,大量的數據會對OS的虛擬內存造成很大的壓力,其它進程(如mysqld)很有可能會被swap出去,這樣就出問題了。同時,XtraBackup在讀取數據的時候還儘可能地預讀。

由於不鎖表,所以複製出來的數據是不一致的,數據的一致性是在恢復的時候使用crash-recovery進行實現的。

對於MyISAM,XtraBackup還是首先鎖定所有的表,然後複製所有文件。

增量備份的原理:

在完整備份和增量備份文件中都有一個文件xtrabackup_checkpoints會記錄備份完成時檢查點的LSN。在進行新的增量備份時,XtraBackup會比較表空間中每頁的LSN是否大於上次備份完成的LSN,如果是,則備份該頁,並記錄當前檢查點的LSN。

其他

目前XtraBackup的最新版本是1.6.2,但是我下載了1.6.2的rpm包xtrabackup-1.6.2-274.rhel5.i386,在CentOS5.5上安裝後,發現在恢復時有點問題。

不指定數據庫的配置文件時(數據庫的配置文件爲默認的/etc/my.cnf),執行命令

[plain] view plain copy

  1. innobackupex --copy-back /mysqlbackup/full/2011-08-09_14-09-43/  

會報錯:

[html] view plain copy

  1. InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy  

  2.   

  3. and Percona Inc 2009-2011.  All Rights Reserved.  

  4.   

  5.    

  6.   

  7. This software is published under  

  8.   

  9. the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.  

  10.   

  11.    

  12.   

  13. IMPORTANT: Please check that the copy-back run completes successfully.  

  14.   

  15.            At the end of a successful copy-back run innobackupex  

  16.   

  17.            prints "completed OK!".  

  18.   

  19.    

  20.   

  21. Can't exec "autodetect": No such file or directory at /usr/bin/innobackupex line 1972.  

  22.   

  23. innobackupex: fatal error: no 'mysqld' group in MySQL options  

  24.   

  25. innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options  


指定數據庫的配置文件時,執行命令

[plain] view plain copy

  1. innobackupex --defaults-file=/etc/my.cnf --copy-back /mysqlbackup/full/2011-08-09_14-09-43/  

會報錯:

[plain] view plain copy

  1. InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy  

  2.   

  3. and Percona Inc 2009-2011.  All Rights Reserved.  

  4.   

  5.    

  6.   

  7. This software is published under  

  8.   

  9. the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.  

  10.   

  11.    

  12.   

  13. IMPORTANT: Please check that the copy-back run completes successfully.  

  14.   

  15.            At the end of a successful copy-back run innobackupex  

  16.   

  17.            prints "completed OK!".  

  18.   

  19.    

  20.   

  21. sh: autodetect: command not found  

  22.   

  23. innobackupex: fatal error: no 'mysqld' group in MySQL options  

  24.   

  25. innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options  


這個問題,我分別在百度和GOOGLE上搜索了下,各有一個人提出了這個問題,但是沒有解答。也有人將這個問題提交給了percona,懷疑這是1.6.2的bug,不知道其他人有沒有遇到過!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章