通过mysql备份工具Xtrabackup工具-innobackupex备份单机mysql多实例数据库、增量备份及恢复mysql数据库 – 21运维
通知: .-...

通过mysql备份工具Xtrabackup工具-innobackupex备份单机mysql多实例数据库、增量备份及恢复mysql数据库

mysql 21运维 3632浏览 0评论

创建21运维网站这么久了,发现有关mysql备份的文章太少,即使有也是基于那种小型数据库,比如mysqldump导出或者myqlsam的备份源文件打包等。由于上班的公司使用的是个多实例mysql,几个T的数据。原始的mysqldump备份是要吐血的,这里朋友推荐加网上搜索,学习了下这个工具,实际中也是正式使用了,300G的数据压缩备份下来是84G左右,时间一个小时。这里就写一篇文章共享出来供大家参考。

工具简介:
Xtrabackup 是由 percona 开发的一个开源软件,此软件可以说是 innodb 热备工具 ibbackup 的一个开源替代品。这个软件是由 2 个部分组成的 :xtrabackup 和 innobackupex 。 Xtrabackup 专门用于 innodb 引擎和 xtraDB引擎;而 innobackupex 是专门用于 myisam 和 innodb 引擎,及混合使用的引擎。
Xtrabackup有两个主要的工具如下:xtrabackup、innobackupex
(1)xtrabackup(C)只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表。
(2)innobackupex-1.5.1(perl)则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁。

原理说明:

innobackupex工具本身:innobackupex有更强的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。
innobackupex备份原理:innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。
innobackupex恢复原理:innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志

核心思路:单机备份用这个工具分分钟搞定,和其他教程没有什么两样。由于本人单位采用的是单机myql多实例,–defaults-group不是很好用。后边了解了下这个工具的原理后,发现回滚基于my.cnf的datadir,于是共享的my.cnf的加载就是问题,这里我是建立的假的my.cnf(/data/test/mysql3306.cnf )文件加载来实现的。

一,innobackupex 备份操作
1,下载安装
官网下载地址https://www.percona.com/downloads/XtraBackup/ ,可以根据自己的系统平台和需要的版本进行下载对应工具。建议用新版本,老版本有些不支持–decompress,目前可以考虑Percona-XtraBackup-2.2.13。

yum install  perl-Time-HiRes  -y  安装依赖 
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz
tar zxvf  percona-xtrabackup-2.0.8-587.tar.gz 
cd percona-xtrabackup-2.0.8-587
cp bin/innobackupex*  /usr/bin/
cp bin/xtrabackup* /usr/bin/

2,创建备份目录
磁盘的选择也是一个很重要的事情,注意分区名以及该磁盘大小,长久考虑数据全备以及增量备份大小变动情况。目前比如我们的备份是放到了/home/mysqlbakuptest这个目录之中。

/home/mysqlbakuptest

3,备份测试
站长这里为了测试,是下了血本,直接拿测试环境300G 的数据库开干,这样可能效果会更好一些。

 innobackupex     --defaults-file=/data/mysql_3306/mysql3306.cnf  --user=root   --port=3306 --password=hotmail.com --socket=/data/mysql_3306/mysql_3306.sock /home/mysqlbakup

其中这里工具的一些参数可以参考《mysql备份工具innobackupex命令参数中文详解》 这里有详细说明,比如加载配置文件加载说明、备份哪个数据库等,这里不做重复介绍了。English好的也可以直接innobackupex  –help查看。可以自行到/home/mysqlbakuptest/2016-06-07_16-26-22刷新查看数据变动情况。如果备份完毕,命令界面会显示:

innobackupex: Backup created in directory '/home/mysqlbakuptest/2016-06-07_16-26-22'
innobackupex: MySQL binlog position: filename '', position 
160606 16:09:00  innobackupex: completed OK!

查看备份数据:/home/mysqlbakuptest/2016-06-07_16-26-22进去以后可以du -sh  ./*查看各个数据,基本我备份的这个mysql原始300G数据,备份后大约是97G的数据量。
大体内容如下:

[[email protected] 2016-06-07_16-26-22]# ll
总用量 18472
-rw-r--r-- 1 root root      260 6月   7 16:26 backup-my.cnf
drwxr-xr-x 2 root root     4096 6月   7 16:26 bakup
drwx------ 2 root root     4096 6月   7 16:26 gitlab
-rw-r----- 1 root root 18874368 6月   7 16:26 ibdata1
drwxr-xr-x 2 root root     4096 6月   7 16:26 mysql
drwxr-xr-x 2 root root     4096 6月   7 16:26 performance_schema
drwxr-xr-x 2 root root     4096 6月   7 16:26 test
-rw-r--r-- 1 root root       13 6月   7 16:26 xtrabackup_binary
-rw-r--r-- 1 root root        4 6月   7 16:26 xtrabackup_binlog_info
-rw-r----- 1 root root       77 6月   7 16:26 xtrabackup_checkpoints
-rw-r----- 1 root root     2560 6月   7 16:26 xtrabackup_logfile

二,备份恢复
备份完了以后那么我们就要测试下备份的完整性,看下是不是那么完美无缺。由于数据库内容这里不方便透露,就马赛克了, 精髓是了解恢复的原理与步骤。
1,停止数据库,并将原来存在的一个数据库实例mysql_3308改名,mysql_3308bak,新建一个mysql_3308:

第1步是apply-log,为了加快速度,一般建议设置–use-memory,这个步骤完成之后,目录/home/mysqlbakuptest/2016-06-07_16-26-22   下的备份文件已经准备就绪。
因为我们的文件比较少,因此我们不需要设置–user-memory产数文件.
第2步是copy-back,即把备份文件拷贝至原数据目录下。
说明:在创建全量备份后,备份文件是不能restore的,因为这个初始创建的备份只是简单的copy过程,而innodb是事务引擎,所以还需要通过log文件replay committed的事务和回滚uncommitted事务,这样数据库就达到一致的状态,可以restore了。

第一步执行结果如下:

innobackupex     --defaults-file=/data/test/mysql3306.cnf --user=root   --apply-log  /home/mysqlbakup/2016-06-07_16-26-22

InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 59926
160607 16:29:30 innobackupex: completed OK!

完成以后执行如下操作:
[notice (again)]
 If you use binary log and don't use any hack of group commit,
 the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 151354, file name ./mysql-bin.000002

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
160607 16:31:15 InnoDB: Starting shutdown...
160607 16:31:19 InnoDB: Shutdown completed; log sequence number 2138636
160607 16:31:20 innobackupex: completed OK!


第二步进行如下操作:

innobackupex     --defaults-file=/data/test/mysql3306.cnf --user=root   --copy-back  /home/mysqlbakup/2016-06-07_16-26-22
命令如果成功执行,会提示如下信息:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/home/mysqlbakup/2016-06-07_16-26-22'
innobackupex: back to original InnoDB log directory '/data/mysql_3306'
innobackupex: Copying '/home/mysqlbakup/2016-06-07_16-26-22/ib_logfile1' to '/data/mysql_3306'
innobackupex: Copying '/home/mysqlbakup/2016-06-07_16-26-22/ib_logfile0' to '/data/mysql_3306'
innobackupex: Finished copying back files.

160607 16:33:37  innobackupex: completed OK!

执行完以后查看基本数据库都出来了,权限不对,需要我们重置下权限:chown  -R mysq.mysql  mysql_3306

启动mysql看下效果,mysqld_multi  start 1
嘿嘿,查看一切正常。使用navicat 连接任何一个mysql数据库都可以用。完美!

三,增量备份及其恢复
innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

增量备份是基于一个数据库的全部备份文件的,在刚才我们备份了一个全备份,我们现在的增量备份就基于刚才的全部备份来做/home/mysqlbakup/2016-06-07_16-26-22。刚才我将gitlab里边的一个数据库表删除了,下边我进行增量备份并进行数据恢复。

1,增量备份执行如下操作:

innobackupex --defaults-file=/data/test/mysql3306.cnf  --user=root --port=3306 --password=xxxxxx --socket=/data/mysql_3306/mysql_3306.sock  --incremental-basedir=/home/mysqlbakup/2016-06-07_16-26-22 --incremental /home/mysqlbakup/

完成以后会显示如下信息:
innobackupex: Backup created in directory '/home/mysqlbakup/2016-06-07_17-24-45'
innobackupex: MySQL binlog position: filename '', position 
160607 17:25:08  innobackupex: completed OK!

参数说明:–incremental-basedir指向全备目录, –incremental指向增量备份的目录。
备份目录/home/mysqlbakup/的内容如下:

[[email protected] mysqlbakup]# du -sh ./*
36M ./2016-06-07_16-26-22
2.3M ./2016-06-08_11-11-51

2016-06-07_16-26-22是我之前的全备,下边下小的目录2016-06-08_11-11-51 只有2.3M,则是增量备份目录。里边的内容如下,主要是还是lsn号:

[[email protected] mysqlbakup]# cd 2016-06-08_11-11-51/
[[email protected] 2016-06-08_11-11-51]# ll
总用量 60
-rw-r--r-- 1 root root 260 6月 8 11:11 backup-my.cnf
drwxr-xr-x 2 root root 4096 6月 8 11:12 bakup
drwx------ 2 root root 4096 6月 8 11:12 gitlab
-rw-r----- 1 root root 16384 6月 8 11:11 ibdata1.delta
-rw-r----- 1 root root 44 6月 8 11:11 ibdata1.meta
drwxr-xr-x 2 root root 4096 6月 8 11:12 mysql
drwxr-xr-x 2 root root 4096 6月 8 11:12 performance_schema
drwxr-xr-x 2 root root 4096 6月 8 11:12 test
-rw-r--r-- 1 root root 13 6月 8 11:12 xtrabackup_binary
-rw-r--r-- 1 root root 4 6月 8 11:12 xtrabackup_binlog_info
-rw-r----- 1 root root 81 6月 8 11:12 xtrabackup_checkpoints
-rw-r----- 1 root root 2560 6月 8 11:12 xtrabackup_logfile
[[email protected] 2016-06-08_11-11-51]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2180343
to_lsn = 2143660
last_lsn = 2143660

上边可以注意到lsn号已经发生了变化。也可以继续改动数据,继续上边的操作,我又删除了一个表。
注意,现在的–incremental-basedir不是全备的目录了,而是上一次备份增量的目录名2016-06-08_11-11-51,这边务必注意,否则出错。

[[email protected] mysql_3306]#innobackupex --defaults-file=/data/test/mysql3306.cnf --user=root --port=3306 --password=xxxxxx --socket=/data/mysql_3306/mysql_3306.sock --incremental-basedir=/home/mysqlbakup/2016-06-08_11-11-51 --incremental /home/mysqlbakup/
省略N行
innobackupex: Backup created in directory '/home/mysqlbakup/2016-06-07_17-40-44'
innobackupex: MySQL binlog position: filename '', position 
160607 17:41:06  innobackupex: completed OK!

备份目录如下:
[[email protected] mysqlbakup]# ll
总用量 12
drwxr-xr-x 7 root root 4096 6月   7 16:31 2016-06-07_16-26-22
drwxr-xr-x 7 root root 4096 6月   7 17:25 2016-06-07_17-24-45
drwxr-xr-x 2 root root 4096 6月   7 17:40 2016-06-07_17-40-44
LSN:
[[email protected] mysqlbakup]# cat 2016-06-07_16-26-22/xtrabackup_checkpoints 
backup_type = full-prepared
from_lsn = 0
to_lsn = 2180343
last_lsn = 2180343
[[email protected] mysqlbakup]# cat 2016-06-08_11-11-51/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2180343
to_lsn = 2143660
last_lsn = 2143660
[[email protected] mysqlbakup]# cat 2016-06-08_11-19-22/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2143660
to_lsn = 2144672
last_lsn = 2144672

2,增量备份已经操作完成,下边开始进行增量恢复操作。先停止数据库并删除当前mysql_3306数据库:

[[email protected] mysql_3306]# mysqld_multi stop 1
[[email protected] mysql_3306]# rm  -rf  ./*
[[email protected] mysql_3306]# ll
总用量 0

执行恢复操作:
基本命令格式如下
innobackupex –apply-log –redo-only BASE-DIR BASE-DIR指完整的全部备份目录
innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-1 INCREMENTAL-DIR-1指第一次增量备份的目录
innobackupex –apply-log BASE-DIR –incremental-dir=INCREMENTAL-DIR-2 BASE-DIR指完整的全部备份目录 INCREMENTAL-DIR-2第二次增量备份的目录

innobackupex --defaults-file=/data/test/mysql3306.cnf  --apply-log --redo-only /home/mysqlbakup/2016-06-07_16-26-22 
innobackupex --defaults-file=/data/test/mysql3306.cnf  --apply-log  /home/mysqlbakup/2016-06-07_16-26-22  --incremental-dir=/home/mysqlbakup/2016-06-08_11-11-51
innobackupex  --defaults-file=/data/test/mysql3306.cnf   --apply-log  /home/mysqlbakup/2016-06-07_16-26-22/ --incremental-dir=/home/mysqlbakup/2016-06-08_11-19-22/

增量操作完毕以后,执行回滚操作(恢复的时候,我们只恢复全备份文件就可以.):

innobackupex --defaults-file=/data/test/mysql3306.cnf --apply-log /home/mysqlbakup/2016-06-07_16-26-22
innobackupex --defaults-file=/data/test/mysql3306.cnf  --copy-back /home/mysqlbakup/2016-06-07_16-26-22

执行任何一个操作都需要最后有innobackupex: completed OK! 提示,否则恢复不成功。

好了,下边执行最后操作更改所有者启动:

[[email protected] data]# chown   -R mysql.mysql   mysql_3306
[[email protected] data]# mysqld_multi  start  1

 

参考资料:
http://devliangel.blog.51cto.com/469347/1374232
http://2526575.blog.51cto.com/2516575/565557
感谢运维杨欢提供该工具。

 

转载请注明:21运维 » 通过mysql备份工具Xtrabackup工具-innobackupex备份单机mysql多实例数据库、增量备份及恢复mysql数据库

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 补充下: mysql 5.7+用老版本的不行,建议使用2.4.7以及以上来恢复。
    21运维2017-10-24 11:50 回复