1、介绍
1.1、主要特点
物理备份工具,拷贝数据文件
备份和恢复数据的速度非常快,安全可靠
在备份期间执行的事务不会间断,备份innodb数据不影响业务
备份期间不增加太多数据库的性能压力
支持对备份的数据自动校验
运行全量,增量,压缩备份及流备份
支持在线迁移表以及快速创建新的从库
运行几乎所有版本的mysql和maridb
1.2、相关词汇
文件扩展名
文件扩展名 文件作用说明
.idb文件 以独立表空间存储的InnoDB引擎类型的数据文件扩展名
.ibdata文件 以共享表空间存储的InnoDB引擎类型的数据文件扩展名
.frm文件 存放于表相关的元数据(meta)信息及表结构的定义信息
.MYD文件 存放MyISAM引擎表的数据文件扩展名
.MYI文件 存放MyISAM引擎表的索引信息文件扩展名
名词
- redo日志
redo日志,也称事务日志,是innodb引擎的重要组成部分,作用是记录innodb引擎中每一个数据发生的变化信息。主要用于保证innodb数据的完整性,以及丢数据后的恢复,同时可以有效提升数据库的io等性能。redo日志对应的配置参数为innodb_log_file_size和innodb_log_files_in_group
- Undo日志
Undo是记录事务的逆向逻辑操作或者向物理操作对应的数据变化的内容,undo日志默认存放在共享表空间里面的ibdata*文件,和redo日志功能不同undo日志主要用于回滚数据库崩溃前未完整提交的事务数据,确保数据恢复前后一致。
- LSN
LSN,全拼log sequence number,中文是日志序列号,是一个64位的整型数字,LSN的作用是记录redo日志时,使用LSN唯一标识一条变化的数据。
- checkpoint
用来标识数据库崩溃后,应恢复的redo log的起始点
1.3、XtraBackup备份原理
- checkpoint,记录LSN号码
- information schema.xxx备份
- 拷贝innoDB文件,过程中发生的新变化redo也会被保存,保存至备份路径
- Binlog只读,FTWRL(global read lock)
- 拷贝Non InnoDB,拷贝完成解锁
- 生成备份相关的信息文件:binlog、LSN
- 刷新Last LSN
- 完成备份

备份时经历的阶段:
- InnoDB表:
- 热备份:业务正常发生的时候,影响较小的备份方式
- checkpoint:将已提交的数据页刷新到磁盘,记录一个LSN号码
- 拷贝InnoDB表相关的文件(ibdata1、frm、ibd…)
- 备份期间产生的新的数据变化redo也会备份走
- 非InnoDB表:
- 温备份:锁表备份
- 触发FTWRL全局锁表
- 拷贝非InnoDB表的数据
- 解锁
再次统计LSN号码,写入到专用文件xtrabackup checkpoint
记录二进制日志位置
所有备份文件统一存放在一个目录下,备份完成
1.4、XtraBackup恢复步骤
- 做恢复前准备
- 做数据合并,增量和全备份的数据合并
- 全备数据,先把全备的redo lo文件内容和全备数据合并,并且read only不进行回滚
- 把第一次增量的redo log变化加载到第一次增量数据再与全量数据做合并
- 把第二次增量的redo log变化加载到第二次增量数据备份,在与全量和第一次增量的合并再进行合并, 最后把脏数据进行提交或回滚
- 恢复binlog的文件内容
2、安装
2.1、安装依赖包
2.2、下载软件并安装
这里使用的是清华源,官方地址下载较慢。
官方最新的是8.0版本,此版本只适用于mysql8.0版本的数据库,所以这里下载支持mysql5.6的版本
3、全量备份和恢复
3.1、前提
数据库处于运行状态
xtrabackup能连接上数据库:在mysql配置文件client下指定socket位置标签或者在使用时指定
读取配置文件mysqld下的datadir参数
开启了binlog
log-bin = /data/mysql/mysql-bin
binlog_format=”ROW”
expire_logs_days=3
xtrabackup是服务器端工具,不能远程备份
3.2全备
在做全备时为了控制生成的目录名称,可以添加参数–no-timestamp并保留日期
3.3、备份结果
在备份目录下查看备份的文件,除了mysql自身的数据文件外,还有这样几个文件
- xtrabackup_binlog_info
备份时刻的binlog位置
记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点
# cat xtrabackup_binlog_info
mysql-bin.000001 192790323
- xtrabackup_checkpoints
备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘CKPT开始备份数据,数据文件的LSN会停留在to_lsn位置
备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了
在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn,从to_lsn——>last_lsn就是,备份过程中产生的数据变化
- xtrabackup_info
备份的全局信息
- xtrabackup_logfile
备份过程中的redo,关联在备份期间对InnoDB表产生的新变化
3.4、全备份的恢复
恢复流程:
xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用
恢复过程是cp备份到原来数据目录下
模拟数据库宕机,删除数据
prepare预处理备份文件,将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
数据恢复并启动数据库
# cp -a /backup/xbk/2020-03-25_10-26-16/* /usr/local/mysql/data/
# chown -R mysql.mysql /usr/local/mysql/data/
# /etc/init.d/mysqld start
4、增量备份和恢复
4.1、前提
增量必须依赖于全备
每次增量都是参照上次备份的LSN号码(xtrabackup checkpoints),在此基础上变化的数据页进行备份
会将备份过程中产生新的变化的redo一并备份走
恢复时增量备份无法单独恢复,必须基于全备进行恢复。必须将所有的增量备份,按顺序全部合并到全备中
4.2、增量备份
全量备份
第一次模拟新数据变化
第一次增量备份
参数:
–incremental 增量备份,后面跟要增量备份的路径
–incremental-basedir=DIRECTORY 基目录,增量备份使用,上一次(全备)增量备份所在目录
第二次模拟新数据变化
第二次增量备份
第三次模拟新数据变化
4.3、备份恢复
恢复流程:
- 挂出维护页,停止当天的自动备份脚本
- 检查备份:full+inc1+inc2+最新的完整二进制日志
- 进行备份整理(细节),截取关键的二进制日志(从备份——误删除之前)
- 测试库进行备份恢复及日志恢复
- 应用进行测试无误,开启业务
模拟数据库宕机,删除数据
确认备份完整性,对比每个备份集中的checkpoints文件
全备份的checkpoints文件内容如下,可以发现to_lsn和last_lsn中间相差9。这个数字差在5.7版本前为0,两者相等,在5.7版本后开启GTID后有了这个差值,作为内部使用。所以如果是满足这个条件,那么可以认为备份期间并没有新的数据修改。同样的,在增量备份的备份集下的文件也是如此,且增量备份from_lsn号与相邻的上一个备份的last_lsn减去9是一致的。
合并整理所有(apply-log)备份(full+inc1+inc2)到全备:
基础全备整理
合并增量到全备中
合并完可以发现每个备份集中的check_points文件的last_lsn相同,说明合并成功
最后一次整理全备
数据恢复并启动数据库
截取删除时刻 到drop之前的 binlog
查看最后一次增量备份中的文件内容
登录mysql,恢复最后的sql
恢复完成。
5、生产案例
5.1、生产场景
现有一个生产数据库,总数据量3TB,共10个业务,10个库500张表。周三上午10点,误DROP了taobao.1业务核心表20GB,导致taobao库业务无法正常运行。
采用的备份策略是:周日full全备,周一到周五inc增量备份,binlog完整
针对此种场景,怎么快速恢复业务,还不影响其他业务?
5.2、实现思路
迁移表空间
1、要想恢复单表,需要表结构和数据
首先合并备份到最新的备份
如何获取表结构?借助工具mysqlfrm
2、获取建表语句
3、进入数据库中创建表
4、丢弃新建的表空间
5、将表中的数据cp回数据库数据目录
6、导入表空间
7、切割二进制日志到删库前生成sql并导入
6、备份脚本
6.1、备份用户创建
创建一个专用于备份的授权用户
create user ‘back’@’localhost’ identified by ‘123456’;
grant reload,lock tables,replication client,create tablespace,process,super on *.* to ‘back’@’localhost’ ;
grant create,insert,select on percona_schema.* to ‘back’@’localhost’;
全量备份
mybak-all.sh
6.3、增量备份
mybak-section.sh
主从,备份relay-bin,要指定备份目录位置和其它变量