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

MySQL执行delete误删除数据恢复

悦专栏 2023-07-06
243
有时候我们可能因为手抖或者粗心,执行了一条delete语句,导致正常的业务数据被删除了。
别慌,也先别跑路。
有很多种方式可以恢复回来,这一篇文章就来聊聊使用my2sql工具解析出delete语句的回滚操作(也就是insert),来恢复delete误删除的数据。
my2sql工具Github地址:https://github.com/liuhr/my2sql
不过要想使用my2sql恢复数据,需要注意这些:
  • binlog格式必须为row,且binlog_row_image=full(表示记录的二进制日志将包含所有列的值,包括旧值和新值)
  • 只能回滚DML, 不能回滚DDL
  • 8.0 用户密码认证必须是mysql_native_password才能解析

我们通过一个实验,来模拟误操作,并进行恢复。
1 新建测试表和测试用户
创建测试表并写入数据
    create database d_recover;
    use d_recover;


    CREATE TABLE del_t1 (
    id int NOT NULL AUTO_INCREMENT,
    a int NOT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB CHARSET=utf8mb4;


    insert into del_t1 values (1,1),(2,2);

    创建恢复用户
      CREATE USER `u_rollback`@`127.0.0.1` IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'IgdI8G_aUU';
      GRANT SELECT, REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO `u_rollback`@`127.0.0.1`;

      2 安装Binlog解析工具my2sql
      下载my2sql
        mkdir data/backup/rollback -p
        cd data/backup/rollback
        wget https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql


        3 模拟误操作

          delete from d_recover.del_t1;

          4 把误操作事务所在的Binlog复制到新目录
            mkdir data/backup/rollback
            cp data/mysql/binlog/mysql-bin.000012 data/backup/rollback

            5 查看误操作事务开始和结束的位点
            解析误操作期间的Binlog,预估误操作大概的起止时间,范围可以稍微大一点。
              cd data/backup/rollback
              mysqlbinlog mysql-bin.000012 --start-datetime='2023-06-21 01:20:00'  --stop-datetime='2023-06-21 01:40:00'  --base64-output=decode-rows -v  > operation.sql

              找到误操作的Binlog,并确定开始和结束的位点

              比如上面解析出的Binlog,误操作开始的位点可以认为是3556,结束的位点是3719

              6 生成回滚SQL
                /data/backup/rollback
                ./my2sql -user u_rollback -password 'IgdI8G_aUU' -host 127.0.0.1 -databases d_recover -tables del_t1 -work-type rollback -start-file mysql-bin.000012 -start-pos 3556 -stop-pos 3719 -output-dir recover_01

                查看并确认回滚SQL
                  cat recover_01/rollback.12.sql


                  7 导入回滚的SQL
                  如果确定回滚的SQL没问题,把回滚SQL导入到误操作的库里
                    mysql -uroot -p <recover_01/rollback.12.sql
                    再进行数据确认
                      select *  from d_recover.del_t1;
                      如果一切顺利,那误删除的数据(1,1),(2,2)就已经恢复回来了。

                      当然,数据恢复还有其他的一些方式,比如:全备+Binlog、延迟从库(主库有误操作,从库同步到误操作前一个事务)、新建从库同步到误操作前一个事务等等,后面会找时间分享这些恢复方式。

                      对AI感兴趣的,可以加入我们的知识星球

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

                      评论