一、簡介mysql
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:sql
(1)備份過程快速、可靠數據庫
(2)備份過程不會打斷正在執行的事務服務器
(3)可以基於壓縮等功能節約磁盤空間和流量app
(4)自動實現備份檢驗ide
(5)還原速度快工具
Xtrabackup提供了兩種命令行工具:spa
xtrabackup:專用於備份InnoDB引擎的數據;命令行
innobackupex:這是一個perl腳本,在執行過程當中會調用xtrabackup命令,這樣用該命令便可以實現備份InnoDB,也能夠備份MyISAM引擎的對象,可是對於InnoDB能夠進行徹底備份和增量備份,而MyISAM只能進行徹底備份不能增量備份;日誌
二、安裝
# rpm -ivh percona-xtrabackup-2.2.10-1.el5.i386.rpm
三、若是要使用一個最小權限的用戶進行備份,則可基於以下命令建立此類用戶
# mysql
mysql> CREATE USER 'bkpuser' @ 'localhost' IDENTIFIED BY 'luochen';
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'luochen';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'luochen'@'localhost';
mysql> FLUSH PRIVILEGES;
四、徹底備份
# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中。
在備份的同時,innobackupex還會在備份目錄中建立以下文件:
( 1 )xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的
( 2 )xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置
( 3 )xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position
( 4 )xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件
( 5 )backup-my.cnf —— 備份命令用到的配置選項信息
在使用innobackupex進行備份時,還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄。如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據。
五、準備(prepare)一個徹底備份
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
若是執行正確,其最後輸出的幾行信息一般以下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
在實現「準備」的過程當中,innobackupex一般還可使用--use-memory選項來指定其可使用的內存的大小,默認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度。
六、從一個徹底備份中恢復數據
innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
# innobackupex --copy-back /path/to/BACKUP-DIR
若是執行正確,其輸出信息的最後幾行一般以下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK!
請確保如上信息的最行一行出現「innobackupex: completed OK!」。
當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在啓動mysqld以前還須要事先修改數據文件的屬主和屬組。如:
# chown -R mysql:mysql /mydata/data/
七、使用innobackupex進行增量備份
每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加。這正是InnoDB表能夠進行增量備份的基礎,即innobackupex經過備份上次徹底備份以後發生改變的頁面來實現。
要實現第一次增量備份,可使用下面的命令進行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
( 1 )須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。
( 2 )基於全部的備份將未提交的事務進行「回滾」。因而,操做就變成了:
# innobackupex --apply-log --redo-only BASE-DIR //徹底備份目錄
接着執行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
然後是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是徹底備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做
八、從徹底備份和增量備份中恢復數據
# service mysqld stop
# rm -rf /mydata/data/*
# innobackupex --copy-back /back/徹底備份目錄
# cd /mydata/data
# chown -R mysql.mysql /mydata/data
# service mysqld start
最後驗證數據是否恢復回來
九、導入或導出單張表
默認狀況下,InnoDB表不能經過直接複製表文件的方式在mysql服務器之間進行移植,即使使用了innodb_file_per_table選項。而使用Xtrabackup工具能夠實現此種功能,不過,此時須要「導出」表的mysql服務器啓用了innodb_file_per_table選項(嚴格來講,是要「導出」的表在其建立以前,mysql服務器就啓用了innodb_file_per_table選項),而且「導入」表的服務器同時啓用了innodb_file_per_table和innodb_expand_import選項。
( 1 )「導出」表
導出表是在備份的prepare階段進行的,所以,一旦徹底備份完成,就能夠在prepare過程當中經過--export選項將某表導出了
# innobackupex --apply-log --export /path/to/backup
此命令會爲每一個innodb表的表空間建立一個以.exp結尾的文件,這些以.exp結尾的文件則能夠用於導入至其它服務器。
( 2 )「導入」表
要在mysql服務器上導入來自於其它服務器的某innodb表,須要先在當前服務器上建立一個跟原表表結構一致的表,然後才能實現將表導入
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;
而後將此表的表空間刪除:
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
接下來,未來自於「導出」表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,而後使用以下命令將其「導入」:
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;