失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Xtrabackup--InnoDB备份工具介绍(1)

Xtrabackup--InnoDB备份工具介绍(1)

时间:2018-10-09 03:22:09

相关推荐

Xtrabackup--InnoDB备份工具介绍(1)

摘要: 相对于mysql官方的企业级InnoDB备份方案Innodb Hot Backup(物理+热备)每服务器5000刀的价格,percona公司推出的遵循GPL协议的备份利器Xtrabackup简直太赞了!这里不得不说meriaDB的作者以及percona公司,你们真乃业界良心啊!

对于很多运维同行来说,平时管理mysql除了应开的需求查询一些数据条目和监控性能外,更多的则是为了保证数据的可靠性对其进行备份和复制的操作管理, 不过最近听不少同行都说现在的互联网已经进入了缓存和nosql为王的时代,大可取代mysql这种关系型数据库,不得不承认在大量甚至海量的业务且要求数据即时响应回馈的场景中,如微信,微博,缓存和nosql的重要性和性能体现(如redis),但要说取代mysql的话,我只能表示:呵呵

其实mysqldump这种热备+逻辑的备份方式被应用的还是蛮多的,但其单线程的工作模式及生成sql写入文件的这种方式,与文件系统级别的物理备份相比,效率就显得有些差了。

这里介绍一下innodb的开源备份工具Xtrabackup,至于说其实现物理热备的原理,简单来说其理解innodb底层存储机制,类似逐页请求锁定,不会产生阻塞和按数据块来备份。percona官网对其和Innodb Hot Backup的所支持的功能和各项参数做了较详细的对比,有兴趣的朋友可以看一下,地址/software/percona-xtrabackup,当然了,他们难免有些王婆卖瓜之嫌,但我感觉人家敢明目张胆的贴出来和Innodb Hot Backup进行叫板,而且也没被mysql官方惹上什么官司,就已经说明人家的实力了吧。如果日常工作中对mysql或者说innodb类的库操作比较多的,建议大家多了解和关注一下percona的官网。其对Xtrabackup的推荐介绍中有以下几点:

Backups that complete quickly and reliably

Uninterrupted transaction processing during backups

Savings on disk space and network bandwidth

Automatic backup verification

Higher uptime due to faster restore time

简单理解的话就是:

快速可靠的完全备份

备份过程中不会打扰到事务操作

能执行压缩数据流网络传输,有效节省带宽和磁盘资源

自动备份校验

恢复速度比较快

既然优点这么多,我们来认识和使用一下这个工具,使用之前,请确实mysql的版本为5.5+,如果安装报错类似:perl(Time:HiRes),用yum安装上即可,如果想使用其一些高级特性比较导入导出单张表,那就请在配置文件中设置innodb_file_per_table = 1(对每个新创建的表生成并使用单独的表空间)。可使用官方提供的rpm包直接安装,下载地址: /downloads/XtraBackup/

我的操作系统环境为centos6.2_64位,mysql版本为5.5.33

yum-yinstallperl-Time-HiRes

rpm-ivhpercona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm

看一下安装的文件,其中innobackupex为主命令程序,使用时会自行判断你的mysql版本是5.5还是5.6,使用innobackupex --help可查看其使用的语法格式。

[root@gzy~]#rpm-qlpercona-xtrabackup/usr/bin/innobackupex/usr/bin/innobackupex-1.5.1/usr/bin/xbcrypt/usr/bin/xbstream/usr/bin/xtrabackup/usr/bin/xtrabackup_55/usr/bin/xtrabackup_56/usr/share/doc/percona-xtrabackup-2.1.4/usr/share/doc/percona-xtrabackup-2.1.4/COPYING

创建一个适用于备份操作的最小权限用户:

mysql>grantreload,locktables,replicationclienton*.*to'backup'@'localhost'identifiedby'123456';QueryOK,0rowsaffected(0.30sec)mysql>flushprivileges;QueryOK,0rowsaffected(0.08sec)

接下来具体使用和测试一下备份innodb类型的库,演示一下完全+增量备份,最后用完全+增量+二进制日志恢复的过程。

innobackupex--user=backup-password=123456/backup/

用户是之前创建的备份用户,/backup/是备份的目录,在执行过程中会打印很多执行时的信息,如果执行成功的话,最后会显示:

innobackupex:Backupcreatedindirectory'/backup/-02-17_01-09-48'innobackupex:MySQLbinlogposition:filename'mysql-bin.000021',position35414021701:09:57innobackupex:Connectiontodatabaseserverclosed14021701:09:57innobackupex:completedOK!

发现了吗?自动在我们的备份目录下创建了个以当前日期和时间命名格式的目录,查看一下,发现除了备份的相关库和数据文件之外,还生成了一些xtrabackup相关文件。

[root@gzy~]#ll/backup/-02-17_01-09-48/total26664-rw-r--r--.1rootroot260Feb1701:09backup-f-rw-r-----.1rootroot27262976Feb1701:09ibdata1drwxr-xr-x.2rootroot4096Feb1701:09mydbdrwxr-xr-x.2rootroot4096Feb1701:09mysqldrwxr-xr-x.2rootroot4096Feb1701:09performance_schemadrwxr-xr-x.2rootroot4096Feb1701:09test-rw-r--r--.1rootroot13Feb1701:09xtrabackup_binary-rw-r--r--.1rootroot23Feb1701:09xtrabackup_binlog_info-rw-r-----.1rootroot89Feb1701:09xtrabackup_checkpoints-rw-r-----.1rootroot2560Feb1701:09xtrabackup_logfiledrwxr-xr-x.2rootroot4096Feb1701:09zabbix

这里对其工作流程做一下说明,首先,使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

xtrabackup_checkpoints : 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态,这个为准备工作,包括事务日志和数据文件,把事务日志中已提交的事务同步至数据文件,未提交的进行回滚)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。查看一下其内容:

[root@gzy~]#cd/backup/-02-17_01-09-48/[root@gzy-02-17_01-09-48]#catxtrabackup_checkpointsbackup_type=full-backuped#表示备份类型为完全备份from_lsn=0#LSN号从0开始to_lsn=5618613#LSN号到0结束last_lsn=5618613#最后的lsn号,换句话说,一会进行增量备份时会以这个数字开始,可以理解为xtrabackup为每次备份打的开始和结束的标记compact=0#0表示未启用压缩

xtrabackup_binlog_info: mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。这个容易理解:

[root@gzy-02-17_01-09-48]#catxtrabackup_binlog_infomysql-bin.000021354

xtrabackup_binary:备份中用到的xtrabackup的可执行文件,因为mysql版本是5.5,所以其调用的是/usr/bin/xtrabackup_55

[root@gzy-02-17_01-09-48]#catxtrabackup_binaryxtrabackup_55

backup-f:备份命令用到的配置选项信息,也就是f配置文件中定义的相关参数

[root@gzy-02-17_01-09-48]#catbackup-f#ThisMySQLoptionsfilewasgeneratedbyinnobackupex.#TheMySQLserver[mysqld]innodb_data_file_path=ibdata1:10M:autoextendinnodb_log_files_in_group=2innodb_log_file_size=5242880innodb_fast_checksum=0innodb_page_size=16384innodb_log_block_size=512

接下来我们添加一个叫test1的用户,然后进行一次增量备份。

mysql>grantallon*.*to'test1'@'localhost'identifiedby'123456';QueryOK,0rowsaffected(0.04sec)mysql>flushprivileges;QueryOK,0rowsaffected(0.07sec)mysql>selectHost,User,Passwordfrommysql.user;+------------------+--------+-------------------------------------------+|Host|User|Password|+------------------+--------+-------------------------------------------+|localhost|root|*2CF528CA7B474EC019B52035BDF52F143D939DBA|||root|*2CF528CA7B474EC019B52035BDF52F143D939DBA||127.0.0.1|root|*2CF528CA7B474EC019B52035BDF52F143D939DBA||%|zabbix|*2CF528CA7B474EC019B52035BDF52F143D939DBA||localhost|backup|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9||localhost|test1|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|+------------------+--------+-------------------------------------------+6rowsinset(0.01sec)

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

增量备份的语法:innobackupex --incremental /backup --incremental-basedir=BASEDIR

其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放此次增量备份数据。--incremental意思是类型为增量备份,另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。

innobackupex-user=backup-password=123456--incremental/backup/--incremental-basedir=/backup/-02-17_01-09-48/

备份成功会显示相关内容的,以及LSN号,备份生成的目录,及二进制日志文件及其pos点信息

xtrabackup:Thelatestcheckpoint(forincremental):'5618623'xtrabackup:Stoppinglogcopyingthread..>>logscannedupto(5618623)xtrabackup:Transactionlogoflsn(5618623)to(5618623)wascopied.14021713:26:48innobackupex:Alltablesunlockedinnobackupex:Backupcreatedindirectory'/backup/-02-17_13-26-38'#此次增量生成的数据目录innobackupex:MySQLbinlogposition:filename'mysql-bin.000021',position57414021713:26:48innobackupex:Connectiontodatabaseserverclosed14021713:26:48innobackupex:completedOK!

接下来我们再进入mysql创建一个用户test2

mysql>grantallon*.*to'test2'@'localhost'identifiedby'123456';QueryOK,0rowsaffected(0.00sec)mysql>flushprivileges;QueryOK,0rowsaffected(0.01sec)mysql>selectHost,User,Passwordfrommysql.user;+------------------+--------+-------------------------------------------+|Host|User|Password|+------------------+--------+-------------------------------------------+|localhost|root|*2CF528CA7B474EC019B52035BDF52F143D939DBA|||root|*2CF528CA7B474EC019B52035BDF52F143D939DBA||127.0.0.1|root|*2CF528CA7B474EC019B52035BDF52F143D939DBA||%|zabbix|*2CF528CA7B474EC019B52035BDF52F143D939DBA||localhost|backup|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9||localhost|test1|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9||localhost|test2|*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|+------------------+--------+-------------------------------------------+7rowsinset(0.00sec)

查看一下当前使用的二进制日志:

mysql>showmasterstatus;+------------------+----------+--------------+------------------+|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|+------------------+----------+--------------+------------------+|mysql-bin.000021|794|||+------------------+----------+--------------+------------------+1rowinset(0.00sec)

接下来把这个二进制日志备份到别处,并删除mysql的数据目录来进行恢复测试,此时并没有再进行增量备份的操作哦!(注意!!!生产环境中mysql的二进制日志文件与数据文件的有同等的重要性!所以其保存路径一定要与mysql的数据目录区分开的,且在硬件级别最少保证raid1,当然了使用mysql的复制结构如主从,多主等模型也是不可少的)

我的mysql 数据目录为/data

[root@gzy~]#cp/data/mysql-bin.000021/tmp[root@gzy~]#ls/data/.errmysqlmysql-bin.000006mysql-bin.000012mysql-bin..pidmysql-bin.000001mysql-bin.000007mysql-bin.000013mysql-bin.000019zabbixibdata1mysql-bin.000002mysql-bin.000008mysql-bin.000014mysql-bin.000020ib_logfile0mysql-bin.000003mysql-bin.000009mysql-bin.000015mysql-bin.000021ib_logfile1mysql-bin.000004mysql-bin.000010mysql-bin.000016mysql-bin.indexmydbmysql-bin.000005mysql-bin.000011mysql-bin.000017performance_schema

接下来停止mysql进程并删除/data......

ShuttingdownMySQL....SUCCESS![root@gzy~]#rm-rf/data/*[root@gzy~]#

现在四大皆空了,接下来用刚才创建的完全备份+增量备份+二进制日志来进行恢复操作。

首先将已提交的事务进行“重放”,之后所有的增量备份数据将合并到完全备份上,所有备份数据中未提交的事务进行“回滚”。

先进行完全备份的准备:

innobackupex--apply-log--redo-only/backup/-02-17_01-09-48/

再进行增量备份的准备:

innobackupex--apply-log--redo-only/backup/-02-17_01-09-48/--incremental-dir=/backup/-02-17_13-26-38/

确保2次操作都出现成功的提示:

completedOK!

因为增量备份的数据都已合并到完全备份中去了,所以此时只恢复完全备份即可

innobackupex--copy-back/backup/-02-17_01-09-48/

再来查看一下数据目录/data

[root@gzy~]#ll/data/total26644-rw-r--r--.1rootroot27262976Feb1714:10ibdata1drwxr-xr-x.2rootroot4096Feb1714:10mydbdrwxr-xr-x.2rootroot4096Feb1714:10mysqldrwxr-xr-x.2rootroot4096Feb1714:10performance_schemadrwxr-xr-x.2rootroot4096Feb1714:10testdrwxr-xr-x.2rootroot4096Feb1714:10zabbix

貌似恢复回来了?!好吧,把该目录的属主属组变成mysql后启动一下服务试试

[root@gzy~]#chownmysql.mysql/data-R[root@gzy~]#servicemysqldstartStartingMySQL........SUCCESS!

提示启动成功,我们进入mysql来查看一下刚才我们所创建的测试用户是否存在:

本文出自/u/1171265/blog/37

如果觉得《Xtrabackup--InnoDB备份工具介绍(1)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。