首页 » MySQL » 正文

MySQL备份工具XtraBackup使用心得

前言

XtraBackup

是一款免费开源数据备份工具。支持在线无锁表同步复制和可并行高效率的安全备份恢复机制。

官网:https://www.percona.com/software/mysql-database/percona-xtrabackup

优点

  • 高可用备份方式(数据备份+事务回放)
  • 备份过程不中断事务处理
  • 支持备份压缩节约磁盘空间和网络带宽
  • 自动备份校验
  • 恢复速度较快

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

  • xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  • innobackupex是一个perl脚本封装了xtrabackup。支持同时备份InnoDB和MyISAM引擎的表

工作原理

备份完整的过程分为两个阶段:物理备份、事务重放(redo undo)

Xtrabackup工作原理

  1. xtrabackup启动时,会实时监控log buffer中的日志情况,一旦log buffer发生变化,即数据发生了不一致,该过程会立即被捕获并把变化的页面复制到xtrabckup log
  2. 同时,在启动时会记住log sequence number(LSN),然后开始数据文件和系统表空间文件复制
  3. innodb数据文件复制完成后,停止监控log buffer。
  4. 将xtrabckup log记录的复制过程中发生的事务操作进行重放,以保持数据的一致性。

Innobackupex工作原理

QQ截图20170321173107

  1. xtrabackup启动时,会实时监控log buffer中的日志情况,一旦log buffer发生变化,即数据发生了不一致,该过程会立即被捕获并把变化的页面复制到xtrabckup log
  2. 同时,在启动时会记住log sequence number(LSN),然后开始数据文件和系统表空间文件,复制完成后,停止监控log buffer。
  3. 然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyISAM表数据刷到硬盘上
  4. 然后开始复制表结构文件
  5. 复制完成时会获取binlog位置
  6. 释放锁
  7. 将xtrabckup log记录的复制过程中发生的事务操作进行重放,以保持数据的一致性。

* LSN(Log sequence number ):InnoDB的LSN是一个增长的序列,类似于Oracle的SCN,记录了InnoDB的变化情况(了解更多:传送门

 

通常情况下,备份工作不仅仅是备份数据文件,还需要备份表结构,以防我们在发生数据损坏或丢失时,进行完整的数据恢复工作。由于xtrabackup工具只能备份InnoDB和XtraDB两种数据表且不备份数据表结构,所以我们可以直接使用innobackupex工具进行数据备份工作。
innobackupex工具在完成数据文件备份后默认会做锁表操作,然后开始备份表结构,如果数据库表使用的引擎均是innodb引擎,且数据表结构不经常变更或备份工作放在业务闲时可以使用–no-locks参数不进行锁表操作。

查看表引擎方法:SHOW TABLE STATUS FROM DBname;

 

YUM极简安装过程

下载:

libev4:http://rpmfind.net/linux/rpm2html/search.php?query=libev.so.4()(64bit)

xtrabackup:https://www.percona.com/downloads/XtraBackup/LATEST/

安装:

innobackupex 工具基本操作

Usage: [innobackupex [--defaults-file=#] --backup | innobackupex [--defaults-file=#] --prepare] [OPTIONS]

常用参数

备份方式

  • 全量备份
  • 增量备份

完全备份

如果是混合引擎,需要进行锁表备份操作
# innobackupex --defaults-file=/etc/my.cnf --user=XXXXXX --password=XXXXXX /bakcup/bak20170317/
只有innodb引擎,不锁表备份备份操作
# innobackupex --defaults-file=/etc/my.cnf --user=XXXXXX --password=XXXXXX --no-lock /bakcup/bak20170317/
如果是集群中slave角色,不锁表备份操作
# innobackupex --defaults-file=/etc/my.cnf --user=XXXXXX --password=XXXXXX --safe-slave-backup --no-lock /bakcup/bak20170317/

完全备份后事务回放
# innobackupex --user=XXXXXX --password=XXXXXX --defaults-file=/etc/my.cnf --apply-log /bakcup/bak20170317/2017-03-17_16-08-14

增量备份

# innobackupex --user=XXXXXX --password=XXXXXX --incremental --incremental-basedir/bakcup/bak20170317/2017-03-17_16-08-14 /add_backup

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

增量备份后事务重放

将已经提交的事务进行“回放”(redo)

# innobackupex --apply-log --redo-only BASE-DIR(全量备份目录)

第一个增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1(增量备份1目录)

第二个增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2(增量备份2目录)

对于存在多次增量的情形,仅仅只有最后一个增量不需要使用–redo-only 选项(即执行undo),如果使用了的话,rollback将由服务器启动的时候来完成。

最后多次增量最后合并到一个完整的全量备份目录中。

 

数据恢复

待续。。。。

发表评论