使用source命令进行恢复:

mysql>set sql_log_bin=0;    #关闭二进制日志记录
mysql> source /opt/xxx.sql;

 

下面我们来看一下数据恢复的实例:
背景环境:     
正在运行的网站系统,mysql数据库,数据量25G,日业务增量10-15M。

备份方式:     
每天23:00点,计划任务调用mysqldump执行全备脚本

故障时间点:     上午10点,误删除了一个表

如何恢复?
思路:
    1、断开业务,防止对数据库二次伤害,挂出维护页面
    2、搭建备用库,恢复全备
    3、截取昨天晚上23:00之后到上午10点误删除操作之前的二进制日志
    4、恢复到备用库,验证数据可用性和完整性
    5、两种方案恢复前端应用
        5.1 备用库导出误删除的表,导入到生产库,开启业务
        5.2 直接将应用切割到备用库,替代生产库,开启业务

模拟故障并恢复:

  • 原始数据:
    mysql> create database fxw;
    mysql> use fxw
    mysql> create table t1 (id int,name varchar(20));
    mysql> insert into t1 values (1,'zhang3');
    mysql> insert into t1 values (2,'li4');
    mysql> insert into t1 values (3,'wang5');
    mysql> commit;
  • 模拟前一天晚上23:00全备
    [root@db01 backup]# mysqldump -uroot -p123456 -A  -R --triggers --master-data=2 --single-transaction |gzip >/data/mysql/backup/all_$(date +%F).sql.gz
  • 模拟白天(23:00-10:00)业务对数据的修改
    mysql> insert into t1 values (4,'zhang33');
    mysql> insert into t1 values (5,'li44');
    mysql> insert into t1 values (6,'wang54');
    mysql> commit;
  • 模拟故障
    drop table t1;
  • 恢复
    (1)准备全备,并获取到备份文件中的binlog的截取起点
     gunzip all_2019-08-16.sql.gz
            -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=1904;
    (2)截取二进制日志
    mysql> show binlog events in 'mysql-bin.000004';
    +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+
    | Log_name         | Pos  | Event_type  | Server_id | End_log_pos | Info                                                        |
    +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+
    | mysql-bin.000004 |    4 | Format_desc |        10 |         120 | Server ver: 5.6.36-log, Binlog ver: 4                       |
    `testtab` /* generated by server */ |
    | mysql-bin.000004 |  331 | Query       |        10 |         422 | create database fxw                                         | mysql-bin.000004 | 1411 | Query       |        10 |        1524 | use `fxw`; create table t1 (id int,name varchar(20))        |
    | mysql-bin.000004 | 1524 | Query       |        10 |        1595 | BEGIN                                                       |
    | mysql-bin.000004 | 1595 | Table_map   |        10 |        1642 | table_id: 248 (fxw.t1)                                      |
    | mysql-bin.000004 | 1642 | Write_rows  |        10 |        1689 | table_id: 248 flags: STMT_END_F                             |
    | mysql-bin.000004 | 1689 | Table_map   |        10 |        1736 | table_id: 248 (fxw.t1)                                      |
    | mysql-bin.000004 | 1736 | Write_rows  |        10 |        1780 | table_id: 248 flags: STMT_END_F                             |
    | mysql-bin.000004 | 1780 | Table_map   |        10 |        1827 | table_id: 248 (fxw.t1)                                      |
    | mysql-bin.000004 | 1827 | Write_rows  |        10 |        1873 | table_id: 248 flags: STMT_END_F                             |
    | mysql-bin.000004 | 1873 | Xid         |        10 |        1904 | COMMIT /* xid=4865 */                                       |
    | mysql-bin.000004 | 1904 | Query       |        10 |        1975 | BEGIN                                                       |
    | mysql-bin.000004 | 1975 | Table_map   |        10 |        2022 | table_id: 283 (fxw.t1)                                      |
    | mysql-bin.000004 | 2022 | Write_rows  |        10 |        2070 | table_id: 283 flags: STMT_END_F                             |
    | mysql-bin.000004 | 2070 | Table_map   |        10 |        2117 | table_id: 283 (fxw.t1)                                      |
    | mysql-bin.000004 | 2117 | Write_rows  |        10 |        2162 | table_id: 283 flags: STMT_END_F                             |
    | mysql-bin.000004 | 2162 | Table_map   |        10 |        2209 | table_id: 283 (fxw.t1)                                      |
    | mysql-bin.000004 | 2209 | Write_rows  |        10 |        2256 | table_id: 283 flags: STMT_END_F                             |
    | mysql-bin.000004 | 2256 | Xid         |        10 |        2287 | COMMIT /* xid=5881 */                                       |
    | mysql-bin.000004 | 2287 | Query       |        10 |        2400 | use `fxw`; DROP TABLE `t1` /* generated by server */        |
    +------------------+------+-------------+-----------+-------------+-------------------------------------------------------------+
    22 rows in set (0.01 sec)
    
    mysql> 
    
    最后一样可以看到Drop table ·t1·; 即drop之前的position为2287
    切割日志:
    [root@db01 binlog]# mysqlbinlog --start-position=1904 --stop-position=2287 /application/mysql/data/binlog/mysql-bin.000004 >/data/mysql/backup/binlog.sql
    [root@db01 binlog]# cd /data/mysql/backup/
    [root@db01 backup]# ll
    total 2012
    -rw-r--r-- 1 root root 903215 Aug 15 11:08 all_2019-08-15.sql
    -rw-r--r-- 1 root root   2675 Aug 15 11:14 binlog.sql
    -rw-r--r-- 1 root root 901833 Aug 15 09:50 full.sql
    -rw-r--r-- 1 root root 244008 Aug 15 09:15 world.sql
    [root@db01 backup]# 
  • 恢复全备+binlog
    set sql_log_Bin=0;
    source /data/mysql/backup/all_2019-08-15.sql;
    source /data/mysql/backup/binlog.sql;
  • 查看恢复后的数据。
    mysql> use fxw;
    
    Database changed
    mysql> select * from t1;
    +------+---------+
    | id   | name    |
    +------+---------+
    |    1 | zhang3  |
    |    2 | li4     |
    |    3 | wang5   |
    |    4 | zhang33 |
    |    5 | li44    |
    |    6 | wang54  |
    +------+---------+
    6 rows in set (0.01 sec)

终于恢复了,中间还是需要注意小细节的,千万别用正式数据做操作哦。学到这里算是已经很不错了,普通的程序员是没有关注到这里的,记得几年前的我删除了数据,直接傻眼了,不知道该怎么办,公司同事也没办法,因为很多中小型公司都是没有DBA的,那个时候的我只有一年经验,对数据库完全不了解(其实很多年经验的人未必会,因为程序员更多的专注在程序上,平时只是用用数据库,不会在数据库上做文章或者专门去学习数据库),因此我只能重新弄一批测试数据。现在基本不怕这种误操作。

最后修改于 2019-08-16 10:24:50
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇