暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql误删数据谁来拯救

青雨果果 2021-06-03
449
拯救者:MyFlash

MyFlash初体验

https://github.com/Meituan-Dianping/MyFlash

安装

    `yum install libgnomeui-devel
    gcc -w -g `pkg-config --cflags glib-2.0` source/binlogParseGlib.c -o binary/flashback usr/lib64/libglib-2.0.a -lrt yum install install glib2*`
    复制


    测试环境准备

      https://github.com/Meituan-Dianping/MyFlash/blob/master/doc/TestCase.md
      CREATE TABLE `tb_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nameBlob` longblob, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
      复制


      回滚命令生成

        `./MyFlash/binary/flashback --binlogFileNames=/alidata/mysql/mybinlog.000022 --outBinlogFileNameBase=22delete.flashback`
        复制


        扩展

        阿里云RDS实例,用户没有Super权限,导入带有set @@信息,会提示ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPERprivilege(s) for this operation报错。


        本地5.7版本,测试去除set @@GTID_NEXT,当GTID模式开启状态,导入实例会提示报错:

          ERROR 1782 (HY000) at line 19: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.
          复制


          只有将 GTID模式关闭,才可以正常导入

          https://bugs.mysql.com/bug.php?id=85480

          5.6版本没有以上问题

            `mysqlbinlog -v -v --skip-gtids 22delete.flashback | sed 's@\/\*.*\*\/@@' |mysql -uroot -proot`
            复制


            初步结论


            云上RDS 目前无法使用该工具,由于没有super权限

            解决方案


            采用MyFlash + binlog2sql拯救云上RDS误删数据


            验证binlog2sql 是否支持blob转换

              --w_blob.py  写入blob




              import sys
              import pymysql
              import os


              path = "./"


              fp = open("/alidata/PG01.jpg", 'rb')
              img = fp.read()
              fp.close()


              database = pymysql.connect(host="localhost", user="root", passwd="root", db="qinxi")
              cursor = database.cursor()
              sql = "INSERT INTO tb_test (nameBlob) VALUES (%s);"
              args = (img)
              cursor.execute(sql, args)
              database.commit()
              cursor.close()
              database.close()


              print("============")
              print("Done! ")




              --r_blob.py 读取blob


              import pymysql as mdb
              import sys


              conn = mdb.connect(host='localhost',user='root',passwd='root',db='qinxi')
              cursor = conn.cursor()
              cursor.execute("SELECT nameBlob FROM tb_test LIMIT 1")
              fout = open('PG333.jpg','wb')
              fout.write(cursor.fetchone()[0])
              fout.close()
              cursor.close()
              conn.close()






              python binlog2sql.py -uroot -h10.200.6.53 -proot -B --start-file=mybinlog.000033 > 33.sql
              复制





              mysql误删数据谁来背锅  


              本文分享内容是我自己的一些见解,欢迎大家一起来评论留言探讨,我会不定期更新内容,大家可以关注我哟~,也可以在今日头条搜索“青雨果果”关注我!~

              多点关注
              多份关爱
              文章转载自青雨果果,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论