创建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的数据量。
大体内容如下:
[root@21yunwei 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/的内容如下:
[root@21yunwei 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号:
[root@21yunwei mysqlbakup]# cd 2016-06-08_11-11-51/ [root@21yunwei 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 [root@21yunwei 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,这边务必注意,否则出错。
[root@21yunwei 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! 备份目录如下: [root@21yunwei 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: [root@21yunwei mysqlbakup]# cat 2016-06-07_16-26-22/xtrabackup_checkpoints backup_type = full-prepared from_lsn = 0 to_lsn = 2180343 last_lsn = 2180343 [root@21yunwei mysqlbakup]# cat 2016-06-08_11-11-51/xtrabackup_checkpoints backup_type = incremental from_lsn = 2180343 to_lsn = 2143660 last_lsn = 2143660 [root@21yunwei 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数据库:
[root@21yunwei mysql_3306]# mysqld_multi stop 1 [root@21yunwei mysql_3306]# rm -rf ./* [root@21yunwei 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! 提示,否则恢复不成功。
好了,下边执行最后操作更改所有者启动:
[root@21yunwei data]# chown -R mysql.mysql mysql_3306 [root@21yunwei 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数据库