一、Xtrabackup 介绍 A、Xtrabackup 是什么 Xtrabackup 是一个对 InnoDB 做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具 InnoDB Hotbackup 的一个很好的替代品。 Xtrabackup 有两个主要的工具:xtrabackup、innobackupex 1、xtrabackup 只能备份 InnoDB 和 XtraDB 两种数据表,而不能备份 MyISAM 数据表 2、innobackupex 是参考了 InnoDB Hotbackup 的 innoback 脚本修改而来的. innobackupex 是一个 perl 脚本封装,封装了 xtrabackup。主要是为了方便的 同时备份 InnoDB 和 MyISAM 引擎的表,但在处理 myisam 时需要加一个读锁。并且加入了一些使用的选项。如 slave-info 可以记录备份恢 复后,作为 slave 需要的一些信息,根据这些信息,可以很方便的利用备份来重做 slave。 3、官方文档:http://www.percona.com/docs/wiki/percona-xtrabackup:start B、Xtrabackup 可以做什么 在线 (热) 备份整个库的 InnoDB、 XtraDB 表 在 xtrabackup 的上一次整库备份基础上做增量备份 (innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用) MySQL 数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是 point-in-time(时间点) 的恢复而不是增量备份。Xtrabackup 工具支持对 InnoDB 存储引擎的增量备份,工作原理如下: (1)首先完成一个完全备份,并记录下此时检查点的 LSN(Log Sequence Number)。 (2)在进程增量备份时,比较表空间中每个页的 LSN 是否大于上次备份时的 LSN,如果是,则备份该页,同时记录当前检查点的 LSN。 首先,在 logfile 中找到并记录最后一个 checkpoint("last checkpoint LSN"),然后开始从 LSN 的位置开始拷贝 InnoDB 的 logfile 到 xtrabackup_logfile;接着,开始拷贝全部的数据文 件. ibd;在拷贝全部数据文件结束之后,才停止拷贝 logfile。 因为 logfile 里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析 xtrabackup_logfile 保持数据的一致。 C、Xtrabackup 备份原理 XtraBackup 基于 InnoDB 的 crash-recovery 功能。它会复制 innodb 的 data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用 crash-recovery,使得数据恢复一致。 InnoDB 维护了一个 redo log,又称为 transaction log,事务日志,它包含了 innodb 数据的所有改动情况。当 InnoDB 启动的时候,它会先去检查 data file 和 transaction log,并且会做二步操作: XtraBackup 在备份的时候, 一页一页地复制 innodb 的数据,而且不锁定表,与此同时,XtraBackup 还有另外一个线程监视着 transactions log,一旦 log 发生变化,就把变化过的 log pages 复制走。为什么要急着复制走呢? 因为 transactions log 文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。 在 prepare 过程中,XtraBackup 使用复制到的 transactions log 对备份出来的 innodb data file 进行 crash recovery。 D、实现细节 XtraBackup 以 read-write 模式打开 innodb 的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行 XtraBackup 的用户,必须对 innodb 的数据文件具有读写权限。之所以采用 read-write 模式是因为 XtraBackup 采用了其内置的 innodb 库来打开文件,而 innodb 库打开文件的时候就是 rw 的。 XtraBackup 要从文件系统中复制大量的数据,所以它尽可能地使用 posix_fadvise(),来告诉 OS 不要缓存读取到的数据,从 而提升性能。因为这些数据不会重用到了,OS 却没有这么聪明。如果要缓存一下的话,几个 G 的数据,会对 OS 的虚拟内存造成很大的压力,其它进程,比如 mysqld 很有可能被 swap 出去,这样系统就会受到很大影响了。 在备份 innodb page 的过程中,XtraBackup 每次读写 1MB 的数据,1MB/16KB=64 个 page。这个不可配置。读 1MB 数据之 后,XtraBackup 一页一页地遍历这 1MB 数据,使用 innodb 的 buf_page_is_corrupted()函数检查此页的数据是否正常, 如果数据不正常,就重新读取这一页,最多重新读取 10 次,如果还是失败,备份就失败了,退出。在复制 transactions log 的时候,每次读写 512KB 的数据。同样不可以配置。 二、Xtrabackup 安装 本文通过源码方式安装 Xtrabackup,最新的版本是 1.6. Xtrabackup 与一般的源码构建方式不同,它采用的在 MySQL 源代码上打补丁的构建方式。下载的源码包比较大就是是因为这个包里打包了编译需要的两个 MySQL Source,一个 5.1.56,一个 5.5.10。 安装编译所需的依赖包 BASH yum installlibaio libaio-devel 编译安装 Xtrabackup BASH
复制代码代码如下:
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gz tar xvf xtrabackup-1.6.tar.gz cd xtrabackup-1.6 utils/build.sh innodb55
注:build.sh 是源码包中提供的编译脚本,MySQL 5.1 可用参数 innodb51_builtin。 编译成功后,会在对应 mysql 版本目录中生成一个 xtrabackup 程序,我这里生成的路径是 mysql-5.5.10/storage/innobase/xtrabackup / 中 BASH ls mysql-5.5.10/storage/innobase/xtrabackup/ Makefile xtrabackup.c xtrabackup_innodb55 xtrabackup.o 复制相应文件和建立软链到 / usr/bin 下,这么做的原因是满足 innobackupex 脚本的需要。 BASH
复制代码代码如下:
cp mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55 cp innobackupex /usr/bin/innobackupex #备份时如果打包就需要这个命令,非必需。 cp libtar-1.2.11/libtar/tar4ibd /usr/bin/tar4ibd ln -sf /usr/local/webserver/mysql/bin/mysql /usr/bin/mysql
三.Xtrabackup 的备份与恢复使用 A、Xtrabackup 常用参数选项如下: BASH --defaults-file=# 默认配置文件的路径,如果不该参数,xtrabackup 将从依次从以下位置查找配置文件 / etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,并读取配置文件中的 [mysqld] 和[xtrabackup]配置段。[mysqld]中只需要指定 datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6 个参数即可让 xtrabackup 正常工作。 --defaults-extra-file=# 如果使用了该参数,在读取了全局配置文件之后,会再读取这里指定的配置文件 --target-dir=name 备份文件的存放目录路径 --backup 实施备份到 target-dir --prepare 实施对备份文件进行恢复前的准备 (生成 InnoDB log file) --print-param 打印备份或恢复时需要的参数 --use-memory=# 该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量 --suspend-at-end 在 target-dir 目录下产生一个 xtrabackup_suspended 文件,将 xtrabackup 进程挂起,不停地将数据文件的变化同步到备份文件,直到用户手工删除 xtrabackup_suspended 文件 --throttle=# 每秒 IO 次数, 限制 backup 时使用的 I/O 操作量,使备份对数据库正常业务的影响最小化 --log-stream 该参数在 backup 的时候使用,将 xtrabackup_logfile 的内容输出到标准输出,使用该参数时会自动使用 suspend-at-end 参数,innobackupex 脚本的 stream 模式会使用该参数。 --incremental-lsn=name 增量备份时只拷贝 LSN 比该参数指定值新的 ibd pages,前次备份到了哪个 LSN 可以看前次备份集的 xtrabackup_checkpoints 文件 --incremental-basedir=name 该参数在 backup 的时候使用,备份比该参数指定位置的备份集新的 idb pages --incremental-dir=name 该参数在 prepare 的时候使用,指定 prepare 时产生的. delta 文件和日志文件的存放路径 --tables=name 在备份 file-per-table 类型的数据文件时使用,使用正则表达式指定需要备份的 innodb 表 --datadir=name MySQL 数据库的数据文件目录。 B、普通备份方式 a) 普通备份(全量备份) BASH
复制代码代码如下:
mkdir -p /data0/backup/mysql xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/ cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
注意:xtrabackup 只备份数据文件,并不备份数据表结构 (.frm),所以这里要手动备份一下,以便 xtrabackup 恢复的时候使用。 全量备份恢复 实施对备份文件进行恢复前的准备 BASH xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/ 从备份目录复制对应数据库表结构到默认的数据目录 BASH cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/ 删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录 BASH rm /data0/backup/mysql/ib* cp /data0/backup/mysql/ib* /data0/mysql/data/ 修改数据目录权限 BASH chown -R mysql:mysql /data0/mysql/data 重启 MySQL BASH /data0/mysql/mysql restart b) 增量备份 增量备份优点: 1、数据库太大没有足够的空间全量备份,作增量备份有效节省空间,且效率高。 2、支持热备份。备份过程不锁表,不受时间限制,不影响用户使用。 3、每日备份只产生少量数据,远程备份传输更方便。同时节省空间。 4、备份恢复基于文件操作,降低直接对数据库操作风险。 5、备份效率更高,恢复效率更高。 这个我研究 N 久没成功,原因暂时还没找到。我测试环境的 Mysql 版本是 5.5.11 的,xtrabackup_55 是根据 MySQL5.5.9 的源码编译的,不知道和这个有关系没? 待验证!这里只把实现步骤整理出来。 增量备份及模拟恢复步骤: 先做一次全量备份,增量备份需要以此为基础 BASH
复制代码代码如下:
#建立备份目录 mkdir -p /data0/backup/mysql/base #建立一个全量备份 xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base #生成的备份数据文件 ls /data0/backup/mysql/base/ ibdata1 xtrabackup_checkpoints xtrabackup_logfile #备份数据库表结构 cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/
以此全量备份为基础进行增量备份 BASH
复制代码代码如下:
#建立备份目录 mkdir -p /data0/backup/mysql/delta #建立一个增量备份 xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/delta --incremental-basedir=/data0/backup/mysql/base #生成的备份数据文件 ls /data0/backup/mysql/delta/ ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile
注: 在增量备份目录下,数据文件都是以. delta 结尾的。增量备份只备份上一次全量备份后被修改过的 page,所以增量备份只暂用较少的空 间。增量备份可以在增量备份的基础上增量。增量备份目录每次都需修改的。比如第二次增量就改成 / data0/backup/mysql/delta2) 增量备份恢复过程: 首先需要分别对全量、增量备份各做一次 prepare 操作。 BASH xtrabackup_55 --defaults-file=/data0/mysql/my.cnf--prepare --target-dir=/data0/backup/mysql/base xtrabackup_55 --defaults-file=/data0/mysql/my.cnf--prepare --target-dir=/data0/backup/mysql/base--incremental-dir=/data0/backup/mysql/delta/ 从备份目录复制对应数据库表结构到默认的数据目录 BASH cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/ 删除默认数据目录中对应的数据文件并复制备份的数据文件到默认数据目录 BASH rm /data0/backup/mysql/ib* cp /data0/backup/mysql/ib* /data0/mysql/data/ 修改数据目录权限 BASH chown -R mysql:mysql /data0/mysql/data 重启 MySQL BASH /data0/mysql/mysql restart 四、innobackupex 的备份与恢复使用 A、数据备份 通常一般都直接使用 innobackupex,因为它能同时备份 InnoDB 和 MyISAM 引擎的表。要注意的是 my.cnf 里 datadir 这个参数是必须要指定的,xtrabackup_55 是根据它去定位 innodb 数据文件的位置。 innobackupex 语法 BASH innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar] [--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR 各参数说明: --defaults-file 同 xtrabackup 的 --defaults-file 参数 --apply-log 对 xtrabackup 的 --prepare 参数的封装 --copy-back 做数据恢复时将备份数据文件拷贝到 MySQL 服务器的 datadir ; --remote-host=HOSTNAME 通过 ssh 将备份数据存储到进程服务器上; --stream=[tar] 备份文件输出格式, tar 时使用 tar4ibd , 该文件可在 XtarBackup binary 文件中获得. 如果备份时有指定 --stream=tar, 则 tar4ibd 文件所处目录一定要在 $PATH 中 (因为使用的是 tar4ibd 去压缩, 在 XtraBackup 的 binary 包中可获得该文件)。 在使用参数 stream=tar 备份的时候,你的 xtrabackup_logfile 可能会临时放在 / tmp 目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile 可能会很大 (5G+),很可能会撑满你的 / tmp 目录,可以通过参数 --tmpdir 指定目录来解决这个问题。 --tmpdir=DIRECTORY 当有指定 --remote-host or --stream 时, 事务日志临时存储的目录, 默认采用 MySQL 配置文件中所指定的临时目录 tmpdir --redo-only --apply-log 组, 强制备份日志时只 redo , 跳过 rollback。这在做增量备份时非常必要。 --use-memory=# 该参数在 prepare 的时候使用,控制 prepare 时 innodb 实例使用的内存量 --throttle=IOS 同 xtrabackup 的 --throttle 参数 --sleep = 是给 ibbackup 使用的,指定每备份 1M 数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看 ibbackup 的手册 ; --compress[=LEVEL] 对备份数据迚行压缩,仅支持 ibbackup,xtrabackup 还没有实现; --include=REGEXP 对 xtrabackup 参数 --tables 的封装,也支持 ibbackup。备份包含的库表,例如:--include="test.*",意思是要备份 test 库中所有的表。如果需要全备份,则省略这个参数;如果需要备份 test 库下的 2 个表:test1 和 test2, 则写成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。 --databases=LIST 列出需要备份的 databases,如果没有指定该参数,所有包含 MyISAM 和 InnoDB 表的 database 都会被备份; --uncompress 解压备份的数据文件,支持 ibbackup,xtrabackup 还没有实现该功能; --slave-info, 备份从库, 加上 --slave-info 备份目录下会多生成一个 xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于: CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0 --socket=SOCKET 指定 mysql.sock 所在位置,以便备份进程登录 mysql. 备份前首先所需要建立一个备份所需的目录 BASH mkdir -p /data0/backup/mysql 1、普通备份 BASH innobackupex --database="testinnodb test" --user=root --no-lock --defaults-file=/data0/mysql/my.cnf /data0/backup/mysql 2>/tmp/mysqlbackup.log 注:使用 mysql 的 root 用户将数据库 testinnodb 和 test 的备份,备份路径是 / data0/backup/mysql/。备份 成功后会在该目录下将创建以时间戳为名称的备份目录。no-lock 参数用于指定备份时不锁定表。2>/tmp/mysqlbackup.log 是 将备份过程中的输出信息保存到 / tmp/mysqlbackup.log 中。 2、打包备份 BASH innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar 注:这种备份时间会比较长,主要是执行压缩操作。这种方式打的包需要使用 tar izxvf 解压。参数 - i 是必须加上的。 3、压缩备份 BASH innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz 4、备份到远程服务器 备份当前机器下的数据到 192.168.1.101 的 / data0 / 目录下。 BASH innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/|ssh root@192.168.1.101 cat ">"/data0/backup.tar B、数据恢复 以压缩后的备份数据为例,普通备份和打包备份的恢复方法和这个类似,就不在举例了。 解包备份数据 BASH tar xvzfi mike.tar.gz 指定恢复备份所需的 xtrabackup_logfile 文件的目录 BASH innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql 从备份目录拷贝数据、索引、日志到 my.cnf 文件里规定初始的数据目录位置。 BASH innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql 修改数据目录权限 BASH chown -R mysql:mysql /data0/mysql/data 重启 MySQL BASH /data0/mysql/mysql restart 五、参考文档 http://www.google.com http://www.linuxidc.com/Linux/2011-05/35410.htm http://blogold.chinaunix.net/u4/122567/showart_2537465.html
来源: http://blog.csdn.net/nightelve/article/details/17397245