MySQL找回误删的数据,数据恢复

这篇具有很好参考价值的文章主要介绍了MySQL找回误删的数据,数据恢复。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原创作品,未经同意,请勿转载;允许复制链接,对原文直接进行转发。

原创作者玉龙有着十几年大厂软件开发工作经验, 目前自由职业, 欢迎业务洽谈。

误删了几十万条MySQL记录, 要如何找回物理删除的数据呢?  查阅各种资料, 被误导做了些无效尝试, 现把成功经验和失败经验总结如下。

原理是通过mysqlbinlog 命令, 提取对应的删除事件的SQL语句,并重新写入数据库;基本步骤

1、 找到binlog文件; 2、 通过binlog生成,回滚删除的SQL文件;3、 执行SQL文件

  show variables like '%log_bin%';
  show master logs;

如上SQL找到binlog地址。

一、 失败尝试

sudo mysqlbinlog --start-position=123 --stop-position=789 /usr/local/mysql/data/binlog.000064 | mysql -uroot -p -v test1

这个尝试是把mysqlbinlog提取出来的BINLOG base64编码直接写入mysql 数据库;  原理性有错误, 直接写入是再次尝试删除一遍;  就是把binlog中记录的events回放一遍, 而不是逆向回滚一遍。

预计会遇到错误

ERROR 1032 (HY000) at line 8299: Can’t find record in ‘table_name’

意思是要删除的数据不存在, 因为已经早就删除了嘛;再直白的回放一次binlog自然不会起作用;

二、  成功尝试

需要对binlog生成的SQL 进行文本处理, 把DELETE 语句编程INSERT语句; 处理步骤和脚本如下:

1) 生成binlog SQL

sudo mysqlbinlog --start-datetime="2023-10-03 17:59:10" --stop-datetime="2023-10-03 17:59:13" -v --base64-output=decode-rows  /usr/local/mysql/data/binlog.000064>~/eventsb64.sql

通过日志,先缩小时间范围, 明确要挖掘的删除SQL的时间段, 注意边界情况,开始时间减去一秒,结束时间加上一秒;

生成好的binlog SQL有效部分截取如下

### DELETE FROM `autowater`.`capital_flow_min`
### WHERE
###   @1='00511.HK'
###   @2=202303311453
###   @3=-4605382
###   @4=0
###   @5=-1368498
###   @6=-2885925
###   @7=-798230
###   @8=447271
### DELETE FROM `autowater`.`capital_flow_min`
### WHERE
###   @1='00511.HK'
###   @2=202303311454
###   @3=-4605382
###   @4=0
###   @5=-1368498
###   @6=-2885925
###   @7=-798230
###   @8=447271
### DELETE FROM `autowater`.`capital_flow_min`

2) 通过脚本预处理SQL, 使得分段明确, 如下脚本另存为 prepare.awk

BEGIN{
    while(1){
                if(getline<=0){
                  printf "#END\n";
                  break;
                };
                if($0 ~/DELETE FROM/){
                        printf "#END\n";
                };
                if($0 ~/^### Extra row/){
                        printf "#END\n";
                };
                printf $0"\n";
        };
        printf "\n";
};

这样每段DELETE SQL就有了一个统一的终止符#END, 方便后续处理

### Extra row info for partitioning: partition: 135.  

这个分割部分是一些和分区相关的标记, 再他前面也是加上终止符;

执行脚本,对第一步生成的binlog SQL 完成预处理

awk -f prepare.awk eventsb64.sql > events66.sql 

3)  把DELETE SQL转变为INSERT SQL, 经过测试INSERT 语句是不需要填写字段名称的, 直接在VALUE里填写字段值, 这样下面这段脚本还是很通用的, 把如下awk脚本保存为replace.awk

/DELETE FROM/{
  while(1){
    gsub("### DELETE FROM","INSERT INTO",$0);
    gsub("### WHERE"," VALUES (",$0);
    gsub("###   @1="," ",$0);
    gsub("###   \@.*\=",",",$0);
    gsub(" \\(.*\\)","",$0);
    printf $0;
    getline;
    if($0 !~/^###/){
      printf ");\n";
      break;
    };
  }
}

gsub 是正则替换, 需要替换什么,各位客官自己完成; 

 gsub(" \\(.*\\)","",$0);   是我这里特有业务里的情况, 有很多Long类型的数据后面带了个(长串数字),需要删除; 大家视情况, 是否要删除;

执行该脚本, 即可获得INSERT SQL

awk -f replace.awk events66.sql > recovery.sql   

到这里就获得了完整的回滚SQL了, 但是里面可能还有一些杂质;

4) 提纯数据

依据业务关键字, 提取需要回滚的数据

grep "00511.HK" recovery.sql>00511.sql

5) 检查并执行修复SQL

打开SQL文件,人工检查一遍,

先登录进mysql 命令行,然后执行这些SQL

source ~/00511.sql

之后再检查一下修复的数据业务是否正常; 至此大功告成;文章来源地址https://www.toymoban.com/news/detail-728807.html

到了这里,关于MySQL找回误删的数据,数据恢复的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库误删恢复

           经常听说删库跑路这真的不只是一句玩笑话,若不小心删除了数据库,事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境,一般的话都会分配账号权限,生产环境的账号尽量是只读,以防你一个不经意给库或表删除。一定要备份,这很重要,

    2024年02月07日
    浏览(11)
  • MySQL 恢复误删数据

    MySQL 恢复误删数据,针对 window 和 Linux 均适用,只需要找到对应的 binlog 目录文件,默认就是 MySQL 安装目录下的 data 文件夹 一般误删数据,先停止所有操作,备份数据库 1、查看是否启用 binlog 日志 2、查看所有 binlog 日志 3、查看正在使用的日志 4、查找日志所在文件夹 5、

    2024年02月07日
    浏览(15)
  • 【MYSQL】误删数据恢复流程说明

    误删数据恢复流程说明 项目场景:使用navicat时,不小心误删除几条数据,需要对数据进行恢复 第一步:保证mysql已经开启binlog,查看命令 : 如果没有开启binlog,也没有预先生成回滚SQL,那可能真的无法快速回滚了。对存放重要业务数据的MySQL,强烈建议开启binlog。 查看bi

    2024年02月12日
    浏览(15)
  • 面试官:MySQL误删表数据,如何快速恢复丢失的数据?

    相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来。 如果身边有BDA或者有这方面经验的同事那么可以很

    2024年02月09日
    浏览(10)
  • mysql通过binlog日志恢复误删数据

    log_bin为ON说明可以使用binlog恢复,如果为OFF说明没有开启binlog。 删除数据时间是在文件154与153之间,所以删除操作应在154文件中 mysqlbinlog命令解析日志存入新文件 mysqlbinlog 命令的参数说明 sz命令下载文件到本地 在文件中找到了detele语句 5、语句转换 把mysqllog-154.sql中的DELET

    2024年02月11日
    浏览(13)
  • mysql误删数据后,从binlog中进行恢复删除数据(拯救手残,不跑路)

    在一次数据维护过程中,对数据删除时没有提前备份数据,导致数据被删除后无法通过备份文件直接恢复。 数据如果在删除前提前备份好,那么直接从备份文件中恢复。 如果没有备份文件,则需要查看mysql数据库是否打开logbin日志。如果没有打开直接GG。如果恰好打开了的,

    2024年02月16日
    浏览(10)
  • 电脑误删的文件怎么找回

    对于很多人来说,电脑中的文件和数据会是非常重要的,往往有一些数据是非常重要的,如果不经意地被删除了或者丢失了,那么就会对自己造成很大的损失和困扰。也许你曾经因为误操作或者电脑瘫痪等原因,不小心把重要的文件删除了。如果你不想重新花费成本和时间去

    2024年02月06日
    浏览(13)
  • 运维36讲第17课:磁盘数据恢复:rm -rf 误删数据,如何进行数据恢复

    我们继续学习典型故障问题,主要是以“磁盘数据恢复”为主题的学习。 在工作中,我们知道一些操作命令危险性很高,如: rm -rf,它会造成数据的误删除。如果万一出现这样情况导致数据误删除时,我们应该如何对数据进行恢复呢? 删除数据的两种场景 通常有两种数据删

    2024年02月15日
    浏览(13)
  • 如何备份与恢复MySQL数据库数据

    目录 一、MySQL备份 备份方式 完全备份 差异备份 增量备份 二、常见的备份方法 物理冷备 专用备份工具 mysqldump 或 mysqlhotcopy 启用二进制日志进行增量备份 第三方工具备份 三、MySQL完全备份 四、数据库完全备份分类 物理冷备份与恢复 mysqldump备份与恢复 五、物理冷备份与恢复

    2024年02月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包