增量备份xtrabackup
MySQL 备份工具
物理备份缺点
- 跨平台性差
- 备份时间长,冗余备份,浪费存储空间
mysqldump 备份缺点
- 效率较低,备份和还原速度慢
- 备份过程中,数据插入和更新操作会被挂起
XtraBackup工具
优点
- 备份过程中不锁库表,适合生产环境
- 由专业组织Percona提供( 改进MySQL分支 )
主要组件
- xtrabackup: C程序,支持InnoDB/XtraDB
- 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应用案例
完全备份
- 将所有库完全备份到 /backup
innobackupex --user root --password 123123 /allbak [--no-timestamp]
xtrabackup 不能备份MySIAM表
innobackupex 封装了xtrabackup,可以增量备份 innodb ,但是mysiam是全量备份
- 备份指定库
innobackupex --user root --password 123123 --databases="buydb mysql" /twodbbak [--no-timestamp]
- 备份指定表所有数据
innobackupex --user root --password 123123 --databases="buydb.a" /opt/a --no-timestamp
- 要求数据库目录为空,才可以恢复数据.生产环境一般使用全备.恢复时,缺少系统三个库时会无法启动.
innobackupex --user root --password 123123 --databases="mysql sys performance_schema buydb" /opt/buydbfull --no-timestamp
完全恢复
要求数据库目录为空
- 重做日志 --apply-log
- 恢复数据 --copy-back
- 重启数据库服务
#重做日志
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= 增量备份目录名
-
重做并合并日志 --apply-log --redo-only
-
停止服务,清空数据目录
-
恢复数据
#合并增量备份的日志,范围取自 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 导出表信息
恢复步骤
- 从备份数据利导出表信息.
#全备中导出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
- 创建删除的表( 表结构要和删除时相同 )
mysql> create table b(name char(10));
- 删除表空间
alter table 库名.表名 discard tablespace;
mysql> alter table buydb.b discard tablespace;
- 把导出的表信息文件拷贝到数据库目录下
cp /buydbfull2/buydb/b.{cfg,exp,ibd} /var/lib/mysql/buydb/
- 修改所有者
chown mysql. -R /var/lib/mysql
- 导入表空间
alter table 库名.表名 import tablespace;
mysql> alter table buydb.b import tablespace;
- 验证查看数据,删除无用表信息文件
mysql> select * from buydb.b;
rm -rf /var/lib/mysql/buydb/b.{exp,cfg};
网友评论