Xtrabackup實現資料庫備份和災難恢復

wolfreturn發表於2015-09-14
Percona Xtrabackup實現資料庫備份和災難恢復

1、工具介紹
2、工具安裝
3、備份策略及準備測試資料
4、全備份資料
5、增量備份資料
6、災難恢復
7、總結

1、工具介紹
percona-xtrabackup軟體包中中包含了兩個工具,一個是xtrabackup,另一個是 innobackupex,innobackupex由perl進行封裝,在對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

159899.png



6.3、真正資料恢復

[root@mariadb ~]# innobackupex --copy-back /backup/fullbackup/2015-04-15_16-30-19/  #僅一個“--copy-back”選項

如果報 main::get_option('datadir') called at /usr/bin/innobackupex line 2442

        main::copy_back(0) called at /usr/bin/innobackupex line 1570

innobackupex: Error: no 'datadir' option in group 'mysqld' in server configuration file '' at /usr/bin/innobackupex line 4518.

需要加--defaults-file=my.cnf引數

[root@guoqing mysql]# cat /usr/my.cnf

[mysqld]

server-id=11

relay-log=/var/lib/mysql/slave-relay-bin

datadir=/var/lib/mysql/

replicate-do-db=abc

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

log-bin

innodb_data_home_dir = /var/lib/mysql/

innodb_log_group_home_dir = /var/lib/mysql/

[root@guoqing mysql]#

[root@guoqing ~]# innobackupex -defaults-file=/usr/my.cnf --copy-back /backup/fullbackup/2015-08-27_19-42-55/

468619.png

458615.png
[root@mariadb ~]# ls /mnt/mydata/data/
ibdata1  mydb1  mysql  performance_schema  test
[root@mariadb ~]# chown -R mysql.mysql /mnt/mydata/data/  #修改恢復資料的屬主與屬組

356588.png
[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、利用二進位制日誌檔案基於時間點恢復

檢視最後一次增量備份時的二進位制日誌檔案及資訊:
[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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24742969/viewspace-1798895/,如需轉載,請註明出處,否則將追究法律責任。

相關文章