mysql数据库恢复,binlog日志回滚

问题描述:

因为使用模型根据自增id去修改数据库的name和手机号 然后不知道哪里出现了问题造成了数据库中全部的数据都被修改了

紧急处理方案:

1. 下载binlog日志,通过mysqlbinlog转成可读的SQL文件

      

  mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql-bin.merged.1 > log.sql

    2. 找到可读的binlog相关操作语句的BEGIN和COMMIT的范围节点,找到BEGIN后面的at的数字,如下面的:6893399          

 BEGIN
            /*!*/;
            # at 6893399
            #230829 13:55:59 server id 1453665369  end_log_pos 6893500 CRC32 0xf9e463d1Rows_query

            #230829 13:55:59 server id 1453665369  end_log_pos 53123487 CRC32 0x86a4530fXid = 2218760870
            COMMIT/*!*/;

    3. 通过serer节点6893399,重写对binlog日志抽取对应范围的可读的SQL文件

       

mysqlbinlog  --no-defaults  --base64-output=decode-rows  -v -v  /tmp/mysql-bin.merged.0|sed -n '/# at 6893399/,/COMMIT/p'  >/tmp/update.sql


    4. 对生成的可读的SQL进行sed命令替换,通过管道符连接,一共执行七个sed命令,前五个可以批量连接执行,主要是对SQL进行提取,替换,将set条件和where更新条件互换

        

sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' /tmp/update.sql | sed 's/### //g;s/\/\*.*/,/g' | sed  /@7/s/,//g | sed '/WHERE/{:a;N;/@7/!ba;s/,/AND/g};s/#.*//g;s/COMMIT,//g' | sed '/^$/d'  >  /tmp/rollback.sql


    5. 对前面5个sed命令处理的SQL文件执行第六个sed命令,这句是在where语句后@16最后一个字段加(;),如果后执行这句请将@16换成对应的列名即可。

      

 sed  -i -r  '/WHERE/{:a;N;/@16/!ba;s/(@16=.*)/\1\;/g}' sed6-update.sql


    6. 第七个sed命令是把@1,@2…@6,@7替换为对应的member_detail表的列名。

         

  sed -i 's/@1=/id=/g;s/@2=/member_id=/g;s/@3=/img_front=/g;s/@4=/img_back=/g;s/@5=/urgent_relation=/g;s/@6=/urgent_name=/g;s/@7=/urgent_contact=/g;s/@8=/id_name=/g;s/@9=/id_num=/g;s/@10=/id_sign=/g;s/@11=/id_address=/g;s/@12=/id_start=/g;s/@13=/id_end=/g;s/@14=/tel_num=/g;s/@15=/lw_account_id=/g;s/@16=/role_id=/g' sed6-update.sql

   7. 复制一个新的SQL文件,然后将所有的换行替换成空格           

cp  sed6-update.sql   sed7-update.sql

           sed -i 's/\;/ LIMIT 1\;\n/g'   sed7-update.sql


   8. 对最后生成的SQL用notepad++批量处理一下空行数据,就是完整的update更新之前的回滚SQL了,如果不需要全量的更新SQL,请自行通过脚本正则匹配对应的查询条件和更新字段,组装回滚的SQL语句即可


到现在也不清楚为什么使用模型加了id会更新全部数据,如果有知道的大佬 还望解析一二.


下面二种是从网上找到的未实验:

方法一:使用MySQL Binlog文件

MySQL 的Binlog是用于记录数据库中所有操作的日志文件。通过检查日志文件,可以找到误删除的数据,并进行恢复。

以下是使用Binlog文件进行恢复的步骤:

  1. 在MySQL命令行中输入命令“SHOW BINARY LOGS;”,可以查看所有可用的Binlog文件。
  2. 从日志文件中找到删除的数据所在的语句,记录其日志位置信息。
  3. 打开MySQL命令行并输入命令“STOP SLAVE;”,以停止数据库中的写操作。
  4. 将备份数据恢复到MySQL中,以确保数据完整性。
  5. 输入命令“PURGE BINARY LOGS TO 'log_filename';”,其中 log_filename 是要删除的日志文件名。这将保留日志文件记录,直到找到误删除的数据位置。
  6. 输入命令“CHANGE MASTER TO MASTER_LOG_FILE='log_filename', MASTER_LOG_POS=position;”,其中 log_filename 是误删除数据时使用的Binlog文件名,position 是数据的日志位置记录。
  7. 输入命令“START SLAVE;”,以继续对数据库进行写操作。

方法二:使用第三方工具

如果您不熟悉MySQL的备份文件和Binlog文件操作,或者您需要找回较旧的数据版本,则可以使用第三方恢复工具。

以下是一些可用于MySQL数据恢复的流行工具:

  1. MySQL烟雾软件(MyDumper):一种快速备份和恢复MySQL数据库的工具。
  2. MySQL dump恢复工具:一种可将SQL dump文件转换为MySQL数据库表的工具。
  3. Oracle VM VirtualBox:一种可恢复MySQL虚拟机中误删除数据的工具。
  4. EaseUS Data Recovery Wizard:一种能够从已删除的分区或驱动器中恢复数据的工具。

原链接:MySQL 误删数据后如何有效恢复-mysql教程-PHP中文网

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 答1: 如果MySQL没有开启binlog,一般情况下是无法恢复已经执行的删除操作的。binlogMySQL的二进制日志,记录了MySQL服务器上的所有修改操作,包括删除、修改和插入等。它可以用于恢复数据库的某个特定时间点的状态或某些错误操作。 如果MySQL没有开启binlog,即使进行了删除操作,也无法通过binlog来还原数据。在没有备份的情况下,这些被删除的数据将无法恢复。因此,在没有binlog的情况下,建议在进行任何重要的数据库操作之前,先进行数据备份,以避免数据丢失的情况发生。 然而,如果有其他方式可用于恢复数据,例如通过时间点恢复到某个特定的数据库备份,或者通过物理备份恢复数据库的数据文件,那么可能有机会恢复删除操作。但这通常需要特定的技术和工具,并且对数据库的操作要求非常谨慎。 总的来说,没有开启binlog时,恢复删除操作的难度较大,因此强烈建议在数据库中开启binlog并定期进行数据备份,以确保数据的安全和可恢复性。 ### 答2: MySQL是一种开源的关系型数据库管理系统,Binlog(二进制日志)是MySQL的一个重要特性,用于记录数据库的所有写操作,包括删除操作。如果MySQL没有开启Binlog,即没有记录删除操作,恢复删除操作可能会变得非常困难。 通常情况下,如果没有启用BinlogMySQL不会记录删除操作的详细信息,包括删除的具体数据和时间戳等。在没有备份的情况下,如果发生了误删除操作,很难恢复被删除的数据。 不过,即使没有Binlog,仍然有一些方法来恢复删除操作。以下是一些常见的方法: 1. 使用Undo日志MySQL中的InnoDB存储引擎支持事务的操作,可以使用Undo日志数据库恢复到删除操作之前的状态。这是在数据仍然在磁盘上存在的情况下才能使用的方法。 2. 使用文件恢复工具:在磁盘上删除的数据仍然可以通过文件恢复工具来恢复。这类工具可以扫描硬盘上的被删除文件,并尝试将其恢复到原始状态。但这种方法并不保证恢复的成功,并且可能会损坏其他数据。 总的来说,如果MySQL没有开启Binlog恢复删除操作是一项非常困难的任务。为了更好地保护数据的安全性和可恢复性,建议及时开启并定期备份Binlog,并且定期备份数据库,以便在发生误操作时能够快速恢复数据。 ### 答3: 在MySQL中,如果没有开启二进制日志binlog),是很难恢复已删除操作的。 二进制日志MySQL的一种日志文件,它记录了数据库中所有的数据操作,包括插入(INSERT)、更新(UPDATE)和删除(DELETE)等操作。通过分析binlog,可以对数据库进行恢复操作。 如果没有开启binlog,那么就无法通过binlog进行恢复操作了。因此,对于没有开启binlogMySQL数据库,一旦数据被删除,是无法直接通过日志进行恢复的。 但是,即使没有开启binlog,有时仍然有一些方法可以尝试恢复已删除的数据。比如,可以通过备份文件进行恢复,如果数据库在删除操作之前进行过备份,那么可以使用备份文件将数据还原到删除操作之前的状态。 另外,如果数据库使用了事务,可以尝试使用""操作来恢复已删除的数据。事务能够将一系列相关的数据库操作组合起来,如果删除操作发生在一个事务中,那么可以使用操作将事务撤销,从而恢复已删除的数据。 总而言之,如果没有开启binlog恢复已删除操作会变得非常困难,无法直接通过日志进行恢复。但是,根据具体情况,可以尝试使用备份文件或事务等方法,来尽可能地恢复已删除的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值