最新消息:

xtrabackup知多少

mysql admin 2646浏览 0评论

最近小弄下Percona Xtrabackup,写脚本做测试,对这个世界唯一的开源免费(the world’s only open-source free)MySQL(the 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_lsn从0开始,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,也同样有两种方式–targetdir或my.cnf的[xtrabackup]组中加入targetdir=。
2.–prepare时,如果准备就发生在当前备份的机器上进行,那么–defaults-file可以直接使用targetdir下的backup-my.cnf文件中配置;如果是在另一台机器去做应用日志操作,那么需要将–defaults-file指定的文件中所有目录相关的配置设置成当前的targetdir。
我目前主要使用innobackupex去做备份,一个是操作简单,另一个是考虑到目前还存在InnoDB和MyISAM混合的数据库。在测试期间,也遇到了一些问题和脚本自身的一些限制,下面抖露几句。
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 innodb的innodb_buffer_pool_size的大小。
–redo-only
该选项是当作增量恢复的时候使用,依次去应用增量日志的时候,除了–apply-log以外,还要加上–redo-only,只有当所有增量应用完毕,需要自动生成iblogfile的时候,才不需要加–redo-only。该选项是为了保证只应用redo-log,也就是iblogfile的更新。(其实,这里关于redo-log,undo-log的细节我还有点迷糊0_0)
xtrabackup还有很多带劲的选项,稍后细致研究后,再和大家分享。
– UPDATED –
The following tips are from orczhou blog.
1. mv is faster than cp when you do “copy-back” on the same partition. Because mv only changes the […]

转载请注明:爱开源 » xtrabackup知多少

您必须 登录 才能发表评论!