IT技术博客大学习 共学习 共进步

xtrabackup知多少

SQL部落 2011-06-20 13:39:35 浏览 3,483 次

最近小弄下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. 仅仅只备份是不够的 (阅读 5,702)
  2. 使用scp在windows和Linux之间互传文件 (阅读 5,224)
  3. rsync自动输入密码实现数据备份 (阅读 5,024)
  4. rman备份对各种数据块操作 (阅读 4,402)
  5. mydumper的使用和源代码分析 (阅读 4,061)
  6. MySQL 备份和其恢复机制原理简述 (阅读 4,022)
  7. 使用 rsync 或 unison 备份或同步支持 ssh 的 web 主机 (阅读 3,963)
  8. 不可靠的EXP远程备份 (阅读 3,801)
  9. linux 定期自动备份mysql的shell (阅读 3,602)
  10. Zmanda让MySQL的备份与恢复更加方便快捷灵活 (阅读 3,560)