文章目录
- MySQL备份恢复
- 引:逻辑备份与物理备份的区别
- 1.逻辑备份的优缺点:mysqldump
- 2.物理备份的优缺点:xtrabackup
- 3.差异备份
- 4.温备
- mysqldump
- 一、逻辑备份之mysqldump
- 1.备份的原因
- 2.备份的类型
- 3.备份的方式
- 1)逻辑备份(只要备份的是sql语句或者数据)
- 2)物理备份(直接将底层物理文件备份)
- 4.MySQL的备份策略
- 二、mysqldump参数介绍
- 1.客户端通用参数
- 2.mysqldump参数选项
- 1)特殊参数1使用(必加)
- 2)常用参数
- 3.常用选项以及语句示例
- 4.注意:
- 三、全备、全恢复与切取恢复
- 1.背景
- 2.处理故障思路
- 3.故障模拟
- 1)准备全备的数据
- 2)模拟23:00到10:00的操作
- 3)模拟10:00删库操作
- 4.恢复数据
- 1)先停生产库,避免数据二次伤害
- 2)准备新的数据库,并将文件推送过来
- 3)通过binlog找到23:00到第二天10:00之间新增的数据
- 4)将前一天的全备数据和新增的数据拷贝到新数据库
- 5)将前一天的全备恢复到新库
- 6)将新增的数据恢复到新库
- 7)查看表和数据
- 8)恢复生产环境提供服务
- 物理备份之Xtrabackup
- 介绍:
- 备份流程介绍:
- 一、Xtrabackup全备
- 1.下载或上传Xtrabackup包
- 2.安装Xtrabackup
- 3.Xtrabackup 备份方式(物理备份)
- 4.Xtrabackup全量备份
- 5.Xtrabackup全量恢复数据
- 1)删除数据库、停库
- 2)将redo进行重做
- 4)全备恢复(两种方式)
- 二、xtrbackup增备
- 1.Xtrabackup增量优缺点
- 2.Xtrabackup增量备份实例
- 1)先全备
- 2)模拟新增数据
- 3)开始进行增备
- 4)判断数据备份是否衔接
- 3.再次进行增备
- 1)模拟新增数据
- 2)再次增量备份
- 3)再看一下衔接是否准确
- 4.差异备份(推荐,比增备实用)
- 5.Xtrabackup增量恢复数据
- 6.全备、增备、差异备份总结
- 7.xtrabackup备份、恢复脚本
- 1)备份脚本
- 2)恢复脚本
- 二、作业:
- 差异备份自己做一遍
MySQL备份恢复
binlog恢复数据的时候确实有一些问题,很久之前的数据被删除,如果基于binlog全量恢复,成本很高
binlog只属于增量恢复
我们讲了很多客户端
mysql
MySQLadmin
mysqldump
引:逻辑备份与物理备份的区别
- 针对备份数据大小选择备份工具:
- 30G以下,两种工具都可以
- 30G以上,只能选用xtrbackup或其它
1.逻辑备份的优缺点:mysqldump
- 适用场景
- 备份50G < 的数据
- 优点
- 无需手动安装,mysqldump可以直接使用
- mysqldump备份出来的文件是可读的
- 对于磁盘占用比物理文件占用的空间要小很多
- 缺点
- 需要进行对select表查询再将数据写入sql文件内
- 效率较低且占用磁盘IO与性能、内存
- 备份速度较慢
- 只支持全备,不支持增备,可以完全恢复,或备份某个数据库、表,再进行切取需要恢复的数据开始与结束点恢复
2.物理备份的优缺点:xtrabackup
- 适用场景
- 备份100G < 的数据
- 优点
- 支持全备、增备
- 类似于直接cp数据文件,无需管逻辑结构,相对来说性能较高
- 备份、还原速度快,且支持自动备份校验(物理备份可靠)
- 备份过程不回大段正在进行的事务(无需锁表)
- 能基于压缩等功能节约磁盘空间与流量
- 在不增加负载的情况备份数据
- 缺点
- 可读性差
- 压缩比较低,需要更多磁盘空间
3.差异备份
- 针对于全备之后,一段时间内会有一些增量备份,基于这些增量备份之后,从全备之后到现在做的一次备份,被称为差异备份,相当于打包了这期间的增量备份
4.温备
- 温备针对的是myisam引擎的表,不停服务,需要锁表
mysqldump
一、逻辑备份之mysqldump
1.备份的原因
- 做备份的原因就是为了恢复
- 尽量减少数据的丢失(公司的损失)
2.备份的类型
- 冷备:停库,停服务,备份
- 热备:不停库,不停服务,备份,也不会(锁表)阻止用户的写入
- 温备:不停库,不停服务,备份,会(锁表)阻止用户的写入
3.备份的方式
1)逻辑备份(只要备份的是sql语句或者数据)
1.binlog方式(搭配mysqlbinlog)
2.into outfile
1)配置数据库
vim /etc/my.cnf
secure-file-priv=/tmp
2)数据库使用命令导出(导出的就是数据)
select * from world.city into outfile '/tmp/world_city.data';
3.mysqldump
4.replication(主从属于逻辑备份方式,但并不是真的备份方法)(主从是为了集群减轻数据库压力,但不是单纯的做备份)
2)物理备份(直接将底层物理文件备份)
- 备份data目录:
需备份的数据→导出→打包→推送到备份服务器→解压至数据库→登录查看→通过binlog导出新增数据并导入传过来的数据(导入前,确定备份数据库工作模式与源数据库相同)
- Xtrabackup:
以前很容易,现在很费劲,现在专门为InnoDB存储引擎出了一种方式,需要手动输入命令模拟redo和undo的过程
4.MySQL的备份策略
- 全备:将全部数据备份(采用备份工具来备份)
- 增量备分:基于全备之后,只备份每次备份过后修改后的数据(常采用binlog的方式来备份)
- 恢复数据需要合并多次
- 每个文件都是新数据,不会浪费磁盘空间
- 差异备份:
- 恢复数据只需要合并一次
- 每个文件都包含重复内容,比较占用磁盘
二、mysqldump参数介绍
1.客户端通用参数
- 无需单独安装,安装MySQL数据库可以直接使用
-u -p -S -h -P
本地备份格式:
mysqldump [选项] 数据库名 [表名] > 脚本名
# mysqldump -uroot -p123 mysql db > /tmp/back.sql
远程备份格式:
mysqldump [选项] [地址] > 脚本名
# mysqldump -uroot -p123 -P3306 -A -h10.0.0.51 > /tmp/back.sql
mysql客户端:
mysql
mysqladmin
mysqldump
不加参数用法: # 常用于备份单个表
1)备份指定库
[root@db01 ~]# mysqldump world > /tmp/world.sql
2)备份指定库下的指定表
[root@db01 ~]# mysqldump world city > /tmp/city.sql
3)备份指定库下的指定多个表
[root@db01 ~]# mysqldump world city country > /tmp/country.sql
PS:导出的sql里面是没有use操作的,恢复数据是需要加上库名:mysql world < /tmp/city.sql
2.mysqldump参数选项
1)特殊参数1使用(必加)
-R 备份存储过程及函数
-E 备份事件
--triggers 备份触发器
mysqldump -uroot -p -ARE --triggers >/backup/d.sql
2)常用参数
1. -A # --all-databases 全库备份
2. -Y # --all-tablespaces 导出全部表空间。
3. -B # 指定库备份,只能指定库(会有drop语句,小心)
# mysqldump -uroot -p123 -B zls world db1 > /tmp/full.sql
4. -E # --events,-E在输出中包含转储数据库的事件调度程序事件。该选项需要这些数据库的事件特权
5. --triggers # 备份触发器数据(现在都是开发写触发器)
6. --master-data=2 # 备份时加入change master语句(0没有;1不注释;2注释)
7. --single-transaction # 快照备份 (搭配--master-data可以做到热备)
8. --set-gtid-purged=off # 备份时关闭gtid
========================================================
2:打点备份,注释
1:打点备份,不注释(已有主从,扩展从库的时候使用)
扩展添加从库时不需要再加master_pos了:
change matser to
master_host='10.0.0.111'
master_user='rep'
master_password=123
master_log_pos=120
master_log_file='master-bin.000001'
0:不打点备份...关闭 (不加该参数即可)
========================================================
9. -F:备份的同时刷新binlog
mysqldump -uroot -p123 -A -F > /tmp/full.sql
(一般不使用,刷新的时候会刷出很多binlog,跟备份的库数量有关)
10. -d:仅表结构
11. -t:仅数据
12. -R:== --routines 备份存储过程和函数数据(如果开发写了函数和存储过程,就备,没写就不备)
13.. 文件太大时可以压缩 gzip ,但是gzip不属于mysql独有的命令
# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction | gzip > /tmp/full.sql.gz
# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction | gzip > /tmp/full$(date +%F).sql.gz
14.无需解压直接导入
zcat /backup/full$(date +%F).sql.gz | mysql -uroot -p123
3.常用选项以及语句示例
1.备份全部数据库
mysqldump -u root -p --all-databases > /backup/full.sql
2.备份指定的多个库
mysqldump -u root -p --database mysql world > /backup/a.sql
3.备份指定库内的多个表(world库内city和country表)
mysqldump -u root -p world city country > /backup/b.sql
或
mysqldump -u root -p -B world --tables city country > /backup/c.sql
4.注意:
1.mysql数据导入时,先不记录二进制日志
mysql> set sql_log_bin=0;
2.库内恢复操作
mysql> source /backup/full.sql
3.如果是压缩包呢
mysql> system zcat /backup/full$(date +%F).sql.gz | mysql -uroot -p123
三、全备、全恢复与切取恢复
- 案例
1.背景
1>正在运行的网站系统:MySQL数据库,数据量25G,日业务增量10-15M
2>备份策略:每天23:00,计划任务调用mysqldump执行全备脚本
3>故障时间点:上午10点开发人员误删除一个核心业务表
问题:如何恢复?
2.处理故障思路
1>停业务,避免数据的二次伤害
2>找一个临时的库,恢复前一天的全备
3>截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库
4>测试可用性和完整性
5>开启业务前的两种方式
1)直接使用临时库顶替原生产库,前端应用割接到新
2)将误删除的表单独导出,然后导入到原生产环境
6>对外开放业务
3.故障模拟
1)准备全备的数据
#刷新binlog使内容更清晰
mysql> flush logs;
#查看当前使用的binlog
mysql> show master status; # | mysql-bin.000013 | 3936078 |
#创建backup库
mysql> create database backup;
#进入backup库
mysql> use backup
#创建full表
mysql> create table full select * from world.city;
#创建full_1表
mysql> create table full_1 select * from world.city;
#查看表
mysql> show tables;
#全备
[root@db01 ~] mysqldump -p -A -R --triggers --master-data=2 --single-transaction | gzip > /backup/full_$(date +%F).sql.gz
2)模拟23:00到10:00的操作
#进入backup库
mysql> use backup
#创建new表
mysql> create table new select * from mysql.user;
#创建new_1表
mysql> create table new_1 select * from world.country;
#查看表
mysql> show tables;
#查看full表中所有数据
mysql> select * from full;
#把full表中所有的countrycode里面的值都改成CHN
mysql> update full set countrycode='CHN' where 1=1;
#删除id大于200的数据
mysql> delete from full where id>200;
3)模拟10:00删库操作
#删除new表
mysql> drop table new;
#查看表
mysql> show tables;
4.恢复数据
1)先停生产库,避免数据二次伤害
[root@db01 ~] /etc/init.d/mysqld stop
2)准备新的数据库,并将文件推送过来
[root@db01 ~] scp /backup/full_2018-08-16.sql 10.0.0.52:/root
3)通过binlog找到23:00到第二天10:00之间新增的数据
1.找到起始位置点:去全备的sql里面找到备份时刻位置点
[root@db02 tmp]# head -50 full_2018-08-16.sql |grep -i 'change master to'
2.找到结束位置点:
mysql> show binlog events in 'mysql-bin.000002';
[root@db01 ~]# mysqlbinlog --base64-output=decode-rows -vvv --start-position=120 mysql-bin.000002
3.取出位置点之间新增的数据
[root@db01 ~]# mysqlbinlog --start-position=123 --stop-position=222 mysql-bin.000002 > /backup/xin_$(date +%F).sql
4)将前一天的全备数据和新增的数据拷贝到新数据库
[root@db01 data]# scp /tmp/full.sql 172.16.1.52:/tmp/
[root@db01 data]# scp /tmp/huifu.sql 172.16.1.52:/tmp/
5)将前一天的全备恢复到新库
[root@db01 ~]# zcat /tmp/full_2019-07-20.sql.gz | mysql -uroot -p
6)将新增的数据恢复到新库
[root@db01 tmp]# mysql -uroot -p < xin_2019-07-20.sql
7)查看表和数据
mysql> show tables;
mysql> select * from new;
8)恢复生产环境提供服务
1.将恢复的表导出,导入到生产库(如果核心业务表很小)
- 导出指定表
[root@db02 mysql]# mysqldump backup test2 test4 > /tmp/test.sql
- 将sql传输到生产库
[root@db02 mysql]# scp /tmp/test.sql 172.16.1.51:/tmp/
- 指定库,导入表
[root@db01 data]# mysql backup < /tmp/test.sql
2.应用服务修改数据库配置连接到新库(如果核心业务表很大)
物理备份之Xtrabackup
介绍:
Xtrabackup备份流程图:
- Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁)
- mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。
- Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是:
innobackupex、xtrabackup
- xtrabackup 是专门用来备份InnoDB表的,和mysql server没有交互;
- innobackupex 是一个封装xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。
- xbcrypt 加密解密备份工具
- xbstream 流传打包传输工具,类似tar
备份流程介绍:
(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
(2)xtrabackup在备份innoDB数据时,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)
(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
(5)innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。
一、Xtrabackup全备
1.下载或上传Xtrabackup包
方式一:服务器直接下载:
# Xtrabackup依赖于eple源,先下载epel源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-6.repo
# 安装依赖
yum -y install cmake gcc gcc++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel
# 准备epel源和依赖包和rpm包
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm percona-release enable-only tools release
# 下载Xtrabackup包到本地
yum install -y percona-xtrabackup-24
方式二:本地下载完成后上传至服务器:
# 本地上传Xtrabackup包
[root@db01 ~]# rz percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
PS:percona官网下载地址:
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
2.安装Xtrabackup
[root@db01 ~]# yum localinstall -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
# 安装完后会有命令
[root@db01 ~]# xtrabackup 以前使用该命令
[root@db01 ~]# innobackupex 现在使用该命令
3.Xtrabackup 备份方式(物理备份)
- 对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。
- 对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。
- 备份时读取配置文件/etc/my.cnf
4.Xtrabackup全量备份
1.准备备份目录
[root@db01 ~]# mkdir /backup
2.全备
[root@db01 ~]# innobackupex --user=root --password=123 /backup/full
3.查看文件 # 没去时间戳的备份目录
[root@db01 ~]# ll /backup/
total 0
drwxr-x--- 11 root root 241 Apr 25 23:11 2020-04-25_23-11-27
PS:文件名有时间戳,我们在写备份脚本和恢复脚本,恢复的时候必须指定上一次备份的目录,备份时间我们没办法确定,时分秒太难精确到了(金融公司喜欢每天全备,每小时增备),所以,需要去除时间戳!
4.可以去除时间戳全备 # 去除时间戳后的备份目录
[root@db01 full]# innobackupex --user=root --password=123 --no-timestamp /backup/full
5.再次查看文件
[root@db01 ~]# ll /backup/full/
total 12316
-rw-r----- 1 root root 418 Apr 25 23:15 backup-my.cnf
-rw-r----- 1 root root 12582912 Apr 25 23:15 ibdata1
drwxr-x--- 2 root root 4096 Apr 25 23:15 mysql
drwxr-x--- 2 root root 4096 Apr 25 23:15 performance_schema
drwxr-x--- 2 root root 20 Apr 25 23:15 test
-rw-r----- 1 root root 113 Apr 25 23:15 xtrabackup_checkpoints
-rw-r----- 1 root root 436 Apr 25 23:15 xtrabackup_info
-rw-r----- 1 root root 2560 Apr 25 23:15 xtrabackup_logfile
#多出的文件(可以用cat查看)
xtrabackup_checkpoints #存储系统版本号,增备的时候会用到
xtrabackup_info #存储UUID,数据库是由自己的UUID的,如果相同,做主从会有问题
xtrabackup_logfile #就是redo
5.Xtrabackup全量恢复数据
1)删除数据库、停库
mysql> drop database qiudao;
[root@db01 ~]# systemctl stop mysqld # 恢复数据需要停止数据库,恢复完需要对应授权恢复的目录
2)将redo进行重做
已提交的写到数据文件,未提交的使用undo回滚,模拟CSR的过程:
redo:前滚,没提交的数据提交,例如编辑完的insert等操作
undo:回滚,没提交的数据提交,例如编辑完的insert等操作
归档整理:只做redo,不做undo
- 只需用--read-only
- 不添加此选项的话会,默认redo、undo一起做
redo-only:只在整理全备,或将全备与所有增量合并整理时用
因为是全备,无需整理,所以默认不加直接redo、undo一起做即可,所以无需添加 --redo-only 选项
[root@db01 ~]#innobackupex --user=root --password=123 --apply-log /backup/full
# 可以重复利用,第二次不需要归档整理了,直接copy back就可以了,之前/backup/data下的数据需清空,或拷贝走才可以
PS1:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。innobackupex命令的--apply-log选项可用于实现上述功能
PS2:在实现"准备"的过程中,innobackupex通常还可以使用--user-memory选项来指定其可以使用的内存的大小,默认为100M.如果有足够的内存空间可用,可以多划分一些内存给恢复的过程,以提高其完成备份的速度。
4)全备恢复(两种方式)
方式一:yum安装的mysql需使用此方式恢复
# 重新定义一个data目录,并修改my.cnf配置文件
# 若不修改数据恢复路径,恢复时则会报错!所以必须指定恢复的位置:
[root@localhost ~]# mkdir /backup/data/ # 数据恢复到此,此处必须为空
[root@localhost ~]# vim /etc/my.cnf
datadir=/backup/data
[root@localhost ~]# innobackupex --copy-back /backup/full
#授权
[root@localhost ~]# chown -R mysql.mysql /backup/data
方式二:源码安装的mysql需使用此方式恢复:以下操作在mysql/data目录下执行:
[root@localhost ~]# mv data /tmp/
[root@localhost ~]# cp -r /backup/full ./data
#授权
[root@localhost ~]# chown -R mysql.mysql data
二、xtrbackup增备
1.Xtrabackup增量优缺点
- xtrabackup增量备份的原理:
- 首先完成一个完全备份,并记录下此时检查点LSN;基于上一次全备进行增量,再基于上次增量备份修改后的数据
- 增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是 则备份该页并记录当前检查点的LSN
- 增量备份无法单独恢复,必须基于全备进行恢复
- 所有增量必须要按顺序合并到全备当中
- 增量备份优点:
- 数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;
- 支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;
- 每日备份只产生少量数据,也可采用远程备份,节省本地空间;
- 备份恢复基于文件操作,降低直接对数据库操作风险;
- 备份效率更高,恢复效率更高。
2.Xtrabackup增量备份实例
1)先全备
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full
2)模拟新增数据
create database zb;
use zb;
create table test1(id int);
insert into test1 values(1),(2),(3);
create table test2(id int);
insert into test values(1),(2),(3);
3)开始进行增备
- 基于全备的基础,指定为full全备目录,后面跟上新的增备目录,无需新建目录,备份时会自动创建
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/zengbei1/
参数说明:
--incremental:开启增量备份功能
--incremental-basedir:基于上一次备份的路径
/backup/zengbei1/ 备份的终点目录
4)判断数据备份是否衔接
确认衔接后,继续进行下一次备份,以免数据备份不完整
查看衔接注意:前一次备份的to_lsn(结束值)== 后一次备份次的from_lsn(开始值),以此类推...
[root@db01 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
last_lsn = 1649202
[root@db01 ~]# cat /backup/zengbei1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1649202 # 该值应该与全备的last_lsn一致
last_lsn = 1656173
3.再次进行增备
1)模拟新增数据
mysql> create database zb2;
mysql> use zb2;
mysql> create table test1(id int);
mysql> insert into test1 values(1),(2),(3);
2)再次增量备份
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/zengbei1 /backup/zengbei2
3)再看一下衔接是否准确
[root@db01 backup]# cat xtra1/xtrabackup_checkpoints
[root@db01 ~]# cat /backup/full/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
last_lsn = 1649202
[root@db01 ~]# cat /backup/zengbei1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1649202 # 该值应该与全备的last_lsn一致
last_lsn = 1656173
[root@db01 ~]# cat /backup/zengbei2/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 1656173
last_lsn = 1678732
4.差异备份(推荐,比增备实用)
- 差异备份,相当于一堆打包之后的增备
#第一次增量与差异备份相同,第二次增量如果选择增备目标是全备文件,则这一次是差异备份
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/chayi
#查看衔接
[root@db01 backup]# cat chayi/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1649202 # 该值应该与全备的 last_lsn 一致
last_lsn = 1667836 # 该值应该与增备的 last_lsn 一致
PS:--no-timestamp说明:推荐加此选项
# 若没加 --no-timestamp选项的话,归档整理的时候路径需要指定清楚,如:会放到定义目录名的下一级
/backup/chayi/2021-03-09 07-10-31
# 若加了 --no-timestamp选项的话,归档整理的时候路径如下:可自定义新目录名
/backup/chayi/zengbei
5.Xtrabackup增量恢复数据
1.准备恢复
1)full + zengbei1 + zengbei2 #整合三个文件
2)需要将zengbei和zengbe2按顺序合并到full中,分步骤进行--apply-log(不是每一步都要模拟CSR)
3)删除数据库
mysql> drop database xtra2;
===============================归档整理================================
归档整理:只做redo,不做undo
- 只需用--read-only
- 不添加此选项的话会,默认redo、undo一起做
redo-only:只在整理全备,或将全备与所有增量合并整理时用
2.全备的数据,只做redo,不做undo(因为全备里面还没提交,在增备的时候才提交)
[root@db01 ~]# innobackupex --apply-log --redo-only /backup/full/
记录全备 checkpoints 1649202
3.合并xtra合并到full中,并且apply-log,只应用redo,不应用undo(只有最后一次才做undo)
[root@db01 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/zengbei1 /backup/full
再次查看全备的 checkpoints 1656173
4.将最后一次增量合并到full中,redo undo 都做
[root@db01 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/zengbei2 /backup/full
最后查看全备的 checkpoints 1667836
===============================归档整理================================
5.再把full目录,做一次redo和undo
[root@db01 backup]# innobackupex --apply-log /backup/full/
6.停库
[root@db01 backup]# systemctl stop mysql
7.将data目录移走,以防恢复失败(千万不要删除),里面存的是当前状态的mysql数据
[root@db01 mysql]# mv data/ data_bak
8.恢复数据 # 会重新生成data数据库目录
[root@db01 mysql]# innobackupex --copy-back /backup/full/
[root@db01 mysql]# chown -R mysql.mysql data # 授权恢复的新数据库
9.启动mysql数据库,查看数据是否恢复成功
#建议大家使用差异备份,每小时做一次增量备份,恢复数据时需要合并十次,如果是差异备份,只需要把差异备份的数据合并一次就可以去恢复了!
6.全备、增备、差异备份总结
- 全量备份:
- 需要用 incremental-dir 指定全备目录
- 在恢复前,需要使用–apply-log参数先进行合并数据文件,确保数据的一致性要求;
- 恢复时,直接使用–copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。
- 全量恢复:整理备份包,恢复
- 增量备份:
- 恢复数据需要多次合并
- 每个文件都是新插入的数据节省空间
- 需要使用参数 --incremental 指定需要备份到哪个目录
- 增量恢复:将增量包逐个合并到全备内,再整理一次,恢复
- 差异备份:
- 恢复时只需要合并一次
- 每个文件都有重复的内容,占用磁盘
- 差异恢复:将差异备份合并到全备内,再整理一次,恢复
- 恢复
- 最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复
7.xtrabackup备份、恢复脚本
1)备份脚本
#!/bin/bash
#测试全备命令
#innobackupex --defaults-file=/data2/linksus/apps/linksus_beta/my.cnf --no-timestamp --host=10.10.0.172 --user=backup --password=backup --port=7001 --socket=/data2/linksus/apps/linksus_beta/tmp/mysql.7001.sock /test/data
BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"` #begining time
format_time=`date +"%Y-%m-%d_%H:%M:%S"`
#oldDate=$(date -d "-7 days" "+%Y-%m-%d_%H:%M:%S")
oldDate=$(date -d "-7 days" "+%Y-%m-%d_%H")
week=`date +%w` #week number
backdir=/data/Xtrabackup #backup folder
file_cnf=/data/linksus/mysql_7001/my.cnf
user_name=linksus_dba
password=linksus@123.dba
out_log=$backdir/xtrabackup_log_$format_time
time_cost=$backdir/xtrabackup_time.txt
if [ -d "$backdir/incr6" ];then
rm -rf $backdir-${oldDate}*
mv $backdir $backdir-$format_time
mkdir $backdir
else
mkdir -p $backdir
fi
###### Start backup now, Sunday full backup other days is incremental backup ######
if [ ! -d "$backdir/full" ] && [ $week -eq 0 ];then
echo "#####start sunday full backup at $BEGINTIME to directory full" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock $backdir/full 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr1" ] && [ $week -eq 1 ];then
echo "#####start incremental 1 backup at $BEGINTIME to directory incr1" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/full --incremental $backdir/incr1 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr2" ] && [ $week -eq 2 ];then
echo "#####start incremental 2 backup at $BEGINTIME to directory incr2" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr1 --incremental $backdir/incr2 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr3" ] && [ $week -eq 3 ];then
echo "#####start incremental 3 backup at $BEGINTIME to directory incr3" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr2 --incremental $backdir/incr3 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr4" ] && [ $week -eq 4 ];then
echo "#####start incremental 4 backup at $BEGINTIME to directory incr4" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr3 --incremental $backdir/incr4 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr5" ] && [ $week -eq 5 ];then
echo "#####start incremental 5 backup at $BEGINTIME to directory incr5" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr4 --incremental $backdir/incr5 1> $out_log 2>&1
exit 1
fi
if [ ! -d "$backdir/incr6" ] && [ $week -eq 6 ];then
echo "#####start incremental 6 backup at $BEGINTIME to directory incr6" >>$time_cost
innobackupex --defaults-file=$file_cnf --no-timestamp --host=10.10.3.91 --user=$user_name --password=$password --port=7001 --socket=/data/linksus/mysql_7001/tmp/mysql.7001.sock --incremental-basedir=$backdir/incr5 --incremental $backdir/incr6 1> $out_log 2>&1
exit 1
fi
### END weekly backup ###
2)恢复脚本
#!/bin/bash
#backdir=/databackup/db_backup/Xtrabackup
#backdir=/data/Xtrabackup
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr1/ 1>$backdir/huifu.log1 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr2/ 1>$backdir/huifu.log2 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr3/ 1>$backdir/huifu.log3 2>&1
#innobackupex --apply-log --redo-only --use-memory=12G $backdir/full/ --incremental-dir=$backdir/incr4/ 1>$backdir/huifu.log4 2>&1
#innobackupex --apply-log --redo-only --use-memory=2G $backdir/full/ --incremental-dir=$backdir/incr5/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --redo-only --use-memory=2G $backdir/full/ --incremental-dir=$backdir/incr6/ 1>$backdir/huifu.log 2>&1
#innobackupex --apply-log --use-memory=2G $backdir/full/ 1> $backdir/fuifu.log 2>&1
#innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back $backdir/full/
二、作业:
差异备份自己做一遍