Percona Xtrabackup實現Database Backup和災難恢複
目錄
1、工具介紹
2、工具安裝
3、備份策略及準備測試資料
4、全備份資料
5、增量備份資料
6、災難恢複
7、總結
1、工具介紹
percona-xtrabackup軟體包中中包含了兩個工具,一個是xtrabackup,另一個是innobackupex,innobackupex由per進行封裝,在對innodb表進行備份時會自動調用xtraback工具,所以對InnoDB表做備份的實際是xtrabackup這個工具,xtrabackup也只能對innodb表做備份,這是一個專門對innodb開發的熱備工具,而對myisam這樣的其他引擎的表則由innobackupex來負責備份,若是全備份加增量的方案,那每次增量innobackupex工具對非innodb表都是全備份且會請求讀鎖。
xtrabackup對innodb表進行備份時不再只是簡單複製檔案,而是利用在innodb儲存引擎層中的LSN(記錄序號)的新舊來識別這一資料頁是否需要備份。
xtraback工具對innodb引擎完美支援真正的熱備份,備份好的資料中資料檔案與交易記錄的檔案因innodb cache等因素的存在,所以備份好的資料和交易記錄中的資料往往是不一致的,所以,在做資料恢複時需要把交易記錄中已提交的事務做redo,沒有提交的事務做undo操作,這就是在做資料恢複時要做的準備工作,即prepare。
2、工具安裝
系統內容:
[root@mariadb ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
[root@mariadb software]# uname -r
2.6.32-358.el6.x86_64
安裝依賴包及percona-xtrabackup:
12 [root@mariadb ~]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
[root@mariadb ~]# rpm -ivh percona-xtrabackup-2.1.9-744.rhel6.x86_64.rpm #安裝的2.1.9版本
順便把percona的工具集裝上:
12 [root@mariadb ~]# yum -y install perl-IO-Socket-SSL #percona-toolkit依賴包
[root@mariadb ~]# rpm -ivh percona-toolkit-2.2.13-1.noarch.rpm
3、備份策略及準備測試資料
採用先全備份加增量備份的方案。在利用xtrabackup對innodb表做備份工作時,建議mysql啟用“innodb_file_per_table=1”變數,這樣使每表都有一個自己的資料表空間,不然很難進行單表備份與還原。還有一點建議,二進位記錄檔就不要與資料檔案放在同一個目錄了,你不想當資料丟失時,二進位日誌也一同丟了。
測試資料:
mysql> SELECT VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.36-log |
+------------+
1 row in set (0.00 sec)
mysql> SHOW DATABASES; #建立了一個mydb1資料庫
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb1 |
| mysql |
| performance_schema |
| test |
+--------------------+
mysql> SELECT * FROM mydb1.tb1; #表中只有一條資料
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tom | 10 |
+----+------+------+
建立備份資料存放目錄:
[root@mariadb ~]# mkdir -pv /backup/{fullbackup,incremental}
#fullbackup 存放全備份資料
#incremental 存放增量備份資料
建立複製使用者:
mysql> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkuser'@'localhost' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
4、全備份資料
[root@mariadb ~]# innobackupex --user=bkuser --password=123456 /backup/fullbackup/
#最後出現“150415 16:30:23 innobackupex: completed OK!”這樣的資訊表示備份完成
[root@mariadb ~]# ls /backup/fullbackup/2015-04-15_16-30-19/
backup-my.cnf mysql xtrabackup_binary xtrabackup_logfile
ibdata1 performance_schema xtrabackup_binlog_info
mydb1 test xtrabackup_checkpoints
[root@mariadb ~]# cat /backup/fullbackup/2015-04-15_16-30-19/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1644877
last_lsn = 1644877
compact = 0
5、增量備份資料
先做一些資料修改:
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('jack',20);
mysql> SELECT * FROM tb1; #增加一條資料
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | tom | 10 |
| 2 | jack | 20 |
+----+------+------+
做第一次增量備份:
[root@mariadb ~]# innobackupex --user=bkuser --password=123456 --incremental /backup/incremental/ --incremental-basedir=/backup/fullbackup/2015-04-15_16-30-19/
[root@mariadb ~]# ls /backup/incremental/2015-04-15_16-42-00/
backup-my.cnf mydb1 test xtrabackup_checkpoints
ibdata1.delta mysql xtrabackup_binary xtrabackup_logfile
ibdata1.meta performance_schema xtrabackup_binlog_info
[root@mariadb ~]# cat /backup/incremental/2015-04-15_16-42-00/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1644877 #這是全備時的"to_lsn"值
to_lsn = 1645178
last_lsn = 1645178
compact = 0
再做資料修改:
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('jason',30);
mysql> SELECT * FROM tb1;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 10 |
| 2 | jack | 20 |
| 3 | jason | 30 |
+----+-------+------+
做第二次增量備份:
[root@mariadb ~]# innobackupex --user=bkuser --password=123456 --incremental /backup/incremental/ --incremental-basedir=/backup/incremental/2015-04-15_16-42-00/
#這裡的"--incremental-basedir"是指向第一次增量備份的目錄
[root@mariadb ~]# ls /backup/incremental/2015-04-15_16-49-07/
backup-my.cnf mydb1 test xtrabackup_checkpoints
ibdata1.delta mysql xtrabackup_binary xtrabackup_logfile
ibdata1.meta performance_schema xtrabackup_binlog_info
[root@mariadb ~]# cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1645178 #這是第一次增量的"to_lsn"值
to_lsn = 1645463
last_lsn = 1645463
compact = 0
再來做一次資料修改,以便示範根據二進位日誌做時間點的恢複:
mysql> INSERT INTO mydb1.tb1 (name,age) VALUES ('lucky',40);
mysql> SELECT * FROM tb1;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 10 |
| 2 | jack | 20 |
| 3 | jason | 30 |
| 4 | lucky | 40 |
+----+-------+------+
6、災難恢複
6.1、資料破壞
[root@mariadb ~]# service mysqld stop
Shutting down MySQL.. SUCCESS!
[root@mariadb ~]# rm -rf /mnt/mydata/data/* #把資料目錄資料全部刪除
我對於xtrabackup做資料恢複的理解:
xtrabackup做資料恢複與mysqldump這樣的邏輯備份工作的恢複有很大的區別,xtrabackup進行資料恢複時需要把各個增量的資料備份與全備份的資料進行合并,對每次增量備份的合并只能將已提交的事務進行重放(redo),對合備份的資料恢複也只能做redo操作,把各個增量都合并完成後再把沒有提交的事務進行復原(undo)操作,合并完增量備份後,全備份的“xtrabackup_checkpoints”檔案中的“last_lsn”應該是最後一次增量備份時的值,這些合并做redo的過程就是恢複資料前的準備工作(prepare)。
而真正在做資料恢複,建議先把全備和增量備份的檔案都copy一份為副本,避免操作失誤導致備份檔案的損壞。
6.2、資料恢複的準備(prepare)工作
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/
#準備全備份的資料
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-42-00/
#準備第一次增量資料
[root@mariadb ~]# innobackupex --apply-log --redo-only /backup/fullbackup/2015-04-15_16-30-19/ --incremental-dir=/backup/incremental/2015-04-15_16-49-07/
#準備第二次增量資料
[root@mariadb ~]# cat /backup/fullbackup/2015-04-15_16-30-19/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1645463 #這是最後一次增量備份的位置,到此資料已全部合并
last_lsn = 1645463
compact = 0
6.3、真正資料恢複
[root@mariadb ~]# innobackupex --copy-back /backup/fullbackup/2015-04-15_16-30-19/ #僅一個“--copy-back”選項
[root@mariadb ~]# ls /mnt/mydata/data/
ibdata1 mydb1 mysql performance_schema test
[root@mariadb ~]# chown -R mysql.mysql /mnt/mydata/data/ #修改恢複資料的屬主與屬組
[root@mariadb ~]# service mysqld start
Starting MySQL.. SUCCESS!
mysql> SELECT * FROM mydb1.tb1; #檢查資料
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 10 |
| 2 | jack | 20 |
| 3 | jason | 30 |
+----+-------+------+
#lucky資訊還沒有恢複
6.4、利用二進位記錄檔基於時間點恢複
查看最後一次增量備份時的二進位記錄檔及position資訊:
[root@mariadb ~]# cat /backup/incremental/2015-04-15_16-49-07/xtrabackup_binlog_info
mysql-bin.000031 1665
[root@mariadb ~]# mysqlbinlog --start-position=1665 /var/log/mysql_log/mysql-bin.000031 > /tmp/position.sql
#用mysqlbinlog工具匯出最後一次增量備份後的sql操作
匯入資料:
mysql> source /tmp/position.sql
mysql> SELECT * FROM mydb1.tb1;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 10 |
| 2 | jack | 20 |
| 3 | jason | 30 |
| 4 | lucky | 40 |
+----+-------+------+
#資料全部恢複
7、總結
利用innobackupex工具可對在有混合儲存引擎的情境下對資料庫進行全備份,當是備份innodb表時innobackupex指令碼內部會
自動調用xtrabackup工具來進行備份操作,在資料還原時應停止mysql執行個體,清空資料目錄,然後先做prepare準備工作,第二步才是真正的資料還原(--copy-back),資料還原到資料目錄後不要忘記修改資料目錄的許可權。
當然innobackupex工具也能實現對單庫單表的匯出、匯出,如果是對Innodb表,那建議直接用xtrabackup工具,這樣更直觀的使用各個選項進行備份。
有一個疑問:
在做全備份時,innobackupex會去備份非innodb表,在從innobackupex備份時輸出結果觀察它會“150412 23:17:22 innobackupex: Starting to lock all tables... ”鎖定所有的表,不知道這裡“鎖定所有表”是否包括innodb表?如果會,那xtrabackup就不是真正的熱備份工具。
MySQL管理之使用XtraBackup進行熱備
MySQL開源備份工具Xtrabackup備份部署
MySQL Xtrabackup備份和恢複
用XtraBackup實現MySQL的主從複製快速部署【主不鎖表】
安裝和使用 Percona 推出的 Xtrabackup 備份 MySQL
XtraBackup 的詳細介紹:請點這裡
XtraBackup 的:請點這裡
本文永久更新連結地址: