介绍
备份策略的设计
备份周期
根据数据量做评估,一般60G数据(三四十分钟),每天全备
备份工具
mysqldump
percona xtrabackup
mysqlbinlog
备份方式
逻辑备份
- 全备: mysqldump
- 增量: binlog
物理备份
- 全备: XBK (percona xtrabackup)
- 增量: XBK (percona xtrabackup)
检查备份的可用性
看备份日志,和备份文件(大小,内容)
刚去公司
crontab -l 查看备份脚本和备份路径
定期恢复演练
数据恢复
只要备份和日志是完整的,恢复到故障之前的时间点(快速)
数据迁移
MySQL -> MySQL
其他数据库 -> MySQL
MySQL -> 其他数据库
备份介绍
备份类型
- 热备: 数据库正在运行时的备份,对业务影响最小(innodb)
- 温备: 锁表备份,长时间锁表(MyISAM)
- 冷备: 业务关闭情况下,进行备份
mysqldump 备份命令介绍
连接数据库的参数
-u
-p
-S
-h
-P
基础备份参数
-A 全备
-B 备份单库或多库(有建库和use 库的语句) 针对库级别
库名 表名 (单张表或多张表备份)针对表级别
特殊的备份参数
-R 备份存储过程和函数 (存储过程和函数,相当于shell中的脚步,集合了多个命令)
-E event 事件 (相当于linux的crontab 计划任务)
--triggers 触发器
--master-data=2
记录了备份时刻的binlog和pos节点号
--master-data=1 使用change 语句的方式记录binlog和pos节点
--master-data=2 使用注释的方式记录 binlog和pos节点
如果不加 --single-transaction ,会进行全局锁表,进行温备
如果加--single-transaction,对与Innodb进行不锁表备份,(快照备份),非Innodb的表进行锁表
--single-transaction 在备份的时候,会创建一个单独的事务。生成一致性快照。备份的时候就备份快照的数据,这个参数是基于MVCC的。快照即undo提供的,因为在事务中进行的。所以用到了undo。需要innodb的支持
扩展参数
--set-gtid-purged=auto(默认)/on 在构建主从时添加
--set-gtid-purged=off 仅仅做普通的本机备份恢复时可以添加,在备份文件里没有gtid信息。如果在主从时,从库恢复文件时,binlog发现没有gtid信息。会重新从主库的binlog获得相同数据的gtid信息。
恢复案例(简历最多写一个)
物理备份XBK
下载安装
# CentOS7
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
# CentOS6
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
# 安装
yum -y install ./percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
innobackupex使用
备份的核心理念
- 针对非innodb表进行锁表备份
- 针对innodb表,立即触发ckpt,copy所有innodb表相关的文件(ibdata1,ibd,.frm)底层是拷贝数据页的。并且将备份过程中产生新的数据变化过程中的部分redo,一起备份
- 在恢复时,XBK会调用Innodb引擎的CSR,将数据文件的LSN和redo文件中的LSN追平
恢复的过程
模拟了CSR的全过程,将数据的LSN号和redo的LSN号追平,恢复的方法直接cp回去即可
XBK的全备和恢复
XBK的全备
innobackupex --user=root --password=123 --no-timestamp /backup/full
XBK的恢复
innobackupex --apply-log /backup/full
--apply-log:
实现了CSR的全过程,即redo的前滚,和undo的回滚
备份产生的文件介绍
xtrabackup_binlog_info
cat xtrabackup_binlog_info
mysql-bin.000001 154
# 存储备份时刻的二进制信息,做为binlog截取的起点
xtrabackup_checkpoints
cat xtrabackup_checkpoints
backup_type = full-backuped 备份的类型,full表全备,prepared表已经做完redo前滚和undo回滚
from_lsn = 0 代表LSN号从哪开始进行备份,0表示LSN从0号开始代表全备
to_lsn = 3528971 表示 ckpt时,的数据部分的LSN号
last_lsn = 3528980 表示,备份完成后,在redo日志中记录的LSN号
compact = 0
recover_binlog_info = 0
# to_lsn 和 last_lsn ,在这相差9个,这是MySQL5.7的新特性,表示无差。因为此为测试环境,在备份过程中,并没有事务产生。所以redo日志的LSN号,并没有增加。
增量备份时,要检查增量备份的from_lsn于上一次备份文件的last_lsn是否相差9,如果是9,表示增量备份没有问题,
-
xtrabackup_logfile
表示增量备份的redo日志
XBK的增量备份和恢复
清空备份路径
rm -rf /backup/*
环境准备
- 模拟周日数据
create database full charset utf8mb4;
use full;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 进行全备
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp /backup/full
- 模拟周一数据
create database inc1 charset utf8mb4;
use inc1;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 进行周一增备
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1
- 模拟周二数据
create database inc2 charset utf8mb4;
use inc2;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 进行周二增备
innobackupex --user=root --password= -S /tmp/mysql.socket --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2
-
检查full,inc1,inc2的lsn号
image.png
由图可以看出,每次增备的from_lsn号,减去9,即是上一个的las_lsn号,即增备成功
- 模拟周三数据变化
create database inc3 charset utf8mb4;
use inc3;
create table t1(id int);
insert into t1 values(1),(2),(3);
- 模拟上午10点的数据库崩溃
\rm -rf /data/mysql/data/*
恢复思路
- 挂维护页
- 查找可用备份
full+inc1+inc2
- 恢复binlog ,inc2到故障时间点
- 恢复全备+增量+binlog
- 验证数据
- 撤维护页
恢复过程
- 备份数据
cp -a /backup /bak
- 整理全备
innobackupex --apply-log --redo-only /backup/full/
- 合并inc1到全备
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
- 合并inc2到全备
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
最后inc2的last_lsn号和to_lsn号和full的last_lsn和to_lsn号一样
- 最后整理full
innobackupex --apply-log /backup/full/
redo-only 说明
增量备份恢复时,在第一次整理全备,在合并增量时,除了最后一次增量合并增量后不加。其余的时候都加。最后一次全备整理,也不用加。只做redo前滚,不做undo回滚
apply-log说明
进行redo前滚和undo回滚
全部恢复
pkill mysqld
cp -a /backup/full /data/mysql/data
chown -R mysql.mysql /data/mysql/data
binlog恢复
应先查看 /backup/inc2/xtrabackup_binlog_info 的二进制起点
# 查看日志的终点
mysqlbinlog --base64-output=decode-rows /data/mysql/data/mysql-bin.000007
# 截取日志
mysqlbinlog --start-position=219 --stop-position=819 /data/mysql/data/mysql-bin.000007 > /tmp/inc3.sql
# 恢复
mysql> set sql_log_bin=0;
mysql> source /tmp/inc3.sql;
mysql> set sql_log_bin=1;
网友评论