概述

关于XtraBackup

XtraBackup是由Percona公司开发的一款基于InnoDB的MySQL数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对InnoDB和XtraDB数据库进行热备的工具。其有如下特点:

  1. 备份过程快速、可靠;
  2. 备份过程不会打断正在执行的事务;
  3. 能够基于压缩等功能节约磁盘空间和流量;
  4. 自动实现备份检验;
  5. 还原速度快;

XtraBackup功能

  • 热备份
  • 增量备份
  • 备份到另一台MySQL服务器
  • 在MySQL服务器之间在线迁移表
  • 轻松创建新的从服务器
  • 备份时,不占用服务器资源

XtraBackup工作原理

XtraBackup是基于InnoDB的crash恢复功能。复制InnoDB数据文件,但是数据是不一致的,然后使用crash恢复让数据文件一致。当InnoDB启动时会去检查数据文件和日志文件,然后重做已提交事务,执行未提交事务。

XtraBackup记下LSN(Log Sequence Number),然后启动,复制数据文件。同时XtraBackup启动一个后台进程用来监控日志文件,然后复制修改,这个进程在备份期间一直是运行的,因为日志文件时回绕的,避免数据被覆盖无法恢复。直到备份完成。

第二阶段就是预备阶段,XtraBackup通过执行crash恢复,应用日志文件到数据文件上。等待复制InnoDB结束,然后执行FLUSH TABLES WITH READ LOCK,停止对mysql数据的修改。复制非innodb引擎表,直到复制完成,然后释放锁。

这样在prepare阶段后,InnoDB和非InnoDB相互保持了一致性。InnoDB会一直redo,直到备份完成。这个时间刚刚好和FLUSH TABLES WITH READ LOCK时间一直,所以InnoDB和非InnoDB是保持同步的。

工作原理图示:

备份过程:
备份过程.png

恢复过程:
恢复过程.png

增量备份过程:
增量备份过程.png

增量备份恢复过程1:
增量备份恢复过程1.png

增量备份恢复过程2:
增量备份恢复过程2.png

安装XtraBackup

介绍yum的安装方法,更多安装方法参考官方文档

Installing Percona XtraBackup 2.4

  1. 安装Percona官方提供yum源

    yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
    # 应该会看到以下输出:
    Retrieving http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
    
    Preparing...           ######################### [100%]
       1:percona-release  ######################### [100%]
  2. 安装percona-xtrabackup

    yum install percona-xtrabackup-24

备份前的准备

权限

xtrabackup需要连接到数据库和datadir操作权限。

xtrabackup或者innobackupex在使用过程中设计到2类用户权限:

  1. 系统用户,用来调用innobackupex或者xtrabackup
  2. 数据库用户,数据库内使用的用户

连接

innobackupex或者xtrabackup通过--user和--password连接到数据库服务

# 备份到指定目录
xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
# 同上
innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
# 压缩保存
innobackupex --user=LUKE  --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -

其他连接选项

选项描述
--port指定连接的端口
--socket指定连接socket
--host指定连接的主机

3.4 MySQL账号权限

  • RELOAD和LOCK TABLES权限为了执行FLUSH TABLES WITH READ LOCK
  • REPLICATION CLIENT为了获取binary log 位置
  • CREATE TABLESPACE权限为了导入表,用户表级别的恢复
  • PROCESS 权限为了执行 SHOW ENGINE INNODB STATUS
  • SUPER 权限在slave环境下备份用来启动和关闭slave线程
  • CREATE权限为了创建PERCONA_SCHEMA.xtrabackup_history 数据库和表
  • INSERT权限为了写入历史记录到xtrabackup_history
  • SELECT权限为了查询xtrabackup_history

创建一个最小权限账号

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON . TO
       'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

配置XtraBackup(可选)

编辑my.cnf,加入

[xtrabackup]
target_dir = /data/backups/mysql/

添加后,执行xtrabackup命令时,--target-dir参数就可以不写了

xtrabackup与innobackupex

在 XtraBackup 2.2 及之前的版本,innobackupex 是 perl 脚本对 xtrabackup 命令的封装和功能扩展。

在 XtraBackup 2.3 及以后的版本中,innobackupex 仅仅是 xtrabackup 的一个软链接,但是为了兼容之前的版本,仍然保留 innobackupex 命令的用法。

全备的实现

创建全备

使用xtrabackup命令

想要创建一个全备,执行xtrabackup 命令带上--backup选项,还必须指定--target-dir选项指定备份存放目录。当--target-dir指定的路径不存在或为空目录时,程序会自动创建,当指定是一个为非空目录时,会报一个错误file exists。

$ xtrabackup --backup --target-dir=/data/backups/base

此外,如果访问 MySQL 需要账号密码,你应该还要加上--user=USER --password=PASSWORD,如果提示 socket 找不到,应该还要加上--socket=/PATH/TO/SOCKET选项

当成功执行,会得到以下结果:

160906 10:19:17 Finished backing up non-InnoDB tables and files
160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '62988944'
xtrabackup: Stopping log copying thread.
.160906 10:19:18 >> log scanned up to (137343534)
160906 10:19:18 Executing UNLOCK TABLES
160906 10:19:18 All tables unlocked
160906 10:19:18 Backup created in directory '/data/backups/base'
160906 10:19:18 [00] Writing backup-my.cnf
160906 10:19:18 [00]        ...done
160906 10:19:18 [00] Writing xtrabackup_info
160906 10:19:18 [00]        ...done
xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied.
160906 10:19:18 completed OK!
或者使用innobackupex命令
$ innobackupex /data/backups/base

默认情况下,使用 innobackupex 命令,将会在目标目录下新建一个以当前日期命名的目录,并将备份文件存放到这个新建的目录下。

命令执行成功后,将会得到以下结果

innobackupex: Backup created in directory '/data/backups/2017-08-09_00-00-19'
innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 1946
111225 00:00:53  innobackupex: completed OK!

可以看到备份目录在/data/backups/2017-08-09_00-00-19

全备创建完成后,备份文件夹下的xtrabackup-checkpoints文件会记录以下信息:

backup_type = full-backuped
from_lsn =0
to_lsn =1291135

其中backup_type = full-backuped表示这个备份为全备

其他选项:

--no-timestamp,指定了这个选项备份会直接备份在 BACKUP-DIR,不再创建时间戳文件夹,建议使用此选项

--default-file,指定配置文件,用来配置 innobackupex 的默认参数。

使用全备还原数据

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。需要执行“准备”动作。

准备一个完全备份

“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

使用xtrabackup命令
$ xtrabackup --prepare --target-dir=/data/backups/base

执行成功,得到以下输出:

InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
或者使用innobackupex命令
$ innobackupex --apply-log /data/backups/base

执行成功,得到以下输出:

InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
从一个准备好的完全备份恢复数据

准备好备份之后,就可以使用备份来还原了

第一步:停止数据库

$ mysqladmin shutdown

第二步:删除数据库所有文件、binlog、undolog、ibdata、innodb_log

$ rm -fr /home/mysql/data/{binlog,innodb_data,my_data,innodb_undo,my_data}/*

第三步:恢复数据

使用xtrabackup命令

$ xtrabackup --copy-back --target-dir=/data/backups/base

或者使用innobackupex命令

$ innobackupex --copy-back /data/backups/base

第四步:修改权限

$ chown -R mysql.mysql /home/mysql/data/

第五步:启动MySQL服务

$ service mysql start

完成后,得到以下输出:

innobackupex: Finished copying back files.
111225 01:08:13  innobackupex: completed OK!

增备的实现

创建全备

要想创建一个增备,必须先创建一个全备。参考前面章节

$ xtrabackup --backup --target-dir=/data/backups/base

或者

$ innobackupex --no-timestamp /data/backups/base

创建第一个增备

$ xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base

或者

$ innobackupex --no-timestamp --incremental /data/backups/inc1 --incremental-basedir=/data/backups/base

增备创建完成后,备份文件夹下的xtrabackup-checkpoints文件会记录以下信息:

backup_type = incremental
from_lsn =0
to_lsn =1291135

其中backup_type = incremental表示这个备份为增备

创建第二个增备

$ xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1

或者

$ innobackupex –no-timestamp --incremental /data/backups/inc2 --incremental-basedir=/data/backups/inc1

使用增备还原数据

经过上面的全备和增备过程,得到的目录结构如下

/data/backups/base
/data/backups/inc1
/data/backups/inc2
准备
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

或者

$ innobackupex --apply-log --redo-lonly /data/backups/base

执行成功,得到以下输出:

InnoDB: Shutdown completed; log sequence number 137345046
160906 11:21:01 completed OK!
将第一个增备应用到全备
$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1

或者

$ innobackupex --apply-log --redo-only /data/backups/base --incremental-dir=/data/backups/inc1

将中间的增备都要应用

...

将最后一个增备应用到全备
$ xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2

或者

$ innobackupex --apply-log /data/backups/base --incremental-dir=/data/backups/inc2

这时,将会得到一个完整的备份。

恢复数据

恢复步骤和第四章节的一样,必须得先停止数据库,存放数据的目录为空。详情参考第4章节。

$ xtrabackup --copy-back /data/backups/base

或者

$ innobackupex --copy-back /data/backups/base

恢复完成后,还要修改目录权限才能启动MySQL服务,第四章节有详细的描述。

压缩备份

创建压缩备份

使用 xtrabackup --compress选项创建一个压缩备份

$ xtrabackup --backup --compress --target-dir=/data/compressed/

还可以限制压缩所使用的线程数

$ xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/compressed/

准备一个压缩备份

$ xtrabackup --decompress --target-dir=/data/compressed/
$ xtrabackup --prepare --target-dir=/data/compressed/

经过这个步骤,压缩备份被解压并准备好了,可以直接用于数据还原。

还原数据

$ xtrabackup --copy-back --target-dir=/data/compressed/

标签: XtraBackup

添加新评论