共计 5052 个字符,预计需要花费 13 分钟才能阅读完成。
原理:
在 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 的安装:
官网下载 rpm 包或者 tar.gz 包解压就能用,此外需要通过 epel 的 yum 安装依赖包 libev
# yum install libev -y
# rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm
rpm 包释放的可执行文件如下:
/usr/bin/innobackupex # 封装过的 perl 脚本
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup # 主程序
xtrabackup 的使用:
1、完全备份
# innobackupex –user=DBUSER –password=SECRET /path/to/backup/dir/
生成的是一个以当前日期命名的文件夹。
如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:
> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘bkpuser’@’localhost’ IDENTIFIED BY ‘123456’;
> FLUSH PRIVILEGES;
使用 innobakupex 备份时,其会调用 xtrabackup 备份所有的 InnoDB 表,复制所有关于表结构定义的相关文件(.frm)、以及 MyISAM、MERGE、CSV 和 ARCHIVE 表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中。
在备份的同时,innobackupex 还会在备份目录中创建如下文件:
(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为 prepared 状态)和 LSN(日志序列号)范围信息;
每个 InnoDB 页 (通常为 16k 大小) 都会包含一个日志序列号,即 LSN。LSN 是整个数据库系统的系统版本号,每个页面相关的 LSN 能够表明此页面最近是如何发生改变的。
(2)xtrabackup_binlog_info:mysql 服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb: 二进制日志文件及用于 InnoDB 或 XtraDB 表的二进制日志文件的当前 position。
(4)xtrabackup_binary: 备份中用到的 xtrabackup 的可执行文件;
(5)backup-my.cnf: 备份命令用到的配置选项信息;
在使用 innobackupex 进行备份时,还可以使用 –no-timestamp 选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex 命令将会创建一个 BACKUP-DIR 目录来存储备份数据。
完全备份 \ 恢复示例:
备份:
在 node1 上执行:
# /etc/init.d/mysqld stop
# innobackupex –user=root –password=xxxx –no-timestamp /backups/
# scp -rp /backups/ root@node2:/tmp
恢复:
在 node2 上执行恢复:
1、node2 上停止 mysql 服务(如果启动的话),并删除 mysql 的数据目录下所有文件:
# /etc/init.d/mysqld stop
# rm -fr /data/mysql/*
2、在 node2 上执行整理操作:
# innobackupex –apply-log /tmp/backups/
3、在 node2 上执行恢复操作,并修改文件属主属组:
# innobackupex –copy-back /tmp/backups/
# chown -R mysql.mysql /data/mysql/*
4、在 node2 上启动 mariadb 服务:
# /etc/init.d/mysqld start
2、增量备份
每个 InnoDB 的页面都会包含一个 LSN 信息,每当相关的数据发生改变,相关的页面的 LSN 就会自动增长。这正是 InnoDB 表可以进行增量备份的基础,即 innobackupex 通过备份上次完全备份之后发生改变的页面来实现。
要实现第一次增量备份,可以使用下面的命令进行:
# innobackupex –user=root –password=xxxx –incremental /backup –incremental-basedir=BASEDIR
其中,BASEDIR 指的是完全备份所在的目录,此命令执行结束后,innobackupex 命令会在 /backup 目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其 –incremental-basedir 应该指向上一次的增量备份所在的目录。
注意: 增量备份仅能应用于 InnoDB 或 XtraDB 表,对于 MyISAM 表而言,执行增量备份时其实进行的是完全备份。
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份 (包括完全和各个增量备份) 上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
于是,操作就变成了:
# innobackupex –apply-log –redo-only BASE-DIR
接着执行:
# innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-1
而后是第二个增量:
# innobackupex –apply-log –redo-only BASE-DIR –incremental-dir=INCREMENTAL-DIR-2
其中 BASE-DIR 指的是完全备份所在的目录,而 INCREMENTAL-DIR- 1 指的是第一次增量备份的目录,INCREMENTAL-DIR- 2 指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上的操作;
增量备份、恢复示例:
1、先做一个完全备份
# innobackupex –user=root /backups/ 会在 /backups/ 下生成一个以当前时间命名的文件夹。如下图:
2、对数据表执行些修改等操作
【数据表的修改操作略过】
3、执行增量备份
# innobackupex –incremental /backups/ –incremental-basedir=/backups/2015-11-08_19-24-05
说明:
有时候查看增量备份的文件中的 xtrabackup_checkpoints 发现其数值没变化,可能是 LSN 变化太小了。执行大量的数据表修改等操作后,会发现其 LSN 是会变化的,有时候不变也是正常的。
补充个脚本的方式执行全备份、增量备份:
全备份:
innobackupex –user=root –password=123456 /backups/
增量备份:
innobackupex –user=root –password=123456 –incremental /backups/ –incremental-basedir=/backups/$(ls -l /backups| awk ‘{print $NF}’|tail -1)
# 将上面的 2 个添加到 cron 计划任务即可,备份的路径是 /backups/ 目录下。
4、合并备份文件
# innobackupex –user=root –password=123456 –apply-log-only –redo-only /backups/2015-11-08_19-57-53/
# innobackupex –user=root –password=123456 –apply-log-only –redo-only /backups/2015-11-08_19-57-53/ –incremental-dir=/backups/2015-11-08_19-59-31/
# cat /backups/2015-11-08_19-57-53/xtrabackup_checkpoints # 检验是否合并成功
5、执行恢复数据到数据库的操作
# innobackupex –user=root –password=123456 –copy-back /backups/2015-11-08_19-57-53/【注意这里填的应该是 basedir 的路径】
# ls -lh /data/mysql/ 查看文件是否恢复
# chown -R mysql.mysql /data/mysql/ 修改文件权限
6、启动 MySQL 查看是否数据已恢复
# /etc/init.d/mysqld start
MySQL 管理之使用 XtraBackup 进行热备 http://www.linuxidc.com/Linux/2014-04/99671.htm
MySQL 开源备份工具 Xtrabackup 备份部署 http://www.linuxidc.com/Linux/2013-06/85627.htm
MySQL Xtrabackup 备份和恢复 http://www.linuxidc.com/Linux/2011-12/50275.htm
用 XtraBackup 实现 MySQL 的主从复制快速部署【主不锁表】http://www.linuxidc.com/Linux/2012-10/71919p2.htm
安装和使用 Percona 推出的 Xtrabackup 备份 MySQL http://www.linuxidc.com/Linux/2011-10/44451.htm
XtraBackup 的详细介绍:请点这里
XtraBackup 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/132821.htm