IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

xtrabackup知多少

SQL部落 2011-06-20 13:39:35 累计浏览 3,599 次
本机暂存

最近小弄下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. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,252)
  2. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,400)
  3. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  4. Mysql监控指南 (累计阅读 21,352)
  5. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  6. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  7. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  8. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,909)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,709)
  10. 深入浅出INNODB MVCC机制与原理 (累计阅读 9,693)