美文网首页运维
MySQL的备份恢复

MySQL的备份恢复

作者: 麟之趾a | 来源:发表于2020-03-19 21:07 被阅读0次

介绍

备份策略的设计

备份周期

根据数据量做评估,一般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;

相关文章

网友评论

    本文标题:MySQL的备份恢复

    本文链接:https://www.haomeiwen.com/subject/pflryhtx.html