Xtrabackup 學習
一.概述
Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表
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。
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保持數據的一致。
2、innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是爲了方便的 同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作爲slave需要的一些信息,根據這些信息,可以很方便的利用備份來重做slave。
通常一般都直接使用innobackupex,因爲它能同時備份InnoDB和MyISAM引擎的表。要注意的是my.cnf裏datadir這個參數是必須要指定的,xtrabackup_55是根據它去定位innodb數據文件的位置。
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命令的目錄中除非加了--no-timestamp參數。
二、安裝Xtrabackup
apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
vi /etc/apt/sources.list
deb http://repo.percona.com/apt precise main ### precise 要跟自己的系統版本相對應
deb-src http://repo.percona.com/apt precise main
apt-get update
apt-get install percona-xtrabackup
官方的安裝教程:http://www.percona.com/doc/percona-xtrabackup/2.1/installation.html
三、簡單的全備
1.創建相應的用戶並賦予相應的權限
mysql> CREATE USER 'innobackup'@'localhost' IDENTIFIED BY 'qwer1234';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPER ON *.* TO 'innobackup'@'localhost';
mysql> FLUSH PRIVILEGES;
可以把用戶名和密碼寫進my.cnf這樣做備份的時候就可以不用輸入用戶名和密碼
vim /etc/mysql/my.cnf
[client]
user=innobackup
pass=qwer1234
2.全備
innobackupex --no-timestamp /data/backup/full/
Other options:
--no-timestamp :no to create a time stamped directory to store the backup
--defaults-file=/tmp/other-my.cnf :provide other configuration file to innobackupex
--parallel=4 :This option specifies the number of threads created by xtrabackup to copy data files
每個InnoDB頁(通常爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據
3.恢復前的準備
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobackupex --apply-log /data/backup/full/
Other options:
--use-memory=4G :it defaults to 100MB, the more memory available to the process, the better.
# This options that innobackupex replayed the committed transactions in the log files and rolled back the uncommitted ones.
# Once this is done, all the information lay in the tablespace (the InnoDB files), and the log files are re-created
# This implies calling xtrabackup –prepare twice with the right binary
# These modifications are only for the xtrabackup binary;
4.全備恢復
/etc/init.d/mysql stop
rm -rf /var/lib/mysql/*
innobackupex --copy-back /data/backup/full/
--copy-back選項用於執行恢復操作,其通過複製所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息
chown -R mysql:mysql /var/lib/mysql
/etc/init.d/mysql start
其他功能:
Xtrabackup的“流”及“備份壓縮”功能