暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL基于日志还原数据

安全运维派 2020-10-04
204

简介

Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数据的方法分为传统二进制文件还原数据和基于GTID的二进制文件还原数据

传统二进制日志还原数据

1.修改配置文件

    [root@localhost ~]# vi /etc/my.cnf
    server-id=1
    log-bin=binlog


    #重启数据库服务
    [root@localhost ~]# systemctl restart mysqld

    2.操作数据库

      mysql> create database mydb charset utf8mb4;
      mysql> use mydb;
      mysql> create table test(id int)engine=innodb charset=utf8mb4;
      mysql> insert into test values(1);
      mysql> insert into test values(2);
      mysql> insert into test values(3);
      mysql> insert into test values(4);
      mysql> commit;
      mysql> update test set id=10 where id=4;
      mysql> commit;
      mysql> select * from test;
      +------+
      | id |
      +------+
      | 1 |
      | 2 |
      | 3 |
      | 10 |
      +------+
      4 rows in set (0.00 sec)
      mysql> drop database mydb;

      3.查看二进制日志信息

        mysql> show master status\G;
        *************************** 1. row ***************************
        File: binlog.000001
        Position: 1960
        Binlog_Do_DB:
        Binlog_Ignore_DB:
        Executed_Gtid_Set:
        1 row in set (0.00 sec)


        #查找创库和删库的点,为219和1868
        mysql> show binlog events in 'binlog.000001';
        +---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
        | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
        +---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
        | binlog.000001 | 219 | Query | 1 | 329 | create database mydb charset utf8mb4 |
        | binlog.000001 | 1868 | Query | 1 | 1960 | drop database mydb |
        +---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+

        4.另存为二进制日志信息

          [root@localhost ~]# mysqlbinlog --start-position=219 --stop-position=1868 /var/lib/mysql/binlog.000001 > /tmp/binlog.sql

          5.恢复数据

            #临时关闭二进制日志记录以免重复记录
            mysql> set sql_log_bin=0;
            #恢复数据
            mysql> source /tmp/binlog.sql
            #重启二进制日志记录
            mysql> set sql_log_bin=1;

            6.查看数据恢复情况

              mysql> show databases;
              +--------------------+
              | Database |
              +--------------------+
              | information_schema |
              | mydb |
              | mysql |
              | performance_schema |
              | sys |
              +--------------------+
              5 rows in set (0.00 sec)


              mysql> use mydb;
              Database changed
              mysql> select * from test;
              +------+
              | id |
              +------+
              | 1 |
              | 2 |
              | 3 |
              | 10 |
              +------+
              4 rows in set (0.00 sec)、

              基于GTID二进制日志还原数据

              1.修改配置文件

                [root@localhost ~]# vi /etc/my.cnf
                server-id=1
                log-bin=binlog
                gtid_mode=ON
                enforce_gtid_consistency=true
                log_slave_updates=1


                #重启数据库服务
                [root@localhost ~]# systemctl restart mysqld

                2.操作数据库

                  mysql> create database mydb1;
                  mysql> use mydb1;
                  Database changed
                  mysql> create table t1(id int)engine=innodb charset=utf8mb4;
                  mysql> insert into t1 values(1);
                  mysql> insert into t1 values(2);
                  mysql> insert into t1 values(3);
                  mysql> insert into t1 values(11);
                  mysql> insert into t1 values(12);
                  mysql> commit;
                  mysql> select * from t1;
                  +------+
                  | id |
                  +------+
                  | 1 |
                  | 2 |
                  | 3 |
                  | 11 |
                  | 12 |
                  +------+
                  5 rows in set (0.00 sec)
                  mysql> drop database mydb1;

                  3.查看二进制日志信息

                    mysql> show master status\G;
                    *************************** 1. row ***************************
                    File: binlog.000003
                    Position: 1944
                    Binlog_Do_DB:
                    Binlog_Ignore_DB:
                    Executed_Gtid_Set: 51d3db57-bf69-11ea-976c-000c2911a022:1-8
                    1 row in set (0.00 sec)


                    mysql> show binlog events in 'binlog.000003';
                    +---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
                    | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
                    +---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
                    | binlog.000003 | 154 | Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= '51d3db57-bf69-11ea-976c-000c2911a022:1' |
                    | binlog.000003 | 219 | Query | 1 | 316 | create database mydb1 |
                    | binlog.000003 | 1784 | Gtid | 1 | 1849 | SET @@SESSION.GTID_NEXT= '51d3db57-bf69-11ea-976c-000c2911a022:8' |
                    | binlog.000003 | 1849 | Query | 1 | 1944 | drop database mydb1 |
                    +---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+

                    4.另存为二进制日志信息

                      #8号事务记录为删除数据库,因此只需恢复1-7号事务记录即可
                      [root@localhost ~]# mysqlbinlog --skip-gtids --include-gtids='51d3db57-bf69-11ea-976c-000c2911a022:1-7' /var/lib/mysql/binlog.000003 > /tmp/gtid.sql


                      参数说明:
                      --include-gtids:包含事务
                      --exclude-gtids:排除事务
                      --skip-gtids:跳过事务

                      5.恢复数据

                        mysql> set sql_log_bin=0;
                        mysql> source /tmp/gtid.sql
                        mysql> set sql_log_bin=1;

                        6.查看数据恢复情况

                          mysql> show databases;
                          +--------------------+
                          | Database |
                          +--------------------+
                          | information_schema |
                          | mydb |
                          | mydb1 |
                          | mysql |
                          | performance_schema |
                          | sys |
                          +--------------------+
                          6 rows in set (0.00 sec)


                          mysql> use mydb1;
                          Database changed
                          mysql> select * from t1;
                          +------+
                          | id |
                          +------+
                          | 1 |
                          | 2 |
                          | 3 |
                          | 11 |
                          | 12 |
                          +------+
                          5 rows in set (0.00 sec)

                          原创地址:https://blog.51cto.com/14832653/2509121?source=drh



                          推荐阅读




                          *Apache Struts爆最新漏洞

                          *干货 详解 | 数据中心22年基础架构演进

                          *渗透测试 | 内网Mysql代理浅析

                                                                                                                   

                                                                                                  


                          文章转载自安全运维派,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论