《MySQL 系列连载之 XtraBackup 增量热备 or 恢复实践(3)》要点:
本文介绍了MySQL 系列连载之 XtraBackup 增量热备 or 恢复实践(3),希望对您有用。如果有疑问,可以联系我们。
如果您在本文遇到任何问题或疑问请到QQ群中与我们交流.也可在下方进行评论.我将在第一时间和您进行交流,共同学习.
QQ群:201777608、526871767、1689067(加群时注明:运维派)
特别注意:
innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备.
增量备份需要基于全量备份
先假设我们已经有了一个全量备份(如上面的/backup/mysql/data/2017-04-04_16-56-35),我们需要在该全量备份的基础上做第一次增量备份.
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ –incremental /backup/mysql/data
其中:
–incremental-basedir 指向全量备份目录 –incremental 指向增量备份的目录
上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2017-04-04_14-37-24),在该目录下存放着增量备份的所有文件.
[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 16:59 2017-04-04_16-58-58 //增量备份目录
在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,其中可以查出
1)全量备份的信息如下:
[root@master data]# cd /backup/mysql/data/2017-04-04_16-56-35/
[root@master 2017-04-04_16-56-35]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1639436
last_lsn = 1639436
compact = 0
2)基于以上全量备份的增量备份的信息如下:
[root@master data]# cd /backup/mysql/data/2017-04-04_16-58-58/
[root@master 2017-04-04_16-58-58]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0
从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn.
那么,我们是否可以在增量备份的基础上再做增量备份呢?
答案是肯定的,只要把–incremental-basedir执行上一次增量备份的目录即可,如下所示:
[root@master data]# innobackupex –defaults-file=/etc/my.cnf –user=root –incremental-basedir=/backup/mysql/data/2017-04-04_16-58-58/ –incremental /backup/mysql/data
[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 16:59 2017-04-04_16-58-58 //增量备份目录1
drwxr-xr-x 6 root root 4096 4月 4 17:02 2017-04-04_17-02-35 //增量备份目录2
它的trabackup_checkpoints记录着备份信息如下:
[root@master ~]# cd /backup/mysql/data/2017-04-04_17-02-35/
[root@master 2017-04-04_17-02-35]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0
可以看到,第二次增量备份的from_lsn是从上一次增量备份的to_lsn开始的
增量备份的恢复要比全量备份复杂很多,增量备份与全量备份有着一些不同,尤其要注意的是:
1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”.“重放”之后,所有的备份数据将合并到完全备份上.
2)基于所有的备份将未提交的事务进行“回滚”.于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交
第一步是在所有备份目录下重做已提交的日志(注意备份目录路径要跟全路径)
其中:
一定要全路径
BASE-DIR 是指全量备份的目录
INCREMENTAL-DIR-1 是指第一次增量备份的目录
INCREMENTAL-DIR-2 是指第二次增量备份的目录,以此类推.
这里要注意的是:
1)最后一步的增量备份并没有–redo-only选项!回滚进行崩溃恢复过程
2)可以使用–use_memory提高性能.
3)以上语句执行成功之后,最终数据在BASE-DIR(即全量目录)下,其实增量备份就是把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原.
第一步完成之后,我们开始下面关键的第二步,即拷贝文件,进行全部还原!注意:必须先停止mysql数据库,然后清空数据库目录(这里是指/data/mysql/data)下的文件.
4)innobackupex –copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录(这里指/data/mysql/data)的权限是否正确(修改成mysql:mysql),然后再重启mysql.
接下来进行案例说明:
假设我们已经有了一个全量备份2017-04-04_16-56-35 删除在上面测试创建的两个增量备份
[root@master ~]# cd /backup/mysql/data/
[root@master data]# ll
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-58-58
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_17-02-35[root@master data]# rm -fr 2017-04-04_16-58-58 2017-04-04_17-02-35
[root@master data]# ll
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35
假设在全量备份后,mysql数据库中又有新数据写入
#进入数据库
[root@master data]# mysql#创建一个叫做 ceshi 的数据库
mysql> create database ceshi;
Query OK, 1 row affected (0.00 sec)#切换到 ceshi 库下
mysql> use ceshi
Database changed#创建一个叫做 test1 的表
mysql> create table test1(
-> id int3,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.26 sec)#往test1表中插入数据
mysql> insert into test1 values(1,”chenbaojia”);
Query OK, 1 row affected (0.05 sec)#查看 test1 表中的内容
mysql> select * from test1;
+——+————+
| id | name |
+——+————+
| 1 | chenbaojia |
+——+————+
1 row in set (0.00 sec)#查看当前所有数据库
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
+——————–+
5 rows in set (0.00 sec)
然后进行一次增量备份:
[root@master data]# innobackupex –defaults-file=/etc/my.cnf –user=root –incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ –incremental /backup/mysql/data/
[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:28 2017-04-04_17-28-14 //增量备份目录
接着再在mysql数据库中写入新数据
[root@master data]# mysql
mysql> use ceshi;
Database changedmysql> insert into test1 values(2,”pelosi”);
Query OK, 1 row affected (0.11 sec)mysql> insert into test1 values(3,”hiofo”);
Query OK, 1 row affected (0.06 sec)mysql> insert into test1 values(4,”mac”);
Query OK, 1 row affected (0.09 sec)mysql> select * from test1;
+——+————+
| id | name |
+——+————+
| 1 | chenbaojia |
| 2 | pelosi |
| 3 | hiofo |
| 4 | mac |
+——+————+
4 rows in set (0.00 sec)
接着在增量的基础上再进行一次增量备份
–incremental-basedi 要写上次最后增量备份的目录
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –incremental-basedir=/backup/mysql/data/2017-04-04_17-28-14/ –incremental /backup/mysql/data
[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 4月 4 17:08 2017-04-04_16-56-35 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:28 2017-04-04_17-28-14 //全量备份目录
drwxr-xr-x 6 root root 4096 4月 4 17:38 2017-04-04_17-37-58 //全量备份目录
现在删除数据库ceshi 、 test
[root@master ~]# mysql
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
+——————–+
5 rows in set (0.00 sec)mysql> drop database ceshi;
Query OK, 1 row affected (0.07 sec)mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
+——————–+
3 rows in set (0.00 sec)
接下来就开始进行数据恢复操作:
先恢复应用日志(注意最后一个不需要加–redo-only参数)
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –apply-log –redo-only /backup/mysql/data/2017-04-04_16-56-35/
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –apply-log –redo-only /backup/mysql/data/2017-04-04_16-56-35/ –incremental-dir=/backup/mysql/data/2017-04-04_17-28-14/
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –apply-log /backup/mysql/data/2017-04-04_16-56-35/ –incremental-dir=/backup/mysql/data/2017-04-04_17-37-58/
到此,恢复数据工作还没有结束!还有最重要的一个环节,就是把增量目录下的数据整合到全量备份目录下,然后再进行一次全量还原.
停止mysql数据库,并清空数据目录
[root@master ~]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS!
[root@master ~]# rm -fr /application/mysql/data/*
最后拷贝文件,并验证数据目录的权限
[root@master ~]# innobackupex –defaults-file=/etc/my.cnf –user=root –copy-back /backup/mysql/data/2017-04-04_16-56-35/
[root@master ~]# chown -R mysql.mysql /application/mysql/data/*
[root@master ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
[root@master ~]# mysql
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| test |
| xtra_test |
+——————–+
6 rows in set (0.00 sec)mysql> select * from ceshi.test1;
+——+————+
| id | name |
+——+————+
| 1 | chenbaojia |
| 2 | pelosi |
| 3 | hiofo |
| 4 | mac |
+——+————+
4 rows in set (0.00 sec)
另外注意: 上面在做备份的时候,将备份目录和增量目录都放在了同一个目录路径下,其实推荐放在不同的路径下,方便管理!比如:
/backup/mysql/data/full 存放全量备份目录
/backup/mysql/data/daily1 存放第一次增量备份目录
/backup/mysql/data/daily2 存放第二次增量目录
以此类推
在恢复的时候,注意命令中的路径要跟对!
xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm).用innobackupex命令,此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小).
innobackupex 常用参数说明 –defaults-file 同xtrabackup的–defaults-file参数
–apply-log 对xtrabackup的–prepare参数的封装
–copy-back 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
–remote-host=HOSTNAME 通过ssh将备份数据存储到进程服务器上;
–stream=[tar] 备 份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定–stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件). 在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数–tmpdir指定目录来解决这个问题.
–tmpdir=DIRECTORY 当有指定–remote-host or –stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
–redo-only –apply-log组, 强制备份日志时只redo ,跳过rollback.这在做增量备份时非常必要.
–use-memory=# 该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
–throttle=IOS 同xtrabackup的–throttle参数
–sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
–compress[=LEVEL] 对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
–include=REGEXP 对 xtrabackup参数–tables的封装,也支持ibbackup.备份包含的库表,例如:–include=”test.”,意思是要备份 test库中所有的表.如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:–include=”test.test1|test.test2″.也可以使用通配符,如:–include=”test.test”.
–databases=LIST 列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
–uncompress 解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
–slave-info, 备 份从库, 加上–slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE=”, MASTER_LOG_POS=0
–socket=SOCKET 指定mysql.sock所在位置,以便备份进程登录mysql.
更多参数见:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/innobackupex_option_reference.html
innobackupex全量、增量备份脚本
可以根据自己线上数据库情况,编写全量和增量备份脚本,然后结合crontab设置计划执行.
比如:每周日的1:00进行全量备份,每周1-6的1:00进行增量备份.
还可以在脚本里编写邮件通知信息(可以用mail或sendemail)
1、可能报错1
解决方案:
.pm实际上是Perl的包,只需安装perl-Time-HiRes即可:
[root@test-huanqiu percona-xtrabackup-2.1.9]# yum install -y perl-Time-HiRes
2、可能报错2
报错原因:系统没有按安装DBI组件.
DBI(Database Interface)是perl连接数据库的接口.其是perl连接数据库的最优秀方法,他支持包括Orcal,Sybase,mysql,db2等绝大多数的数据库.
解决办法:
安装DBI组件(Can’t locate DBI.pm in @INC-mysql接口)
或者单独装DBI、Data-ShowTable、DBD-mysql 三个组件
[root@test-huanqiu percona-xtrabackup-2.1.9]# yum -y install perl-DBD-MySQL
接着使用innobackupex命令测试是否正常[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex –help
Options:
–apply-log
Prepare a backup in BACKUP-DIR by applying the transaction log file
named “xtrabackup_logfile” located in the same directory. Also,
create new transaction logs. The InnoDB configuration is read from
the file “backup-my.cnf”.–compact
Create a compact backup with all secondary index pages omitted. This
option is passed directly to xtrabackup. See xtrabackup
documentation for details.–compress
This option instructs xtrabackup to compress backup copies of InnoDB
data files. It is passed directly to the xtrabackup child process.
Try ‘xtrabackup –help’ for more details.
3、可能报错3
161130 05:56:48 innobackupex: Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup’ as ‘root’ (using password: YES).
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 2956.
解决办法:
[root@test-huanqiu ~]# yum -y install perl-DBD-MySQL.x86_64
……
Package perl-DBD-MySQL-4.013-3.el6.x86_64 already installed and latest version //发现本机已经安装了[root@test-huanqiu ~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
发现本机已经安装了最新版的perl-DBD-MYSQL了,但是仍然报出上面的错误!! 莫慌~~继续下面的操作进行问题的解决查看mysql.so依赖的lib库
[root@test-huanqiu ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffd291fc000)
libmysqlclient.so.16 => not found //这一项为通过检查,缺失libmysqlclient.so.16库导致
libz.so.1 => /lib64/libz.so.1 (0x00007f78ff9de000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f78ff7a7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f78ff58e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f78ff309000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f78ff09d000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f78fecb9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f78fe924000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f78fe721000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f78fe4dd000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f78fe1f5000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f78fdff1000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f78fddc5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f78fdbc0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78ffe1d000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f78fd9b5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f78fd7b2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f78fd597000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78fd37a000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f78fd15a000)
以上结果说明缺少libmysqlclient.so.16这个二进制包,找个官方原版的mysql的libmysqlclient.so.16替换了即可![root@test-huanqiu~]# find / -name libmysqlclient.so.16 //查看本机并没有libmysqlclient.so.16库文件
查看mysql/lib下的libmysqlclinet.so库文件[root@test-huanqiu~]# ll /usr/local/mysql/lib/
total 234596
-rw-r–r–. 1 mysql mysql 19520800 Nov 29 12:27 libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 16 Nov 29 12:34 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 17 Nov 29 12:34 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x. 1 mysql mysql 8858235 Nov 29 12:27 libmysqlclient.so.18.1.0
-rw-r–r–. 1 mysql mysql 211822074 Nov 29 12:34 libmysqld.a
-rw-r–r–. 1 mysql mysql 14270 Nov 29 12:27 libmysqlservices.a
drwxr-xr-x. 3 mysql mysql 4096 Nov 29 12:34 plugin
将mysql/lib/libmysqlclient.so.18.1.0库文件拷贝到/lib64下,拷贝后命名为libmysqlclient.so.16[root@test-huanqiu~]# cp /usr/local/mysql/lib/libmysqlclient.so.18.1.0 /lib64/libmysqlclient.so.16
[root@test-huanqiu~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/
/lib64/
[root@test-huanqiu~]# ldconfig最后卸载perl-DBD-MySQL,并重新安装perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
[root@test-huanqiu~]# rpm -e –nodeps perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
[root@test-huanqiu~]# yum -y install perl-DBD-MySQL
待重新安装后,再次重新检查mysql.so依赖的lib库,发现已经都通过了[root@test-huanqiu~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffe3669b000)
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007f4af5c25000)
libz.so.1 => /lib64/libz.so.1 (0x00007f4af5a0f000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4af57d7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4af55be000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4af533a000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4af50cd000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4af4ce9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4af4955000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4af4751000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f4af450d000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f4af4226000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f4af4021000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f4af3df5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4af3bf1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4af61d1000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4af39e5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4af37e2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4af35c8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4af33aa000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4af318b000)
4、可能报错4
有可能是percona-xtrabackup编译安装后,在编译目录的src下存在xtrabackup_innodb55,只需要其更名为xtrabackup_55,然后拷贝到上面的/home/mysql/admin/bin/percona-xtrabackup-2.1.9/下即可!
第一篇 MySQL 系列连载之 XtraBackup 备份原理(1)
第二篇 MySQL 系列连载之 XtraBackup全量热备 or 恢复实践(2)
第三篇 MySQL 系列连载之 XtraBackup 增量热备 or 恢复实践(3)
感谢您阅读.
转载请注明本页网址:
http://www.vephp.com/jiaocheng/4260.html