zoukankan      html  css  js  c++  java
  • mysql binlog故障演练

    mysql备份恢复

    mysqldump备份

    企业故障恢复案例:
    正在运行的网站系统  mysql数据库 数据量25G,日业务量10-15M
    备份策略:
    每天晚上23点通过计划任务调用mysqldump执行全备脚本
    
    故障时间点:
    周四上午 开发误删除了一个表,如何恢复?
    
    
    思路:
    1. 停业务避免数据二次伤害
    2. 找一个临时库,恢复周三23.00 全备
    3. 截取 周三 23.00 ---> 周四10点 误删除之间的binlog,恢复到临时数据库
    4. 测试可用性和完整性
    5.
     5.1 方法1: 直接用临时卡顶替原有生产库,前端应用割接到新库
     5.2 方法2: 将误删除的表导出,导入到原生产库
    6. 开启业务
    

    故障演练:

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000007 |     2070 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    mysql> flush logs;
    Query OK, 0 rows affected (0.01 sec)
    
    
    #创建一个新库
    mysql> create table backup.full select * from world.city;
    Query OK, 4079 rows affected (0.04 sec)
    Records: 4079  Duplicates: 0  Warnings: 0       #这个直接取了 实验文件 wolrd 的数据到新库。 
    
    现在有数据了。
    
    mysql> create table backup.full_1 select * from mysql.user;
    Query OK, 4 rows affected (0.01 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    验证数据是否有了:
    mysql> use backup
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +------------------+
    | Tables_in_backup |
    +------------------+
    | full             |
    | full_1           |
    +------------------+
    2 rows in set (0.00 sec)   #可以看到有两个数据表了。 现在做一次全备。
    
    
    
    ## 周三全备:
    [root@localhost ~]# mkdir /backup -p
    [root@localhost ~]# cd /backup
    [root@localhost ~]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction|gzip >/backup/full_$(date +%F).sql.gz
    [root@localhost ~]# ll -h /backup/
    total 328K
    -rw-r--r-- 1 root root 328K Oct 12 21:25 full_2020-10-12.sql.gz
    
    
    
    ## 模拟23:00到周四数据丢失的变化【属于正常修改】
    现在在创建一点数据
    mysql> create table backup.thur  select * from world.country;
    Query OK, 239 rows affected (0.01 sec)
    Records: 239  Duplicates: 0  Warnings: 0
    
    通过查询可以看到:
    select * from backup.full;
    4079 rows in set (0.01 sec)  有439行数据。
    
    模拟删除修改数据:
    mysql> use backup;
    mysql> update full set countrycode='CHN';     #模拟不小心把所有地区都改为了CHN
    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)          #并执行了提交
    
    mysql> delete from full where id>200;         #大部分数据都删除了 只保留了200行
    Query OK, 3879 rows affected (0.02 sec)
    
    mysql> commit;                                #并执行了提交
    Query OK, 0 rows affected (0.00 sec)
    
    
    ### 模拟故障,删除了一个表 【属于异常修改】
    mysql> show tables;
    +------------------+
    | Tables_in_backup |
    +------------------+
    | full             |
    | full_1           |
    | thur             |
    +------------------+
    3 rows in set (0.00 sec)
    
    mysql> drop table thur;     #<------------ 删除表
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show tables;         #现有表
    +------------------+
    | Tables_in_backup |
    +------------------+
    | full             |
    | full_1           |
    +------------------+
    2 rows in set (0.00 sec)
    
    -----------------------------------------------
    
    
    -----------------------------------------------
    
    恢复过程:
    1. 关闭原有数据库
    
    2. 启动一个新数据库
    
    3. 解压备份数据
    [root@localhost backup]# gzip -d full_2020-10-12.sql.gz
    [root@localhost backup]# ll
    total 1104
    -rw-r--r-- 1 root root 1126759 Oct 12 21:25 full_2020-10-12.sql
    
    4. 截取二进制日志:
    去备份的sql中找
    [root@localhost backup]# vim full_2020-10-12.sql
    在这里明显可以看到备份的那个binlog日志和起始位置:
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=120;   #备份文件中的起始位置
    
    mysqlbinlog --start-position=120 --stop-position=[待查找]   /data/mysql/mysql-bin.000008
    
    5. 获取binlog日志最后一次正常操作的binlog。
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000008 |   399383 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    找出删除时间点的 position号:
    | mysql-bin.000008 | 399262 | Query  |   1 |     399383 | use `backup`; DROP TABLE ...
    找到开始位置  399262 [这是删除这个表之前的位置。]
    
    将命令的结尾改成下面这样,然后执行:
    [root@localhost backup]#  mysqlbinlog --start-position=120 --stop-position=399262 /data/mysql/mysql-bin.000008 >/backup/inc.sql
    
    
    6. 截取数据完毕后,开始恢复数据:
      先去一台临时mysql服务器恢复数据,检查
      root@localhost backup]# scp -r  /backup/inc.sql root@10.0.0.61:/root
      
      另一台数据库操作如下:
      set sql_log_bin=0;
      source /root/full_2020-10-12.sql
      source /root/inc.sql
    
    
    检查数据:
    MariaDB [world]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | backup             |
    | binlog             |
    | mysql              |
    | performance_schema |
    | test               |
    | world              |
    +--------------------+
    7 rows in set (0.00 sec)
    
    MariaDB [backup]> show tables;    #船舰的表都在
    +------------------+
    | Tables_in_backup |
    +------------------+
    | full             |
    | full_1           |
    | thur             |
    +------------------+
    3 rows in set (0.00 sec)
    
    恢复完毕。
    
  • 相关阅读:
    MySQL第五天
    phprpc
    最近数据库不怎么太平
    dumpfile参数,linux和windows下稍有不同
    impdp 时无反应
    修改IP后,重新config EM
    ORA00054: resource busy and acquire with NOWAIT specified
    测试修改DBID手记
    如何关闭任务计划
    文件夹打开变成寻找框如何解决
  • 原文地址:https://www.cnblogs.com/superlinux/p/13805969.html
Copyright © 2011-2022 走看看