• MySQL恢复不小心误删的数据记录(binlog)-生产实操


    同事操作删除生产数据时,未及时备份导致误删除部份数据。现通过mysql的binlog日志回滚数据。

    1.由于我们第一时间找到相应的操作时间的大概在12点~13点之间操作删除了product和product_item表的部份数据。因此我们只要找到这期间的binlog文件就行了,

    脚本为:delete from product_item  where shop_id = '1630131736490098689';

                 delete from product  where shop_id = '1630131736490098689';

    1. cd /var/lib/mysql
    2. ll

    (该图为后面载图的)

    2.先cp到其它目录去操作。千万不要在原目录操作!!!!
    1. cd /mnt
    2. mkdir mysqlbak003217
    3. cp /var/lib/mysql/binlog.* /mnt/mysqlbak003217/

    3.通过分析找到对应的binlog文件(通过时间缩小范围)并通过mysqlbinlog 命令转为sql文件

    binlog.003216,binlog.003217,binlog.003218三个文件中找

    1. mysqlbinlog --base64-output=decode-rows -v binlog.003216 --result-file=mysql-bin-sql-003216.sql  
    2. mysqlbinlog --base64-output=decode-rows -v binlog.003218 --result-file=mysql-bin-sql-003218.sql
    3. mysqlbinlog --base64-output=decode-rows -v binlog.003217 --result-file=mysql-bin-sql-003217.sql

    4找到你误删的数据

    一般来说你误删的数据会大致记下来一个标识。我这里是shop_id。记得被删除的数据的是多少,那么我们就可以模糊搜索该条件:

    grep '1630131736490098689' mysql-bin-sql-003217.sql  -C 200或

    grep '1630131736490098689' mysql-bin-sql-003217.sql  -C 200 --> 1630131736490098689.sql 输出文件查看下delete from 的脚本。

     

    确认是 mysql-bin-sql-003217.sql文件

    5.通过linux命令,查找需的数据,成为需要的数据(#每完成一份正确的数据,都及时备份下文件。以免操作错误重头开始

    1. grep 'DELETE FROM' mysql-bin-sql-003217.sql -C 200 --> delete20231021.sql
    2. #每完成一份正确的数据,都及时备份下。以免操作错误重头开始
    3. cp delete20231021.sql delete20231021.sql.bak
    4. #拆分两个表的操作数据SQL(过程是通过反复操作及分析的结果)
    5. grep 'DELETE FROM `lirimall_server`.`product_item`' mysql-bin-sql-003217.sql -C 200 --> deleteproduct_item20231021.sql
    6. grep 'DELETE FROM `lirimall_server`.`product`' mysql-bin-sql-003217.sql -C 200 --> deleteproduct20231021.sql
    6。分别处理两个操作数据的文件

    删除无效数据,

    #包括特殊字符"",#,|"这些的处理,这个只能通过SQL工具测试后有异常再更新文件

    1. mkdir product_itme
    2. mkdir product
    3. cp deleteproduct20231021.sql ./product
    4. cp deleteproduct_item20231021.sql ./product_item/
    5. cd product
    6. #备份数据
    7. cp deleteproduct20231021.sql deleteproduct20231021.sql.bak
    8. #删除无用的数据,特殊字符的数据
    9. vi deleteproduct20231021.sql
    10. #文件命令:
    11. #显示行数
    12. :set nu
    13. #删除1-200行的数据
    14. :1,200d
    15. #删除336581~336938d行的数据
    16. :336581,336938d
    17. #搜索“# at”的数据
    18. /# at
    19. #到文件的结尾处查看下
    20. :$
    21. #包括特殊字符"",#,|"这些的处理,这个只能通过SQL工具测试后有异常再更新

    7.通过linux的sed 命令把delete删除语句替换为insert into语句(有问题可反复执行-一定要备份文件)-
    1. sed -i 's/^### //g' deleteproduct20231021.sql
    2. sed -i "s/^DELETE FROM/INSERT INTO/g" deleteproduct20231021.sql
    3. sed -i "s/^WHERE/VALUES(/g" deleteproduct20231021.sql
    4. sed -i '/INSERT INTO/i );' deleteproduct20231021.sql
    5. cat deleteproduct20231021.sql | awk -F"=|" '{
    6. if($0 ~ /^INSERT|^VALUES|^);/){
    7. print $0;
    8. }else{
    9. printf $2",";
    10. };
    11. }' > delete2insertproduct20231021.sql
    12. sed -i "s/,);$/);/g" delete2insertproduct20231021.sql
    13. vi delete2insertproduct20231021.sql
    14. #删除开头和补齐结束的SQL
    8.通过处理后的insert into语句在SQL工具(我是HeidiSQL)逐步执行下,有异常可反复操作步骤6和7,以达到需要的效果。

    注:一定不要在原数据库实例上操作。可以新建一个数据库实例和表进行操作。我是在测试环境的数据库进操作验证的,验证的数据同步到生产。再进行回滚数据的。

    参考:

    MySQL如何恢复不小心误删的数据记录(binlog)_mysql恢复误删的数据-CSDN博客

    https://www.lmlphp.com/user/62049/article/item/2326681/【精选】sed -i 命令入门详解_码灵的博客-CSDN博客

  • 相关阅读:
    关于华为的BFD
    微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
    Kotlin的关键字 lateinit 和 lazy
    ·工业 4.0 和第四次工业革命详细介绍
    小程序api(常用)
    Webpack 4
    Vue.js+Node.js全栈开发教程:Vue.js数据同步
    Verilog练习1
    1.实验技术-收藏吃灰去,深入浅出常规PCR
    GIT分布式版本控制系统 | 命令讲解入门
  • 原文地址:https://blog.csdn.net/wscwsc58888/article/details/133981431