1. 程式人生 > >Xtrabackup實現MySQL備份

Xtrabackup實現MySQL備份

一.xtrabackup介紹

Xtrabackup是一個對InnoDB做資料備份的工具,支援線上熱備份(備份時不影響資料讀寫)它由percona提供的mysql資料庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb資料庫進行熱備的工具。

特點:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁碟空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
注意:xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表 但是innobackupex:是將xtrabackup進行封裝的perl指令碼,提供了備份myisam表的能力

二.下載安裝xtrabackup

2.1下載xtrabackup的rpm包

https://www.percona.com/downloads/XtraBackup/LATEST/

2.2安裝相關依賴包

[[email protected] ~]# yum install -y prel-DBD-MySQL perl-DBI perl-Time-HiRes libaio*

2.3安裝xtrabackup的rpm包

[[email protected] ~]# rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing... ########################################### [100%]
1:percona-xtrabackup-24 ########################################### [100%]

如果報錯:
[[email protected] ~]# rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.11-1.el6.x86_64
提示缺少libev的rpm包


http://rpm.pbone.net/index.php3?stat=26&dist=74&size=74692&name=libev-4.15-1.el6.rf.x86_64.rpm(livev包下載地址)
安裝libev包再安裝xtrabackup即可
[[email protected] ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
warning: libev-4.15-1.el6.rf.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
Preparing... ########################################### [100%]
1:libev ########################################### [100%]

2.4 檢視安裝結果:

[[email protected] ~]# rpm -qa | grep xtrabackup
percona-xtrabackup-24-2.4.11-1.el6.x86_64
[[email protected] ~]# rpm -ql percona-xtrabackup-24-2.4.11-1.el6.x86_64
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.11
/usr/share/doc/percona-xtrabackup-24-2.4.11/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz


Xtrabackup中主要包含兩個工具:
xtrabackup:是用於熱備份innodb, xtradb表中資料的工具,不能備份其他型別的表,也不能備份資料表結構;
innobackupex:是將xtrabackup進行封裝的perl指令碼,提供了備份myisam表的能力。

三.使用xtrabackup對MySQL完全備份

3.1完全備份


語法:innobackupex --user=使用者名稱 --password=密碼 備份目錄位置
如果報錯:Can't load '/usr/local/lib64/perl5/auto/DBD/mysql/mysql.so' for module DBD::mysql: libmysqlclient.so.18: 無法開啟共享物件 at /usr/bin/innobackupex line 18
需要拷貝libmysqlclient.so.18至/usr/lib64
cp /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
#完全備份到/mysql_backup/目錄下
[[email protected] ~]# innobackupex --user=root /mysql_backup/
180504 17:28:28 completed OK! (出現ok即可)
備份後的檔案:在備份的同時,備份資料會在備份目錄下建立一個以當前日期時間為名字的目錄存放備份檔案。

檢視備份後的資料

 

各檔案說明:
(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)一個完全備份
一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態。

[[email protected] 2018-05-04_17-28-25]# innobackupex --apply-log /mysql_backup/2018-05-04_17-28-25/
180504 17:38:38 completed OK!
在實現“準備”的過程中,innobackupex通常還可以使用–use-memory選項來指定其可以使用的記憶體的大小,預設通常為100M。如果有足夠的記憶體可用,可以多劃分一些記憶體給prepare的過程,以提高其完成速度。

3.2 完全備份恢復

#複製目錄到/zha下
[[email protected] ~]# cp -r /mysql_backup/2018-05-04_17-28-25/ /zha (以防玩脫)


#模擬資料庫故障(關閉資料庫並刪除資料檔案)
[[email protected] ~]# /etc/init.d/mysqld stop
Shutting down MySQL. [ OK ]
[[email protected] ~]# cd /usr/local/mysql/data/
[[email protected] data]# ls
ibdata1 mysql-bin.000001 performance_schema
ib_logfile0 mysql-bin.000002 test
ib_logfile1 mysql-bin.000003 zha
mysql mysql-bin.index zha.err
[[email protected] data]# rm -rf *
[[email protected] data]# ls (資料已經沒有了)


#恢復
[[email protected] data]# innobackupex --copy-back /mysql_backup/2018-05-04_17-28-25/
180504 18:04:14 completed OK!
如果報錯Error: datadir must be specified. 意思是(在預設配置檔案 /etc/my.cnf 中,沒有找到 datadir 配置項)

vim /etc/my.cnf # 加入 datadir 配置項即可
datadir = /usr/local/mysql/data

#再次檢視/data目錄,資料已經恢復
[[email protected] data]# ls
ibdata1 performance_schema
ib_logfile0 xtrabackup_info
ib_logfile1 xtrabackup_master_key_id
ibtmp1 zha
mysql


#修改許可權啟動mysql
[[email protected] ~]# chown -R mysql:mysql /usr/local/mysql/data/
[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL.. [ OK ]

四. 使用xtrabackup對MySQL增量備份

4.1建立測試庫、表,然後插入測試資料

mysql> create database test character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table test (id int(10) not null,name varchhar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test values(1,'chenjiaxin');
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values(1,'陳嘉欣');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+------------+
| id | name |
+----+------------+
| 1 | chenjiaxin |
| 1 | 陳嘉欣 |
+----+------------+
2 rows in set (0.00 sec)
mysql> exit;
Bye


#第一次完全備份
[[email protected] ~]# innobackupex --user=root --database=test --no-timestamp /mysql_backup/
180504 18:35:39 completed OK!


#第二次新增資料
mysql> use test;
Database changed
mysql> insert into test values(2,'test');
Query OK, 1 row affected (0.04 sec)

mysql> exit;
Bye


#第一次增量備份
[[email protected] mysql_backup]# innobackupex --user=root --database=test --no-timestamp --incremental-basedir=/mysql_backup/ --incremental /test2
180504 18:48:24 completed OK!


# --incremental-basedir=/data/backup_db/test_incre 第一次增備指定全備路徑
# --incremental 引數說明這是一次增備,並指定增備路徑

4.2統計大小,驗證是否為增量備份

[[email protected] /]# du -sh /mysql_backup/
69M /mysql_backup/
[[email protected] /]# du -sh /test2/
1.5M /test2/
至此增量備份已經完成!

注意: 第二次增備是在第一次增備的基礎上,所以 --incremental-basedir 指定的是第一次增備目錄,最後指定的第二次增備目錄

[[email protected] /]# cd /test2/
[[email protected] test2]# cat xtrabackup_checkpoints
backup_type = incremental # backup_type 提示:這是一次增備
from_lsn = 1599830 #from_lsn 提示:從上次結束開始1599380
to_lsn = 1600863 #from_lsn 提示:到1600863結束
last_lsn = 1600863
compact = 0
recover_binlog_info = 0