Percona Xtrabackup可以說是一個完美的數據備份工具。特別是當數據庫的容量達到了一定數量級的時候且存在單表達到幾十G的數據量, 很難容忍一些邏輯備份的漫長時間。如單個數據庫約200G,單表最大為120G,mysqldump邏輯備份的時間長達20多小時。除此之外,也不好驗證邏輯備份的可用性與數據的一致性。去年就層簡單使用過了Xtrabackup,但是一直沒有用于生成環境。最近的一個集群需要搭建一主多從,數量約130G,也不能影響主庫的正常工作,Xtrabackup作為了首選的備份工具。
1、Percona Xtrabackup的優點
1)可以快速可靠的完成數據備份(復制數據文件和追蹤事務日志)
2)數據備份過程中不會中斷事務的處理(熱備份)
3)節約磁盤空間和網絡帶寬
4)自動完成備份檢定
5)因更快的恢復時間而提高在線時間
2、備份原理
innobackupex在后臺線程不斷追蹤InnoDB的日志文件,然后復制InnoDB的數據文件。數據文件復制完成之后,日志的復制線程也會結束。這樣就得到了不在同一時間點的數據副本和開始備份以后的事務日志。完成上面的步驟之后,就可以使用InnoDB崩潰恢復代碼執行事務日志(redo log),以達到數據的一致性。
備份分為兩個過程:
1)backup,備份階段,追蹤事務日志和復制數據文件(物理備份)。
2)preparing,重放事務日志,使所有的數據處于同一個時間點,達到一致性狀態。
3、安裝支持包
yum install cmake gcc gcc-c++ -y yum install automake autoconf -y yum install bzr zlib-devel libgcrypt-devel -y yum install libaio libaio-devel?? bison libtool ncurses-devel -y
4、編譯innobackupex
在percona-xtrabackup-2.1.7目錄下,執行./utils/build.sh
#./utils/build.sh Build an xtrabackup binary against the specified InnoDB flavor.Usage: build.sh CODEBASE where CODEBASE can be one of the following values or aliases: innodb51???????? | plugin??????????????? build against InnoDB plugin in MySQL 5.1 innodb55???????? | 5.5?????????????????? build against InnoDB in MySQL 5.5 innodb56???????? | 5.6,xtradb56,???????? build against InnoDB in MySQL 5.6 | mariadb100,galera56 xtradb51???????? | xtradb,mariadb51????? build against Percona Server with XtraDB 5.1 | mariadb52,mariadb53 xtradb55???????? | galera55,mariadb55??? build against Percona Server with XtraDB 5.5
從上面可以看到不同版本mysql代碼庫的別名,選擇上面第一列的值就可以編譯生成對應版本的innobackupex備份工具。
我的使用的mysql5.5版本,那么執行./utils/build.sh innodb55。
注意編譯過程中出現的錯誤,大多情況下出錯是因為缺少支持的依賴包。編譯完成之后,生成以下幾個可執行文件,并復制到一個工作目錄中。
cp innobackupex /usr/local/bin/ cp src/xbcrypt? /usr/local/bin/ cp src/xbstream /usr/local/bin/ cp src/xtrabackup_innodb55 /usr/local/bin/#在使用innobackupex備份的過程提示找不到xtrabackup_55,需要把xtrabackup_innodb55重命名一下或者復制一份。(提示錯誤“xtrabackup_55: command not found”) cp /usr/local/bin/xtrabackup_innodb55? /usr/local/bin/xtrabackup_55
5、innobackupex的參數選項
這里只簡單一些常用的命令選項
--help???? 查詢所有的命令選項,能夠快速地了解選項的功能。 --user???? 數據庫帳號 --password 數據庫帳號密碼 --host?? ??? 備份數據庫的IP或者主機名,TCP/IP連接--default-files 指定配置文件(必須作為第一個參數選項) --no-timestamp? 備份文件時不會創建一個時間點名字目錄,直接存放到指定的目錄中,如2013-03-25_00-00-09。--apply-log?? ?備份后的文件不能只用用來恢復,數據并不完整,里面有未完成(提交或者回滾)的的事物。使用該選項可以撤銷(undone)未提交的事務,或者重放(replay)事務日志。--use-memory 默認值100M,通過使用更大的內存,加速preparing的過程。 --copy-back?? ? 把備份數據復制到數據目錄。數據目錄最好為一個空目錄,且有mysql用戶的讀寫權限。--compact 不備份二級索引數據頁。
6、備份操作過程
按照備份原理中步驟,操作分別如下。
1)backup,創建數據備份
innobackupex --defaults-file=/etc/my_9306.cnf?? --user=root --password='extension@123' --host=127.0.0.1 --port=9306 /opt/xtrabackup/
2)preparing,undo撤銷未提交的事務,重放redo log
innobackupex --defaults-file=/etc/my_9306.cnf?? --user=root --password='extension@123' --host=127.0.0.1 --port=9306 --apply-log /opt/xtrabackup/2014-03-05_10-09-06
7、搭建復制從服務器
1)關閉從服務器上的mysqld進程。把上面創建的一致性備份復制到從服務器上的,并mysql的數據目錄(比如data)和日志目錄(默認在data目錄中)備份。把這兩個目錄清空,mysql用戶對這兩個目錄有寫權限。
2)把備份目錄中的所有文件復制到數據目錄中,也可以在從上安裝Xtrabackup,使用–copy-back選項,把數據復制回數據目錄。
3)啟動mysqld,注意mysql的錯誤日志的輸出信息。
4)現在就可以開始啟動從服務器上的復制功能,主從的復制的功能就不多說了。mysql主上的備份時bin-log信息保存xtrabackup_binlog_info文件中,這個文件在備份目錄下面。
cat xtrabackup_binlog_info mysql-bin.000023?? ?109899810
5)設置同步點
CHANGE MASTER TO MASTER_HOST='192.168.1.10',? MASTER_USER='replication', MASTER_PASSWORD='replication', MASTER_PORT=9306, MASTER_LOG_FILE='mysql-bin.000023',? MASTER_LOG_POS=109899810;
注意查看IO線程和SQL線程的狀態。
總結
Xtrabackup第一次用于生產上備份,120G的數據備份時間不到兩個小時。備份過程中服務器的負載沒有明顯的上升。備份的數據(包括索引數據)比原始的數據略大一點,當把備份數據庫復制到其他的服務器上或者異地機房時,需要很長的網絡傳輸時間或者很大的網絡帶寬資源。如果有專用的備份服務器,對于一些大表,可以刪除索引或者備份的過程中不備份索引數據。innobackupex使用–conpact選項,就可以不備份二級索引數據。另外可以通過innodb fast index creation來快速創建二級索引。對于大數據庫的備份,Percona Extrabackup是最佳的選擇。高數據一致、快速備份與恢復,值得擁有。