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安装相关依赖包
[root@zha ~]# yum install -y prel-DBD-MySQL perl-DBI perl-Time-HiRes libaio*
2.3安装xtrabackup的rpm包
[root@zha ~]# 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%]
如果报错:
[root@zha ~]# 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即可
[root@zha ~]# 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 查看安装结果
[root@zha ~]# rpm -qa | grep xtrabackup percona-xtrabackup-24-2.4.11-1.el6.x86_64 [root@zha ~]# 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/目录下
[root@zha ~]# 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)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
[root@zha 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下
[root@zha ~]# cp -r /mysql_backup/2018-05-04_17-28-25/ /zha (以防玩脱)
#模拟数据库故障(关闭数据库并删除数据文件)
[root@zha ~]# /etc/init.d/mysqld stop Shutting down MySQL. [ OK ] [root@zha ~]# cd /usr/local/mysql/data/ [root@zha 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 [root@zha data]# rm -rf * [root@zha data]# ls (数据已经没有了)
#恢复
[root@zha 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目录,数据已经恢复
[root@zha data]# ls ibdata1 performance_schema ib_logfile0 xtrabackup_info ib_logfile1 xtrabackup_master_key_id ibtmp1 zha mysql
#修改权限启动mysql
[root@zha ~]# chown -R mysql:mysql /usr/local/mysql/data/ [root@zha ~]# /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
#第一次完全备份
[root@zha ~]# 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
#第一次增量备份
[root@zha 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统计大小,验证是否为增量备份
[root@zha /]# du -sh /mysql_backup/ 69M /mysql_backup/ [root@zha /]# du -sh /test2/ 1.5M /test2/
至此增量备份已经完成!
注意: 第二次增备是在第一次增备的基础上,所以 --incremental-basedir 指定的是第一次增备目录,最后指定的第二次增备目录
[root@zha /]# cd /test2/ [root@zha 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