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

使用Percona XtraBackup对MySQL进行在线热备份

2014-06-15 15:07 381 查看
XtraBackup

提供了对MySQL数据的热备份功能,支持innodb和myisam引擎,实现了类似于物理备份的功能。

1 安装

yum install perl

yum install perl-Time-HiRes

下载http://www.percona.com/downloads/XtraBackup/LATEST/binary/ 页面对应系统的二进制包

2 准备权限

备份需要reload,lock table等权限,否则备份过程会出现问题

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


3 使用innobackupex 实施备份

innobackupex为perl脚本,其封装了xtrackup等工具的功能,通常使用此工具即可完成备份和还原。

3.1 基础备份

$innobackupex --user=backup --password=pass /path/to/bak/


基础备份会生成一个基于时间的目录BASEDIR,格式如2014-06-13_15-48-08。如果指定--no-timestamp选项,则直接在指定的目录下面存储备份文件。

备份目录下存储了库表文件、日志文件以及日志索引、配置文件等信息,这是一个近似于物理备份的过程,因而速度比较快。

对于innodb引擎的库,如果未设置innodb_table_per_file,则会包含一个大型的ibdata文件。此文件中包含所有的数据。如果设置了innodb_table_per_file,则在库名的目录下*.ibd文件中包含了各个表的数据。

3.2 Prepare备份

基础备份中包含了innodb log中未提交的数据,因此还需要应用日志,使得备份处于一致的状态

$innobackupex --apply-log /path/to/bak/BASEDIR


应用日志后,会在备份目录下生成ib_logfile0和ib_logfile1的innodb日志文件

3.3 备份恢复

对于Prepare过的备份才可以进行恢复

$innobackupex --copy-back /path/to/bak


其会根据当前服务器的配置my.cnf,将数据复制回数据目录中

3.4 增量备份

$innobackupex --incremental /path/to/bak --incremental-basedir=BASEDIR


增量备份将基于上次的基础备份信息,按时间生成一个增量的备份目录INCDIR

后续增量备份是相似的,只是basedir是上次增量的目录

$innobackupex --incremental /path/to/bak --incremental-basedir=PREV-INCDIR


在各备份的目录中有一个xtrabackup-checkpoints文件,其中记录了此次备份的类型,起止日志序列号LSN

3.5 增量备份的恢复

$innobackupex --apply-log --redo-only BASEDIR
#循环处理到倒数第二个增量
$innobackupex --apply-log --redo-only BASEDIR --incremental-dir=INCRDIR
#处理最后一个增量
$innobackupex --apply-log BASE-DIR --incremental-dir=LAST-DIR
#准备备份
$innobackupex --apply-log BASE-DIR
#恢复备份
$innobackupex --copy-back  /path/from/BASE-DIR


3.6 部分备份

支持表级和数据库级的备份,通过如下几个选项实现

--include="db.table" 支持正则表达式匹配需要备份的表

--tables-file=file 通过文件指定要备份的表,每行一个表名

--databases="db1 db2.table1" 指定要备份的库及表的列表

部分备份的prepare

$ innobackupex --apply-log --export /path/to/partial/backup


部分备份的恢复

CREATE TABLE mytable (...) ENGINE=InnoDB;           //创建相应的表结构
ALTER TABLE mydatabase.mytable DISCARD TABLESPACE   //删除表的table space
MV ..                                               //然后将导出文件复制到数据目录表的目录下
ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;   //启用table space


3.7 通过从库进行备份

$innobackupex --slave-info --safe-slave-backup /path/to/bak


--safe-slave-backup选项,将停止从库的同步线程

3.8 其他选项说明

--no-timestamp 默认备份文件上会带有时期标记,此选项可以去除之

--defaults-file 指定配置文件

--lock-wait-timeout=N 备份时等待READ LOCK锁的超时

--lock-wait-query-type=[all|update] 等待READ LOCK锁所等待的查询类型

--kill-long-queries-timeout=N 当等待锁时,如果查询时长超时,则KILL掉查询线程

--kill-long-query-type[all|select]

4 xtrackup

C代码实现的可执行程序,其使用了mysql clinet库和innodb库。为了兼容不同服务器版本,此工具也有多个版本,innobackupex工具自己会连接服务器以确认选择合适的版本。

本工具的配置均可以从MySQL服务器的配置文件中获取。当然也可以通过命令行指定。

4.1 创建基础备份

通过--backup选项来发起备份

$ xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/path/to/bak/


备份过程主要执行两个任务。一是启动一个日志复制线程,其监控innodb的日志文件(ib_logfile*),当日志文件变化时,线程将复制变化的数据到目的目录下的xtrabackup_logfile中。另一项是复制Innodb的数据文件到目标路径。

当数据复制完成后,xtrabackup会停止日志复制线程,并在目标路径下创建xtrabackup_checkpoints文件,其中记录了此次备份的类型,以及起止的日志序列号(LSN)

如果服务器开启了binlog,则会生成xtrabackup-binlog-info文件,记录了备份对应的binlog文件及位置

从此过程可以看到,备份的数据文件分两部分,一部分在备份的数据文件中,一部分在xtrabackup_logfile中。直接恢复这些数据,服务器会检查到数据的不一致,会直接Crash。如果要恢复,则需要执行Prepare的操作。以使得数据保持干净和一致。

4.2 Prepare数据

prepare过程并不依赖于原服务器的数据,因而可以在任务设备执行。

xtrabackup --prepare --target-dir=/path/to/bak/
xtrabackup --prepare --target-dir=/path/to/bak/


这里执行了两次prepare,没错,是两次。第一次保证数据一致。第二次将生成ib_logfile0/1日志文件,这样将数据直接恢复之后,服务器不需要重新生成日志文件,可以直接启动。

在此之后,再执行prepare将不会再对数据造成任何影响。

4.3 备份的还原

xtrabackup没有任何的还原功能,用户需要自行将数据cp到MySQL的数据目录,并设置适当的权限。

如果是全库的恢复,数据目录最好是干净的,除非是部分恢复。

4.4 增量备份与准备

Innodb采用16KB的页来存储数据,而且每个页面上都记录了LSN,通过检查最新的LSN可以实现增量备份。

xtrabackup --backup --target-dir=/path/to/inc1 --incremental-basedir=/path/to/base --datadir=/var/lib/mysql/


后续的增量是类似的,只是basedir将是上一次的增量备份目录,在恢复之前 需要先进行准备

#prepare基础数据
xtrabackup --prepare --apply-log-only --target-dir=/path/to/base
#循环处理直到倒数第二个增量
xtrabackup --prepare --apply-log-only --target-dir=/path/to/base --incremental-dir=/path/to/each_inc
#处理最后一个增量
xtrabackup --prepare --target-dir=/path/to/base --incremental-dir=/path/to/final_inc


4.5 部分备份与还原

使用--tables或--tables-file指定需要单独备份哪些表

xtrabackup --prepare --export --target-dir=/path/to/bak 可准备单个表的导出

之后的还原过程和使用innobackupex是相同 的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: