xtrabackup工具备份与恢复

1、xtrabackup简介

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。它能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁)。XtraBackup支持所有的Percona Server、MySQL、MariaDB和Drizzle。

xtrabackup有两个主要的工具:xtrabackup、innobackupex

  • xtrabackup,只能备份InnoDB和XtraDB两种数据表
  • innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表

Innobackupex完整备份后生成了几个重要文件

  • xtrabackup_binlog_info:记录当前最新的LOG Position,在备份的那一刻服务器二进制所处的位置,通过SHOW MASTER STATUS获取
  • xtrabackup_binlog_pos_innodb:InnoDB表或XtraDB当前所处的二进制位置,与InnoDB事务相关
  • xtrabackup_checkpoints: 存放备份的起始位置beginlsn和结束位置endlsn,增量备份需要这个lsn[增量备份可以在这里面看from和to两个值的变化]
  • xtrabackup_logfile:在备份过程中拷贝的事务日志,用于预还原

1.1 xtrackup特点

  • 能够对InnoDB实现热备,无需暂停数据库
  • 能够对MySQL进行增量备份
  • 对MySQL备份能够实现流式压缩并传输给其他服务器,--stream参数实现
  • MySQL服务运行时能够在MySQL 服务器之间进行表的迁移
  • 能够很容易创建一个MySQL从服务器
  • 备份MySQL时不会增加服务器负担

XtraBackup能够带InnoDB引擎创建的表实现热备,对MyISAM引擎实现温备。

1.2 备份原理

在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

使用xtrabackup进行还原,需要xtrabackup进行”备份”和”准备”:先将文件全部复制过来,再根据事务日志对部分操作进行回滚,如下描述:

  • xtrabackup的备份过程。Xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。所以,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup持续地做这个操作,这些数据改动会写入xtrabackup_logfile文件。xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。
  • 接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像mysql刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。

更详细的描述如下:

  • 1. 调用xtrabackup对innodb表空间文件(这一瞬间的映像Time1)备份,而在这个innodb表备份期间数据库是不加锁的,外部可以继续往库里增减数据(这才能叫热备份)。而在Time1和Time2这两个时间点之间的改动由一个线程不断地扫innodb log获得(ChangeSet1),一旦发现redo中有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中
  • 2. 锁所有库。
  • 3. 以直接拷贝的方式备份frm,MYD,MYI,MRG,TRG,TRN,opt格式的文件。
  • 4. 步骤3中的数据备份完毕时(Time2),停止扫innodb log的线程,把ChangeSet1的数据拷贝到备份中。
  • 5. 解锁所有库。
  • 6. 终止挂起,备份完毕。

image

注意要点

  • 根据innobackupex的原理可知它不是真正的热备份,MyISAM表越少越小就越有利。要利用Xtrabackup的好处就尽量用innodb表。
  • 还原备份前关闭mysql服务;还原备份后检查数据文件权限是否正确。

2、xtrabackup安装

redhat6的版本,使用2.3.4这个版本

此链接下载:https://www.percona.com/downloads/Percona-XtraBackup-2.3/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

Xtrabackup包依赖于epel源一些工具包,所以使用yum安装。

yum install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm

依赖这两个包:

clip_image001

安装完后的目录结构如下,有4个可执行文件

usr

├── bin

│ ├── innobackupex

│ ├── xbcrypt

│ ├── xbstream

│ └── xtrabackup

其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制。

  • xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。简单来说,innobackupex 在 xtrabackup 之上做了一层封装。
  • 一般情况下,我们是希望能备份 MyISAM 表的,虽然我们可能自己不用 MyISAM表,但是 mysql 库下的系统表是 MyISAM 的(mysql自带的数据库都是什么存储引擎?经查,mysql是MyISAM,information_schema是MEMORY,performance_schema是PERFORMANCE_SCHEMA),因此备份基本都通过 innobackupex 命令进行;另外一个原因是我们可能需要保存位点信息。
  • 另外2个工具相对小众些,xbcrypt 是加解密用的;xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两都在备份和解压时都会用到(如果备份用了加密和并发)。

3、备份

3.1 全库备份

备份场景1:备份所有数据库:备份目录里生成日期命名的文件夹

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock /data/backup/

出现completed OK!表示备份完成

clip_image001[5]

innobackupex会在指定存放数据的目录下用当前时间创建一个目录,所有生成的备份文件都会这个时间目录下

clip_image001[7]


备份场景2:备份所有数据库,指定目录的名称

--no-timestamp参数的使用

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --no-timestamp /data/backup/backup_dir

3.2 备份指定数据库

备份场景1:备份指定数据库

备份A和B数据库,使用--databases参数指定数据库

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --databases="A B" --no-timestamp /data/backup/backup_database

3.3 备份指定表

备份场景1:备份不同库下的不同表,还是使用--databases参数,指定到表

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --databases="A.hrms_ao B.checktype" --no-timestamp /data/backup/backup_tables


备份场景2:备份一个库下的表,支持正则表达式,使用--include参数,备份A库下h开头的表

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --include="A.h" --no-timestamp /data/backup/backup_tables

3.4 增量备份

使用--incremental-basedir和--incremental参数来进行增量备份

innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=xxx --socket=/var/lib/mysql/mysql.sock --no-timestamp --incremental-basedir=/data/backup/backup_dir  --incremental /data/backup/increment_data/

--incremental-basedir:全量备份目录

--incremental:增量备份目录

注:全量备份的目录是:/data/backup/backup_dir


4、还原

4.1 全库还原

注:还原时,mysql服务器需要关闭,而且数据目录必须是空的,innobackupex –copy-back不会覆盖已存在的文件

  • 先准备(prepare)一个完全备份
innobackupex --apply-log /data/backup/2018-11-08_09-41-06

备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

利用 --apply-log参数,此参数的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

执行完后,xtrabackup_checkpoints文件里面的backup_type会变成full-prepared状态(之前是full-backuped的状态)

clip_image001[9]

  • 还原
innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/2018-11-08_09-41-06/

注:

上面的命令加了--defaults-file参数,该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。

另外,上面的还原都没指定还原到哪个目录,mysql怎么知道?这就需要在my.cnf加入这个参数

datadir =/data/mysql

clip_image001[11]

出现completed OK! 代表还原成功

还原完记得修改权限:

chown -R mysql:mysql /data/mysql/*


综上,总结几个注意点:

  • 1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖
  • 2.在restore之前,必须shutdown MySQL实例,你不能将一个运行中的实例restore到datadir目录中
  • 3.由于文件属性会被保留,大部分情况下你需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户

4.2 增量还原

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。

第一步:先apply-log全量备份

innobackupex --apply-log --redo-only /data/backup/backup_dir

第二步:把增量备份数据合并到全量备份数据上

innobackupex --apply-log --redo-only /data/backup/backup_dir --incremental-dir=/data/backup/increment_data

此时增量备份上的数据已经合并到全量备份上了,查看xtrabackup_checkpoints

[root@report-server backup_dir]# more xtrabackup_checkpoints

backup_type = log-applied

from_lsn = 0

to_lsn = 48526869189 ----------跟增量备份上的lsn一致

last_lsn = 48526869189

compact = 0

recover_binlog_info = 0

增量备份上的xtrabackup_checkpoints

backup_type = incremental

from_lsn = 48526868973 ----------上次全量备份上的lsn

to_lsn = 48526869189 ----------增量备份的截止lsn

last_lsn = 48526869189

compact = 0

recover_binlog_info = 0


第三步:回滚完全备份

innobackupex --apply-log  /data/backup/backup_dir


第四步:还原

innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/backup_dir

进入到数据目录,修改权限:

chown -R mysql:mysql *

启动mysql,检查数据是否恢复成功。

4.3 xtrabackup全库还原+binlog日志还原

另外一篇日志说明



参考:

http://www.cnblogs.com/zhoujinyi/p/5893333.html

https://blog.51cto.com/13589448/2087693

https://www.linuxidc.com/Linux/2017-04/142477.htm

猜你喜欢

转载自www.cnblogs.com/fuqu/p/10618235.html