8 增量备份xtrabackup

增量备份xtrabackup

MySQL 备份工具

物理备份缺点

  1. 跨平台性差
  2. 备份时间长,冗余备份,浪费存储空间

mysqldump 备份缺点

  1. 效率较低,备份和还原速度慢
  2. 备份过程中,数据插入和更新操作会被挂起

XtraBackup工具

优点

  1. 备份过程中不锁库表,适合生产环境
  2. 由专业组织Percona提供( 改进MySQL分支 )

主要组件

  1. xtrabackup: C程序,支持InnoDB/XtraDB
  2. innobackupex: 以Perl脚本封装xtrabackup,支持MyISAM

安装 Xtrabackup

通过官方源安装

#安装Percona官方源
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
#安装 xtrabackup 2.4版本,不同版本支持不同版本的MySQL
yum install  percona-xtrabackup-24 -y
#查看版本
xtrabackup --version

xtrabackup: recognized server arguments: --server-id=101 --log_bin=/logdir/rz --datadir=/var/lib/mysql
xtrabackup version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c)

#查看安装rpm包
rpm -qa |grep percona
#查看RPM包安装文件
rpm -ql percona-xtrabackup-24

基本参数

常用选项 含义
--host 主机名
--user 用户名
--port 端口号
--password 密码
--databases 数据库名
--no-timestamp 不用日期命名备份文件存储的子目录名
多库语法 说明
--databases="库名" 单个库
--databases="库1 库2" 多个库
--databases="库.表" 单个表

进阶参数

常用选项 含义
--redo-only 日志合并
--apply-log 准备还原(回滚日志)
--copy-back 恢复数据
--incremental 目录名 增量备份
--incrementtal-basedir=目录名 增量备份时,指定上一次备份数据存储的目录名
--incremental-dir=目录名 准备恢复数据时,指定增量备份数据存储的目录名
--export 导出表信息
--import 导出表空间

Innobackupex应用案例

完全备份

  1. 将所有库完全备份到 /backup
innobackupex --user root --password 123123 /allbak [--no-timestamp]

xtrabackup 不能备份MySIAM表

innobackupex 封装了xtrabackup,可以增量备份 innodb ,但是mysiam是全量备份

  1. 备份指定库
innobackupex --user root --password 123123 --databases="buydb mysql" /twodbbak [--no-timestamp]
  1. 备份指定表所有数据
innobackupex --user root --password 123123 --databases="buydb.a" /opt/a --no-timestamp
  1. 要求数据库目录为空,才可以恢复数据.生产环境一般使用全备.恢复时,缺少系统三个库时会无法启动.
innobackupex --user root --password 123123 --databases="mysql sys performance_schema buydb" /opt/buydbfull --no-timestamp

完全恢复

要求数据库目录为空

  1. 重做日志 --apply-log
  2. 恢复数据 --copy-back
  3. 重启数据库服务
#重做日志 
innobackupex --user root --password 123123 --apply-log /opt/buydbfull/

#xtrabackup_checkpoints 文件中 backup_type 会从 backed变化为 prepared
cat /opt/buydbfull/xtrabackup_checkpoints 
backup_type = full-prepared

#停止数据库,清空数据目录,否则无法恢复
systemctl stop mysqld
rm -rf /var/lib/mysql/*

#恢复数据,修改文件所有者
innobackupex --copy-back /opt/buydbfull/
chown -R mysql. /var/lib/mysql

#启动mysqld,查看
systemctl start mysqld

增量备份

做首次备份(完全备份)

innobackupex --user root --password 123123 --databases="mysql sys performance_schema buydb" /fullbuydb --no-timestamp

写入新数据,第一次增量备份

--incremental 执行增量备份文件存储目录

--incremental-basedir= 上次备份文件存储目录

innobackupex --user root --password 123123 --databases="mysql sys performance_schema buydb" --incremental /new1dir --incremental-basedir=/fullbuydb --no-timestamp

写入新数据,第二次增量备份

innobackupex --user root --password 123123 --databases="mysql sys performance_schema buydb" --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp

生产环境中定时执行,

00 23 * * 1 /shell/allbak.sh    完全备份innobackupex,每周1执行
00 23 * * 2-7 /shell/newdata.sh 增量备份innobackupex,周二到周日执行

工作原理 innodb 和 xtrdb 有效

增量备份工作原理

事务日志文件的LSN,每次增量备份都会记录每次的LSN范围值.

ib_logfile0 正确完成的sql命令

ib_logfile1 正确完成的sql命令

ibdata1 未提交的sql命令

LSN 日志序列号 增量备份lsn记录在 xtrabackup_checkpoints

每一条命令有一个 LSN

增量恢复

--incremental-dir= 增量备份目录名

  1. 重做并合并日志 --apply-log --redo-only

  2. 停止服务,清空数据目录

  3. 恢复数据

#合并增量备份的日志,范围取自 lsn值
innobackupex --apply-log --redo-only /fullbuydb/
innobackupex --apply-log --redo-only /fullbuydb/ --incremental-dir=/new1dir
innobackupex --apply-log --redo-only /fullbuydb/ --incremental-dir=/new2dir
#停止服务清空数据目录
systemctl stop mysqld
rm -rf /var/lib/mysql/*

#恢复数据
innobackupex --copy-back /fullbuydb/
chown mysql. /var/lib/mysql -R
systemctl start mysqld

完全备份文件中恢复某个表

--export 导出表信息

恢复步骤

  1. 从备份数据利导出表信息.
#全备中导出buydb库下表信息
innobackupex --apply-log --export /buydbfull2 --no-timestamp

#查看buydb库备份文件,新增 后缀为 .cfg 和 .exp 表信息文件
ls /buydbfull2/buydb/
a.cfg  a.exp  a.frm  a.ibd  b.cfg  b.exp  b.frm  b.ibd  db.opt
  1. 创建删除的表( 表结构要和删除时相同 )
mysql> create table b(name char(10));
  1. 删除表空间

alter table 库名.表名 discard tablespace;

mysql> alter table buydb.b discard tablespace;
  1. 把导出的表信息文件拷贝到数据库目录下
cp /buydbfull2/buydb/b.{cfg,exp,ibd} /var/lib/mysql/buydb/
  1. 修改所有者
chown mysql. -R /var/lib/mysql
  1. 导入表空间

alter table 库名.表名 import tablespace;

mysql> alter table buydb.b import tablespace;
  1. 验证查看数据,删除无用表信息文件
mysql> select * from buydb.b;
rm -rf /var/lib/mysql/buydb/b.{exp,cfg};

你可能感兴趣的:(8 增量备份xtrabackup)