技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> xtrabackup知多少

xtrabackup知多少

浏览:2668次  出处信息

最近小弄下Percona Xtrabackup,写脚本做测试,对这个世界唯一的开源免费(the world’s only open-source freeMySQLthe world’s most popular open source databases这句我也很喜欢 lol:)热备工具有了一些懵懂的认识,对于付费的InnoDB Hot Backup我们有了更欢乐的选择。Percona Xtrabackup工具主要有两部分构成,一个就是c写的xtrabackup命令,它又有多个版本,分别对应不同版本(5.0及以上)的MySQL/XtraDB以及InnoDB的差别(build-in or plugin),该命令只能备份InnoDB/XtraDB的数据文件;另一个是perl写的innobackupex的脚本,将xtrabackup命令包裹起来,让备份的过程更透明化更轻松,它会自行判断选择合适的xtrabackup工具,同时,它还能备份InnoDB对应的.frm文件以及MyISAM类型的库表;至于tar4ibd这个命令,未曾研究,看它的解释应该是一个打包InnoDB数据文件的工具。下面就具体说说这美妙的工作是如何高效工作的。

使用xtrabackup命令去备份和恢复一个数据库,一般会经历以下三步:1.备份;2.准备;3.恢复。

备份阶段(Backup Process

大家之所喜欢这个工具,主要因为一是备份速度快,二是备份期间不影响业务的正常访问。那么它是如何做到的呢?备份开始后,会有两个线程,日志拷贝线程在后台运行,去拷贝iblogfile里面发生改变的文件块(changed block)将其拷贝到一个叫做xtrabackup_logfile的二进制文件中,一次以1MB大小进行拷贝,这在工具在是不可以调的,这时会有另一个数据拷贝的线程在前台去拷贝所有的数据文件(ibdata/ibd),它是以512byte为一页,作为每次拷贝的大小。当数据文件拷贝完成,则会关闭日志拷贝线程,同时生成一个xtrabackup_checkpoints的文件,来记录在数据拷贝期间,事务日志的更新状态,通过LSN(log sequence number)号去记录,当一次全备结束,from_lsn0开始,last_lsn记录备份结束时刻完成的那点;当进行增量备份时,每次增量备份结束后,该文件的from_lsn的点因该对应于前一次备份结束后的last_lsn

xtrabackup拷贝数据块是物理性的拷贝,而不像mysqldump是将数据逻辑性以sql语句的形式导出,显然前者要迅速很多;通过时刻扑捉事务日志的变化,而不是靠单纯加锁来保持数据的一致性,自然就不会对外来请求带来任何影响。

准备阶段(Prepare Process

这个阶段其实,就是对备份的数据文件应用备份期间收集来的日志文件,使得所有的数据文件保持在一个状态,因为不同的文件在该文件拷贝结束后,都有可能被修改,而且同一个文件在拷贝期间,不同的块也会存在先后的更新。应用日志巧妙的使用了InnoDB引擎crash-reovery的的特性,通过命令本身加载一个小巧的embedded InnoDB开启一个小引擎,除去了一些复杂的检查,让Innodb自己去将改变的日志应用到备份好的哦数据文件上。一般会建议-prepare两次,原因是第一次的作用是应用日志,第二次的作用是产生一个和当前配置保持一致大小的日志文件,以便恢复时能够迅速启动数据库实例。

恢复阶段(Restore Process

该阶段只需将我们备份好的目录考到指定的位置,作为新的数据目录,同时保证数据库启动后又权限访问该目录下的所有文件即可。

操作时,需要注意的小细节:

1.-backup时,需要有能够连接当前数据库的权限的用户,指定当前数据库的datadir的位置,或命令行指定-datadir,或配置文件my.cnf[mysqld]组中指定datadir=,以及备份目录targetdir,也同样有两种方式-targetdirmy.cnf[xtrabackup]组中加入targetdir=

2.-prepare时,如果准备就发生在当前备份的机器上进行,那么-defaults-file可以直接使用targetdir下的backup-my.cnf文件中配置;如果是在另一台机器去做应用日志操作,那么需要将-defaults-file指定的文件中所有目录相关的配置设置成当前的targetdir

我目前主要使用innobackupex去做备份,一个是操作简单,另一个是考虑到目前还存在InnoDBMyISAM混合的数据库。在测试期间,也遇到了一些问题和脚本自身的一些限制,下面抖露几句。

1. 当备份有大量的myisam表时,该perl脚本会出现Error,需要调整脚本中对应的超时时间(还没有找到),但经测试后发现,此状态的备份仍可用。

2. 当使用-databases参数(该值为包含指定库名并用空格隔开的文件)指定备份的数据库时,除了备份指定库后,还会将为指定的库中的ibd文件也备份出来,但是,只有指定的库会将.ibd.frm文件都备份齐,其他库只有.ibd文件。

下面是我接触到几个命令行选项:

-suspend-at-end

这个选项被innobackupex的在脚本中用到,默认xtrabackup不加这选项,当数据文件拷贝结束后,会立即关闭日志拷贝线程停止对跟新日志的拷贝,当加上这个参数,是通过自动生成的xtrabackup_suspened文件存在与否,来决定是否结束log-copying thread,这样当拷贝.frm文件和mysiam表,仍可记录跟新的日志。

-use-memory

该选项可以提高应用日志速度的速度,因为它的值会作为embedded innodbinnodb_buffer_pool_size的大小。

-redo-only

该选项是当作增量恢复的时候使用,依次去应用增量日志的时候,除了-apply-log以外,还要加上-redo-only,只有当所有增量应用完毕,需要自动生成iblogfile的时候,才不需要加-redo-only。该选项是为了保证只应用redo-log,也就是iblogfile的更新。(其实,这里关于redo-logundo-log的细节我还有点迷糊0_0

xtrabackup还有很多带劲的选项,稍后细致研究后,再和大家分享。

建议继续学习:

  1. 仅仅只备份是不够的    (阅读:4896)
  2. 使用scp在windows和Linux之间互传文件    (阅读:4180)
  3. rsync自动输入密码实现数据备份    (阅读:4082)
  4. rman备份对各种数据块操作    (阅读:3686)
  5. 使用 rsync 或 unison 备份或同步支持 ssh 的 web 主机    (阅读:3282)
  6. mydumper的使用和源代码分析    (阅读:3167)
  7. MySQL 备份和其恢复机制原理简述    (阅读:3131)
  8. linux 定期自动备份mysql的shell    (阅读:3072)
  9. 不可靠的EXP远程备份    (阅读:2778)
  10. 服务器间同步/镜像/备份配置备忘录    (阅读:2613)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Mysql的随机读取
后一篇:白话MongoDB(三) >>
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1