zoukankan      html  css  js  c++  java
  • 三十一、XBK备份

    XBK备份简介

    一款针对MySQL开发的开源免费物理备份工具,全称叫xtrabackup
    适用于备份数据大于30G的情况(不绝对,适用于数据较大的情况)
    原理相当于cp data目录下的数据文件

    备份恢复过程

    1、当执行xbk备份时会触发checkpoint(将内存脏页刷写到磁盘上),并记录当前LSN号。
    2、不锁表copy所有InnoDB数据页及文件到备份路径下。
    3、锁表copy MyISAM等非事务引擎的数据页及文件, 复制完成后解锁。
    4、对比刚备份时记录的LSN跟备份完成后redo记录的LSN,模拟CSR过程使其保持一致完成恢复。
    (假如10点备份,此时会将内存中的脏页刷写到磁盘并记录一个LSN,当10点30分完成备份后,XBK会通过备份过程中这段时间产生的redo日志,对比redo的LSN,模拟CSR过程使其两者的LSN保持一致完成恢复)

    安装XBK

    1、安装依赖包

    $ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    $ yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
    

    2、下载软件并安装

    #这里有两个版本,我安装的是24-2.4.12版本
    $ 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
    
    $ 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
    

    使用XBK全备

    1、使用XBK进行全备

    #授权备份路径
    $ mkdir -p /backup/xbk/full
    $ chown -R mysql.mysql /backup
    
    #这里注意要写--socket路径,innobackupex会默认在/var/lib/mysql/mysql.sock找sock文件
    $ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 
     --no-timestamp --socket=/tmp/mysql.sock /backup/xbk/full
    

    不加--no-timestamp会自动生成年月日时分秒的目录,对以后写备份脚本不是很方便,建议不加。
    可以不加--user=root --password=123防止密码外泄,但是需要在配置文件中写入mysql的账号密码。
    参考资料:mysql账号密码写入配置文件

    2、利用全备进行恢复

    #清空备份路径(谨慎,或者重新选择空的备份目录)
    $ 
    m -rf /backup/full/
    
    #--apply-log参数模拟CSR过程 
    $ innobackupex --apply-log /backup/full/
    
    #将备份的文件复制到/data目录
    $ cp -a /backup/full/* /data/mysql/data/
    $ chown -R mysql.mysql /data/mysql/data/*
    $ /etc/init.d/mysqld start
    

    使用XBK增量备份

    1、模拟数据

    create database full charset utf8mb4;
    use full;
    create table t1 (id int);
    insert into t1 values(1),(2),(3);
    commit;
    

    2、假设周日进行全备

    $ innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 
     --no-timestamp --socket=/tmp/mysql.sock /backup/xbk/full
    

    3、模拟周一的数据变化

    create database inc1 charset utf8mb4;
    use inc1;
    create table t1 (id int); 
    insert into t1 values(1),(2),(3);
    commit;
    

    4、进行周一的增量备份

    $ innobackupex   --user=root --password=123 
    --no-timestamp --incremental 
    --socket=/tmp/mysql.sock  
    --incremental-basedir=/backup/xbk/full /backup/xbk/inc1 
    

    说明
    --incremental:开启增量备份功能
    --incremental-basedir=/backup/xbk/full:基于哪个备份进行增量,这里是基于全备的增量备份
    /backup/xbk/inc1:增量备份的文件路径

    5、检查全备的跟增量的LSN

    #全备的LSN
    $ cat /backup/xbk/full/xtrabackup_checkpoints 
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 217478672
    last_lsn = 217478681
    compact = 0
    recover_binlog_info = 0
    
    #增量的LSN
    $ cat /backup/xbk/inc1/xtrabackup_checkpoints 
    backup_type = incremental
    from_lsn = 217478672 #为全备的last_lsn-9
    to_lsn = 217484653
    last_lsn = 217484662
    compact = 0
    recover_binlog_info = 0
    

    6、模拟周二数据变化

    create database inc2 charset utf8mb4;
    use inc2;
    create table t1 (id int);
    insert into t1 values(1),(2),(3);
    commit;
    

    7、周二的增量

    $ innobackupex   --user=root --password=123 
    --no-timestamp --incremental 
    --socket=/tmp/mysql.sock 
    --incremental-basedir=/backup/xbk/inc1 /backup/xbk/inc2 
    

    8、检查全备、周一、周二的lsn

    #全备的LSN
    $ cat /backup/xbk/full/xtrabackup_checkpoints 
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 217478672
    last_lsn = 217478681
    compact = 0
    recover_binlog_info = 0
    
    #周一增量LSN
    $ cat /backup/xbk/inc1/xtrabackup_checkpoints
    backup_type = incremental
    from_lsn = 217478672 #为全备的last_lsn-9
    to_lsn = 217484653
    last_lsn = 217484662
    compact = 0
    recover_binlog_info = 0
    
    #周二增量LSN
    $ cat /backup/xbk/inc2/xtrabackup_checkpoints
    backup_type = incremental
    from_lsn = 217484653 #是上一次的增备last_lsn-9
    to_lsn = 217491320
    last_lsn = 217491329 #217491329-9=217491320 表示备份过程中没有数据写入
    compact = 0
    recover_binlog_info = 0
    

    9、周三的数据变化

    create database inc3 charset utf8mb4;
    use inc3;
    create table t1 (id int);
    insert into t1 values(1),(2),(3);
    commit;
    

    10、模拟上午10点数据库崩溃

    $ pkill mysqld 
    $ 
    m -rf /data/mysql/data/*
    

    恢复思路

    1. 停业务,挂维护页
    2. 查看计划任务crontab找到备份脚本
    3. 通过备份脚本找到备份路径
    4. 案例恢复为第一次全备加两次增量(full+inc1+inc2)
    5. 通过binlog找到inc2到故障时间点之间日志
    6. 恢复全备+增量+binlog
    7. 验证数据
    8. 起业务,撤维护页

    恢复备份

    1、需要将增量合并到全备,再使用全备进行恢复数据。

    #整理全备
    $ innobackupex --apply-log --redo-only  /backup/xbk/full
    
    #合并inc1到全备
    $ innobackupex --apply-log --redo-only  --incremental-dir=/backup/xbk/inc1 /backup/xbk/full 
    
    #合并inc2到全备,注意这是最后一次增量合并不加--redo-only参数
    $ innobackupex --apply-log  --incremental-dir=/backup/xbk/inc2 /backup/xbk/full 
    
    #最后一次整理全备
    $ innobackupex --apply-log  /backup/xbk/full
    

    说明
    --apply-log
    表示做redo前滚跟undo回滚操作

    --redo-only
    表示只做redo前滚操作跳过回滚操作,整理全备跟增量合并时用,注意最后一次增量合并时不加该参数。

    2、截取binlog恢复周三的数据

    #查看inc2的binlog起点,表示增量备份到1-9
    $ cat /backup/xbk/inc2/xtrabackup_binlog_info 
    mysql-bin.000011	1557	65c12fe4-613e-11eb-9271-000c29a2912e:1-9
    
    #查看binlog日志,这里模拟的是rm删库,所以直接恢复到最后,最后的GTID是12
    $ mysqlbinlog /data/binlog/mysql-bin.000011 | grep 'SET'
    ...
    SET @@SESSION.GTID_NEXT= '65c12fe4-613e-11eb-9271-000c29a2912e:12'/*!*/;
    
    #截取binlog日志
    $ mysqlbinlog --skip-gtids --include-gtids='65c12fe4-613e-11eb-9271-000c29a2912e:10-12' /data/binlog/mysql-bin.000011 >/backup/binlog.sql
    

    3、恢复备份数据

    #复制数据文件到MySQL的data目录
    $  cp -a /backup/xbk/full/* /usr/local/mysql5.7/data/
    $ chown -R mysql.mysql /usr/local/mysql5.7/data/
    
    #登录mysql,恢复binlog周三数据
    mysql> set sql_log_bin=0;
    mysql> source /backup/binlog.sql
    mysql> set sql_log_bin=1;
    

    备份文件介绍

    xtrabackup_binlog_info文件(重要)
    xbk也需要使用binlog进行恢复。
    记录备份时刻的二进制日志信息. 可以作为binlog截取的起点。
    记录的是当时备份时刻的position号,以及GTID号。

    $ cat xtrabackup_binlog_info 
    mysql-bin.000011	356	65c12fe4-613e-11eb-9271-000c29a2912e:1-3
    

    xtrabackup_checkpoints文件(重要)

    $ cat xtrabackup_checkpoints 
    #备份的类型为全备,full-prepared表示做完了redo前滚跟undo回滚,即做完CSR了 
    backup_type = full-backuped 
    
    #备份中包含的LSN号的起点,从0开始表示全备,从上次备份的结束位置开始表示为增备 
    from_lsn = 0 
    
    #checkpoint时的LSN号
    to_lsn = 217470033 
    
    #备份结束时的LSN,last_lsn-9为真实last_lsn位置
    last_lsn = 217470042 
    
    compact = 0
    recover_binlog_info = 0
    

    注意下次增量备份的起始位置为这次备份结束位置减9,相当于xbk会预留9个位置,当last_lsn-9=to_lsn时,表示备份过程中没有新数据录入;
    如上述所示,last_lsn = 217470042,那么下次增量备份起始位置to_lsn = 217470033。

    xtrabackup_info
    所有的备份信息


    xtrabackup_logfile
    备份过程中产生的redo日志

    学习来自:老男孩深标DBA课程 第七章 备份恢复-2,《MySQL入门与提高实践》第九章

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    flask 第三方组件
    Flask基础与进阶
    odoo10 视图
    odoo10 ORM操作
    odoo10基础
    字典的setdefault方法
    redis常用操作
    git常用命令与操作
    vue_axios
    odoo 权限设置
  • 原文地址:https://www.cnblogs.com/tz90/p/14550384.html
Copyright © 2011-2022 走看看