zoukankan      html  css  js  c++  java
  • MySQL 备份恢复 (二)

    模拟故障案例并恢复

    (1)每天全备
    (2)binlog日志是完整
    (3)模拟白天的数据变化
    (4)模拟下午两点误删除数据库

    需求: 利用全备+binlog回复数据库误删除之前。

    模拟全备

    mysqldump -uroot -pKlvchen_123 -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/data/backup/full.sql 
    

    模拟白天的数据变化

    create database day1 charset utf8mb4;
    use day1;
    create table t1(id int);
    insert into t1 values(1),(2),(3);
    use klvchen;
    insert into t1 values (999,'kl');
    

    模拟磁盘损坏

    pkill mysqld
    rm -rf /var/lib/mysql
    

    初始化数据库

    mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql
    systemctl start mysqld
    

    获取备份数据

    grep "-- CHANGE MASTER TO MASTER_LOG_FILE=" /data/backup/full.sql 
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=194;
    
    # sql_log_bin 日志为 mysql-bin.000003 
    mysqlbinlog --skip-gtids --start-position=194 /data/mysql-bin/mysql-bin.000003 >/data/backup/bin.sql
    

    恢复数据

    select @@sql_log_bin;
    set sql_log_bin=0;
    source /data/backup/full.sql;
    source /data/backup/bin.sql;
    set sql_log_bin=1;
    

    模拟误删数据库故障案例并恢复

    思路

    1、停业务,避免数据的二次伤害
    2、找一个临时库,恢复全备
    3、截取误删除之间的binlog,恢复到临时库
    4、测试可用性和完整性
    5、 
        5.1 方法一:直接使用临时库顶替原生产库,前端应用割接到新库
        5.2 方法二:将误删除的表导出,导入到原生产库
    6、开启业务
    

    准备数据

    create database backup;
    use backup
    create table t1 (id int);
    insert into t1 values(1),(2),(3);
    

    进行全备

    mysqldump -uroot -pKlvchen_123 -A  -R  --triggers --set-gtid-purged=OFF --master-data=2  --single-transaction|gzip > /data/backup/full_$(date +%F).sql.gz
    

    模拟全备后的数据变化

    use backup
    insert into t1 values(11),(22),(33);
    create table t2 (id int);
    insert into t2 values(11),(22),(33);
    

    模拟删库故障

    drop database backup;
    

    准备临时数据库进行恢复

    # 把全备的 sql 和 binlog 日志放恢复临时的数据库上
    gunzip full_2020-01-11.sql.gz 
    
    # 截取二进制日志
    grep "-- CHANGE MASTER TO MASTER_LOG_FILE=" /data/backup/full_2020-01-11.sql 
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=753;
    
    # 通过查看二进制文件,发现 GTID 为 f75f8c02-3423-11ea-b5f7-00155d1f4002:7 是 drop database backup;语句应该排除,binlog 起始位置为 753
    mysqlbinlog --start-position=753 --skip-gtids --exclude-gtids='e4b4a809-3445-11ea-abe9-00155d1f4002:7' /data/mysql-bin/mysql-bin.000002 >/data/backup/bin.sql
    

    恢复数据

    set sql_log_bin=0;
    source /data/backup/full_2020-01-11.sql;
    source /data/backup/bin.sql;
    set sql_log_bin=1;
    

    此时临时数据库已恢复,接下来可把数据库 backup 备份出来恢复到生产mysql数据库中。

  • 相关阅读:
    ELK安装(ubuntu)
    Ubuntu18.04上安装java
    .net core跨平台的文件路径
    缺少vim
    docker进入容器
    docker删除名字为none的imgae
    Ubuntu18.04上安装Docker-Compose
    Java类的反射
    Java常用类(二) Scanner类和大数类
    Java常用类(一)Math类和Random类
  • 原文地址:https://www.cnblogs.com/klvchen/p/12178213.html
Copyright © 2011-2022 走看看