您的位置:首页 > 数据库 > MySQL

Xtrabackup 备份和还原mysql数据库

2013-11-06 11:16 477 查看
Xtrabackup工具:
http://www.percona.com/software/percona-xtrabackup/
原理
在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

Xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。

上面就是xtrabackup的备份过程。接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像mysql刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

以上的过程在xtrabackup的编译二进制程序中实现。程序innobackupex可以允许我们备份MyISAM表和frm文件从而增加了便捷和功能。Innobackupex会启动xtrabackup,直到xtrabackup复制数据文件后,然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进
来并把MyISAM表数据刷到硬盘上,之后复制MyISAM数据文件,最后释放锁。

备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以myisam表数据与InnoDB表数据是同步的。类似oracle的,InnoDB的prepare过程可以称为recover(恢复),myisam的数据复制过程可以称为restore(还原)。

Xtrabackup和innobackupex这两个工具都提供了许多前文没有提到的功能特点。手册上有对各个功能都有详细的介绍。简单介绍下,这些工具提供了如流(streaming)备份,增量(incremental)备份等,通过复制数据文件,复制日志文件和提交日志到数据文件(前滚)实现了各种复合备份方式。

XtraBackup主要包括两个程序:
1)innobackupex: 一个perl脚本,封装了 xtrabackup、tar4idb 程序,执行一些无关效率的零碎任务和调用主程序以及MySQL工具。
供了一个方便且完整的功能,可以应对各种场景下的需求。可以备份MyISAM、InnoDB和XtraDB引擎数据。
2)xtrabackup: 主程序,C实现,提供主要功能,负责备份InnoDB和XtraDB引擎数据。
3)xbcrypt:用来加密或解密备份的数据。
4)xbstream:用来解压或压缩xbstream格式的压缩文件。

innobackupex使用方法
全备:
备:
innobackupex --user=root --password=root /data/mysql_backup
还原:
innobackupex --apply-log --no-timestamp /data/mysql_backup/centos_full_backup
innobackupex --copy-back --defaults-file=/etc/my.cnf \
--no- timestamp /data/mysql_backup/centos_full_backup

chown -R mysql:mysql /var/lib/mysql

增量:
备:
innobackupex --user=root --password=root --no-timestamp /data/backup/full_backup
innobackupex --incremental --no-timestamp /data/backup/incremental/20131030 \
--incremental-basedir=/data/backup/full_backup --user=root --password=root \
--defaults-file=/etc/my.cnf
innobackupex --incremental /data/backup/incremental/20131031 \
--incremental-basedir=/data/backup/incremental/20131031 --user=root --password=root \
--defaults-file=/etc/my.cnf --no-timestamp
还原:
innobackupex --user=root --password=root --apply-log --redo-only \
--no-timestamp /data/backup/full_backup
innobackupex --apply-log --redo-only /data/backup/full_backup \
--incremental-dir=/data/backup/incremental/20131030 --user=root --password=root \
--no-timestamp
innobackupex --apply-log --redo-only /data/backup/full_backup \
--incremental-dir=/data/backup/incremental/20131031 --user=root --password=root \
--no-timestamp

innobackupex --apply-log /data/backup/full_backup --use-memory=1G \
--user=root --password=root --no-timestamp
innobackupex --copy-back --defaults-file=/etc/mysql/my.cnf \
--no-timestamp /data/backup/full_backup

备份部分库:
innobackupex --user=root --password=root --no-timestamp --defaults-file=/etc/mysql/my.cnf --include="centos.*|mysql.*" /data/backup

备份压缩:
innobackupex --user=root --password=root --no-timestamp \
--defaults-file=/etc/mysql/my.cnf --include="centos.*|mysql.*" \
--stream=tar ./ | gzip - > database.tar.gz

解压备份:
-i, --ignore-zeros 忽略归档中的零字节块(即文件结尾)
tar ixf database.tar.gz

程序说明
通常使用innobackupex进行备份,方便易操作,语法:
innobackupex [options] BACKUP-DIR
常用参数如下:
--host=<host>
--port=<port>
--user=<user>
--password=<password> 上述为连接数据库的参数
--apply-log 对指定backup目录下的备份文件根据事务日志进行一致性处理,即进行prepare操作。
--ibbackup=<IBBACKUP-BINARY> 指定使用哪个可执行程序作为主程序。默认会连接到数据库服务器后判断应使用哪个版本的xtrabackup。根据数据库版本不同可以指定xtrabackup_51或xtrabackup_55,或绝对路径(如果PATH中找不到的话)。
--safe-slave-backup 停止slave线程,直到show global status中Slave_open_temp_tables为0时再进行备份操作。这样可以避免基于会话的临时表的数据因slave被中断而丢失导致数据不一致。备份结束后会重新启动slave。
--no-lock 指定不执行flush privileges with read lock。如果能够确保没有DDL操作,没有针对非innodb表的更新(如mysql权限表),那么可以启用本选项,以避免锁定导致的服务中断。
--no-timestamp 不会在指定backup目录下生成时间戳命名的子目录,而是直接生成到指定backup目录。
--redo-only 设置只针对备份文件做redo操作,而不执行rollback。这样可以支持全备文件和后续的增备文件的合并。此选项会传递为xtrabackup的--apply-log-only选项。
--slave-info 备份从库时比较有用,可以自动生成针对主库的change master命令,保存至xtrabackup_slave_info文件中。
--copy-back 将已备份好的文件,从备份目录拷贝至原始目录(--defaults-file中datadir)
--move-back 将已备份好的文件,从备份目录移动至原始目录(--defaults-file中datadir)
--databases=LIST 指定innobackupex要备份的库表,LIST格式为:"dbname1[.tbnam1] dbname2[.tbnam2] ..."。如果不指定,则会备份所有包括MyISAM和InnoDB表的库。可以将清单写入文件,参考--tables-file。
--include=REGEXP 正则表达式来匹配databasename.tablename格式。传递给xtrabackup的--tables选项。
--incremental 指定进行增量备份。同时需要指定--incremental-lsn或--incremental-basedir来定义增量的起点。如果都没指定,则会配置为backup目录下的第一个时间戳的目录。
--incremental-basedir=DIRECTORY 设定增量备份的起始全备所在目录。与--incremental合用。
--incremental-dir=DIRECTORY 在增备与全备进行合并时设置增备所在目录,与--apply-log合用。
--incremental-lsn=LSN 设定增量备份的起始LSN。LSN是一个64位的整数。
--use-memory=2GB 指定xtrabackup工具在prepare备份文件时可以使用的内存量,只与apply-log合用。
与备份至远程主机相关的选项:
--rsync 使用rsync工具来优化文件传输。会拷贝所有的非InnoDB文件,而不是一个个拷贝单独文件。不能与--stream合用。
--stream=STREAMNAME 指定流备份的方式,当前可选tar和xbstream。该选项直接传给xtrabackup的--stream选项。
--tmpdir=DIRECTORY 与stream配合使用。事务日志在传输到远程主机前会先保存在临时文件中,默认为MySQL服务器配置文件中的tmpdir。
很多参数innobackupex会直接传递给xtrabackup,常用的包括:
--suspend-at-end 默认选项。xtrabackup执行完成后会生成xtrabackup_suspended文件,等待,直到该文件被删除,才结束。往往等待过程时,innobackupex工具执行FLUSH TABLES WITH READ LOCK,拷贝剩余的文件。
--parallel=NUMBER-OF-THREADS 用于拷贝的并发线程数
--tables-file=FILE 指定文件路径,该文件中记录需要备份的库和表
--compress 压缩InnoDB数据文件
--compress-threads=N 指定并行压缩的线程数
--defaults-file=[MY.CNF] 指定MySQL选项文件。如果指定,必须是xtrabackup的第一个参数
--throttle=IOS 设定每秒IO数。
--export 支持单独表的导出和导入,必须是独立表空间,而且当前支持导入的只有Percona Server。这里指的是可以export出来,移动到任意实例任意库,要求Percona Server开启innodb_file_per_table和innodb_expand_import选项。不指定该选项,也可以通过alter table xxx discard/import tables 来实现对原实例、原库
--extra-lsndir=DIRECTORY 指定额外的xtrabackup_checkpoints的文件的目录。

本文出自 “成功来源于分享” 博客,请务必保留此出处http://linuxchina.blog.51cto.com/938835/1320757
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: