MySQL备份之Xtrabackup

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备份原理

  1. checkpoint,记录LSN号码
  2. information schema.xxx备份
  3. 拷贝innoDB文件,过程中发生的新变化redo也会被保存,保存至备份路径
  4. Binlog只读,FTWRL(global read lock)
  5. 拷贝Non InnoDB,拷贝完成解锁
  6. 生成备份相关的信息文件:binlog、LSN
  7. 刷新Last LSN
  8. 完成备份
MySQL备份之Xtrabackup

备份时经历的阶段:

  • InnoDB表:
  1. 热备份:业务正常发生的时候,影响较小的备份方式
  2. checkpoint:将已提交的数据页刷新到磁盘,记录一个LSN号码
  3. 拷贝InnoDB表相关的文件(ibdata1、frm、ibd…)
  4. 备份期间产生的新的数据变化redo也会备份走
  • 非InnoDB表:
  1. 温备份:锁表备份
  2. 触发FTWRL全局锁表
  3. 拷贝非InnoDB表的数据
  4. 解锁

再次统计LSN号码,写入到专用文件xtrabackup checkpoint
记录二进制日志位置
所有备份文件统一存放在一个目录下,备份完成
 

1.4、XtraBackup恢复步骤

  1. 做恢复前准备
  2. 做数据合并,增量和全备份的数据合并
  3. 全备数据,先把全备的redo lo文件内容和全备数据合并,并且read only不进行回滚
  4. 把第一次增量的redo log变化加载到第一次增量数据再与全量数据做合并
  5. 把第二次增量的redo log变化加载到第二次增量数据备份,在与全量和第一次增量的合并再进行合并, 最后把脏数据进行提交或回滚
  6. 恢复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、备份恢复

恢复流程:

  1. 挂出维护页,停止当天的自动备份脚本
  2. 检查备份:full+inc1+inc2+最新的完整二进制日志
  3. 进行备份整理(细节),截取关键的二进制日志(从备份——误删除之前)
  4. 测试库进行备份恢复及日志恢复
  5. 应用进行测试无误,开启业务

模拟数据库宕机,删除数据
 

确认备份完整性,对比每个备份集中的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,要指定备份目录位置和其它变量

 

正文完
 0