问题描述:
因为使用模型根据自增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文件进行恢复的步骤:
- 在MySQL命令行中输入命令“SHOW BINARY LOGS;”,可以查看所有可用的Binlog文件。
- 从日志文件中找到删除的数据所在的语句,记录其日志位置信息。
- 打开MySQL命令行并输入命令“STOP SLAVE;”,以停止数据库中的写操作。
- 将备份数据恢复到MySQL中,以确保数据完整性。
- 输入命令“PURGE BINARY LOGS TO 'log_filename';”,其中 log_filename 是要删除的日志文件名。这将保留日志文件记录,直到找到误删除的数据位置。
- 输入命令“CHANGE MASTER TO MASTER_LOG_FILE='log_filename', MASTER_LOG_POS=position;”,其中 log_filename 是误删除数据时使用的Binlog文件名,position 是数据的日志位置记录。
- 输入命令“START SLAVE;”,以继续对数据库进行写操作。
方法二:使用第三方工具
如果您不熟悉MySQL的备份文件和Binlog文件操作,或者您需要找回较旧的数据版本,则可以使用第三方恢复工具。
以下是一些可用于MySQL数据恢复的流行工具:
- MySQL烟雾软件(MyDumper):一种快速备份和恢复MySQL数据库的工具。
- MySQL dump恢复工具:一种可将SQL dump文件转换为MySQL数据库表的工具。
- Oracle VM VirtualBox:一种可恢复MySQL虚拟机中误删除数据的工具。
- EaseUS Data Recovery Wizard:一种能够从已删除的分区或驱动器中恢复数据的工具。