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

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是相同 的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值