美文网首页运维
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