mysql误删数据后,从binlog中进行恢复删除数据(拯救手残,不跑路)

这篇具有很好参考价值的文章主要介绍了mysql误删数据后,从binlog中进行恢复删除数据(拯救手残,不跑路)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从mysql的logbin中恢复误删数据

在一次数据维护过程中,对数据删除时没有提前备份数据,导致数据被删除后无法通过备份文件直接恢复。

数据恢复思路



  1. 数据如果在删除前提前备份好,那么直接从备份文件中恢复。
  2. 如果没有备份文件,则需要查看mysql数据库是否打开logbin日志。如果没有打开直接GG。如果恰好打开了的,则需要如下几步进行:
1. 查看binlog状态,确认binlog文件
2. 刷新binlog状态,重新生成新binlog文件,确保原文件不被修改
3. 查找删除语句,确定好起始位置、删除时间等信息
4. 通过mysqllogbin恢复数据

操作明细

本文以下内容为mysql开启binlog的前提下进行数据恢复的步骤。希望以后都不用到!!!

1.查找当前操作的binlog状态

在myql命令行或者链接工具中,命令查看binlog当前的位置状态和文件信息。

show master status;

2. flush logs刷新状态

在myql命令行或者链接工具中,使用flush logs命令重新生成新的binlog命令。

flush logs;

3.备份第一步中查出来的binlog文件

在Linux下,使用cp命令将文件复制一份到/home/recover/下,后续操作都是在这个备份文件基础上进行操作的。
cp -a /var/lib/mysql/mysql-bin.000002 /home/recover/

4.查找删除数据的起始位置、时间等关键信息

这一步如果binlog文件比较大的话,建议在Navicat等连接工具中进行查询,使用命令查询后,找到删除命令的起始位置

show binlog events in 'mysql-bin.000002';

binlog恢复删除的数据,mysql,数据库,linux
binlog恢复删除的数据,mysql,数据库,linux

如图所示,找到起始位置

5.恢复数据

根据第四步找到的起始位置,使用mysqlbinlog命令,在系统中恢复数据库数据。

/usr/bin/mysqlbinlog --start-position=245 --stop-position=2997666 --database=test1 /var/lib/mysql/mysql-bin.000002 | /usr/bin/mysql -uroot -p123456 -v test1

/usr/bin/mysqlbinlog --start-position=245 --stop-position=2997666 --database=test1 /home/recover/mysql-bin.000002 | /usr/bin/mysql -uroot -p123456 -v test1

在实际执行上面命令的时候,一直提示出错

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

暂时不知道什么原因,可能和数据库版本有关?

因为这一步直接使用mysqlbinlog没有恢复成功,所以就只想到用到下面这一种方法:使用sed将binlog文件中的删除sql命令清洗成insert语句,通过拼接出来的sql去恢复数据

6.使用sed清洗数据

6.1 从binlog文件中提取删除信息

根据第四步中找到的起始位置,使用mysqllogbin命令提取对应的删除信息

mysqlbinlog --base64-output=decode-rows -vv \ --start-position=245 --stop-position=2997666 /home/recover/mysql-bin.000002 >a.txt

6.2 提取对应的删除sql

sed -n '/^###/'p a.txt >b.txt

这个命令的作用是将文件a.txt中以###开头的行复制到文件b.txt中。

sed是一个流编辑器,-n选项表示关闭默认的输出,只输出经过处理的行。

  • '/^###/'是一个正则表达式,表示匹配以###开头的行。
  • p命令表示输出匹配的行。

a.txt是要处理的文件。
>b.txt表示将输出结果重定向到文件b.txt中。

6.3 替换“### ”

sed 's/### //g' b.txt >c.txt

s/### //g是一个替换命令,表示将所有的### (三个井号后跟一个空格)替换为空。

  • s表示执行替换操作。
  • /### /是一个正则表达式,表示匹配所有的### 。
  • /g表示全局替换,即将所有匹配的字符串都进行替换。

b.txt是要处理的文件。
>c.txt表示将替换后的内容输出到文件c.txt中。

6.4 删除每行后面的注释

sed 's#/.*#,#g' c.txt >d.txt

这个命令的作用是将文件c.txt中每一行第一个/及其后面的内容替换为一个逗号,并将替换后的内容输出到文件d.txt中。

s#/.*#,#g是一个替换命令,表示将每一行第一个/及其后面的内容替换为一个逗号。

  • s表示执行替换操作。
  • /#/是一个正则表达式,表示匹配每一行中第一个/。
  • .*表示匹配/后面的任意字符串。
  • /#/,表示替换为一个逗号。
  • /g表示全局替换,即将每一行中第一个匹配的字符串都进行替换。

c.txt是要处理的文件。
>d.txt表示将替换后的内容输出到文件d.txt中。

6.5 DELETE FROM替换为INSERT INTO

sed 's#DELETE FROM#INSERT INTO#g' d.txt >e.txt

这个命令的作用是将文件d.txt中所有的DELETE FROM替换为INSERT INTO,然后将替换后的内容输出到文件e.txt中。

s#DELETE FROM#INSERT INTO#g是一个替换命令,表示将所有的DELETE FROM替换为INSERT INTO。

  • s表示执行替换操作。
  • #DELETE FROM#是一个正则表达式,表示匹配所有的DELETE FROM。
  • #INSERT INTO#表示替换为INSERT INTO。
  • /g表示全局替换,即将所有匹配的字符串都进行替换。

d.txt是要处理的文件。
>e.txt表示将替换后的内容输出到文件e.txt中。

6.5 WHERE替换为SELECT

sed 's#WHERE#SELECT#g' e.txt >f.txt

这个命令的作用是将文件e.txt中所有的WHERE替换为SELECT,然后将替换后的内容输出到文件f.txt中。

s#WHERE#SELECT#g是一个替换命令,表示将所有的WHERE替换为SELECT。

  • s表示执行替换操作。
  • #WHERE#是一个正则表达式,表示匹配所有的WHERE。
  • #SELECT#表示替换为SELECT。
  • /g表示全局替换,即将所有匹配的字符串都进行替换。

e.txt是要处理的文件。
>f.txt表示将替换后的内容输出到文件f.txt中。

6.5 @53= 替换成’,‘ 语句结尾添加’;‘号

sed -r 's#(@53=.*)(,)#\1;#g' f.txt >h.txt

这个命令的作用是将文件f.txt中所有的以@11=开头、以,结尾的字符串替换为这个字符串加上;,然后将替换后的内容输出到文件h.txt中。

-r选项表示使用扩展正则表达式。
s#(@53=.*)(,)#\1;#g是一个替换命令,表示将所有的以@11=开头、以,结尾的字符串替换为这个字符串加上;。

  • s表示执行替换操作。
  • #(@11=.*)(,)#是一个正则表达式,匹配所有以@11=开头、以,结尾的字符串。
  • \1;表示将匹配到的字符串替换为匹配到的内容加上;。
  • /g表示全局替换,即将所有匹配的字符串都进行替换。

f.txt是要处理的文件。
>h.txt表示将替换后的内容输出到文件h.txt中。

6.5 生成可执行的sql

sed -r 's#(@.*=)(.*)#\2#g' h.txt >aa.sql

6.6 添加commit

sed -i '$a commit;' aa.sql

至此,已经从导出binlog文件中清洗除了需要恢复的sql语句(insert语句),可以通过命令或者桌面工具执行sql,恢复删除的数据了。

6.7 执行sql

mysql -uroot -p123456 test < aa.sql

7. 问题总结

7.1 日期格式问题

在实际操作过程中,发现因为从binlog中导出的数据包含日期格式有问题,没有带单引号,所以造成sed清洗出来的sql执行不成功。问题解决方法有两个:

使用sed 直接匹配时间格式后对时间格式直接进行添加单引号,如下命令:

sed -E "s/[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/'&'/g" filename

优化:对时间格式进行判断其前后是否有单引号,没有则进行添加
sed -E "s/'?[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'?/'&'/g" filename

7.2 sed中> 和>> 的区别

在使用过程中,有一步使用了>>且重复执行后,导致最后生成的sql数据重复

  • 在sed命令中,>和>>都是用来将输出写入文件的符号。
  • >符号表示覆盖输出。它会将命令的输出写入目标文件,如果目标文件已经存在,则会覆盖文件原有的内容。
  • >>符号表示追加输出。它会将命令的输出追加到目标文件末尾,而不会覆盖原有内容。
7.3 在删除数据一定要谨慎

对大量数据进行删除过程中,一定要谨慎。

  • 尽量不要在数据库中对大量数据进行操作
  • 操作数据前需要对数据进行备份
  • 使用mysql时,尽量把logbin日志打开(可能会有牺牲一定的性能和存储空间,但是比起数据安全来说,是值得的),在数据被误删的情况下,也是一个补充。

8 参考文章

通过binlog恢复误delete的数据(一)
使用binlog日志恢复MySQL数据库删除数据的方法文章来源地址https://www.toymoban.com/news/detail-597214.html

到了这里,关于mysql误删数据后,从binlog中进行恢复删除数据(拯救手残,不跑路)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • MySQL 恢复误删数据

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

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

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

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

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

    2024年02月12日
    浏览(15)
  • MySQL数据库误删恢复

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

    2024年02月08日
    浏览(16)
  • MySQL找回误删的数据,数据恢复

    原创作品,未经同意,请勿转载;允许复制链接,对原文直接进行转发。 原创作者玉龙有着十几年大厂软件开发工作经验, 目前自由职业, 欢迎业务洽谈。 误删了几十万条MySQL记录, 要如何找回物理删除的数据呢?  查阅各种资料, 被误导做了些无效尝试, 现把成功经验

    2024年02月07日
    浏览(9)
  • MySQL 开启配置binlog以及通过binlog恢复数据

       binlog是MySQL sever层维护的一种二进制日志,binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE、DROP等)以及表数据修改(INSERT、UPDATE、DELETE、TRUNCATE等)的二进制日志。不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。 作用主要有: 主从复制:在

    2024年02月03日
    浏览(9)
  • MySQL——通过binlog恢复数据

    目录 1.binlog基本概念 2.MySQL开启binlog 3.使用binlog日志恢复数据 3.1.恢复前准备工作 3.2.数据恢复 3.2.1.通过mysqlbinlog将binlog转为sql,以方便查询具体位置 3.2.2.查看生成的backuptmp.sql,最终确定需要恢复的起始位置为219,结束位置为982 3.2.3.通过mysqlbinlog执行恢复操作 前言 : mysqldu

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

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

    2024年02月09日
    浏览(11)
  • windows下mysql中binlog日志分析和数据恢复

    看到了是没有开启的。 不能通过命令的方式去打开,因为会提示说这个参数是 只读 的。如下图: 所以,打开mysql的配置文件,找到mysql的配置文件(和Linux下的文件名是不一样的,Linux是my.cnf),windows默认的在 C:ProgramDataMySQLMySQL Server 5.7my.ini 配置好之后,要 进行重启mysql服务

    2024年02月15日
    浏览(8)
  • mysql关闭binlog日志,删除binlog数据(win和linux通用)

    打开 mysql 命令窗口,查询 binlog 是否开启   (ON)为开启状态 (OFF)为关闭状态 若开启状态则需要修改配置文件,反之不需要任何操作 在 C:ProgramDataMySQLMySQL Server 8.0 路径下打开 my.ini 并注释掉 bin-log 配置项然后在其后面加入skip-log-bin   重启mysql服务   打开 mysql 命令窗口,

    2024年02月07日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包