• MySQL数据库误Update找回数据的方法


    前两天在操作项目的时候,有一条SQL没太注意,少写了where语句,导致整个表被更新成一样的数据。当时感到绝望,幸亏是在校内练手的小项目,3百多条数据。但还是给我上了一课。所以特此记录找回的方法。

    我在网上看了主要是两种方式:

    1. 通过原生的binlog日志在服务器上操作,参考:https://www.cnblogs.com/gomysql/p/3582058.html

    2. 通过一个工具 binlog2sql,定位误操作的日志位置,然后进行逆向sql解析,还原出误操作中的数据sql文件,然后执行即可。参考博客:https://blog.csdn.net/letterss/article/details/93736959(在此特别感谢这位博主的创作)

    后来发现,这种方法在原生开源工具里就有介绍:https://github.com/danfengcao/binlog2sql

    我在这里用的是第二种,并且用自己的服务器和上面的数据库还原出了原来的数据sql文件,然后在navicat里执行sql文件,恢复成功。再次提醒广大网友:备份!!!备份!!!备份!!!怎么强调都不为过!

    OK 开始操作

    在操作之前,我要求你把数据库备份一份,别这个没搞成,最后还把别的搞坏了!

    详细步骤如下:

    1. 查看数据库是否开启了binlog且为ROW格式 (必须开启了才行)

    1)mysql>  show variables like 'log_bin'; 也可以写成 show variables like '%log_bin%';这是模糊查询的意思

    Values值为ON即为开启,这个一般是mysql数据库会自动开启的

    2)查看是否为row 格式

    mysql> show variables like 'binlog_format';

    2.  查看当前binlog文件,然后退出mysql模式,回到服务器命令行模式

    mysql> show master status;

     可以看到当前的binlog文件是binlog.000011(如果有多个,则是最下面的那个)

     【注意】:如果你登录的mysql不是root账户,那么这一步会提示权限不足 需要一些权限才行。

    有两种方法:

    1)、用root账户登录即可(最简单直接)

    2)、创建一个mysql用户(或者直接用已有的账户),并授权相关权限 

    mysql> create user 'gsl'@'localhost' identified by '自己的数据库密码';
    mysql> grant select,replication slave,replication client on *.* to 'gsl'@'localhost';
    (参考:https://www.cnblogs.com/xuanzhi201111/p/6602489.html)

    3. 安装pip和 binlog2sql (这个是大众美团的开源工具参考:https://github.com/danfengcao/binlog2sql

    wget https://bootstrap.pypa.io/get-pip.py
    python get-pip.py
    pip -V (查看pip是否安装成功)

    yum -y install git
    git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
    pip install -r requirements.txt

    安装成功后,进入binlog2sql目录

    【此步一般是安装完后就自动进入了,如果不确定就cd 返回根目录,再 cd /binlog2sql/binlog2sql)】

    4.执行下面的语句

    python binlog2sql.py -h localhost -u 自己的数据库用户名  -p  自己的密码 -d 数据库名 -t 表名 --start-file='binlog.000011'  --start-datetime='2020-6-27 16:20:00' --stop-datetime='2020-6-27 16:40:00'

    【再此记录下我当时误操作的大致时间:2020-6-27 16:20:00 - 2020-6-27 16:40:00】时间点要记好

    这一步可能会遇到以下问题:

    1)版本不一致的问题参考:https://www.jianshu.com/p/f69e846558ab

    • 查看版本命令

    # pip list

    Package                Version

    ---------------------- -----------

    PyMySQL                0.7.11

     更新一下 对应的版本

    # pip install --upgrade PyMySQL

    一般更新后就可以了

    5.执行成功后,如下图所示

     我们可以看到Update的start位置是:2213  。end 位置是2612。(即startposion = 2213,stop-position=2612)在下面的语句中用到

    6. 根据位置回逆向解析出sql文件,这其中就包含了误操作之前的数据

    python binlog2sql.py -h127.0.0.1 -P3306 -uroot -padmin -d数据库名 -t表名 --start-file='binlog.000011' --start-position=2213  --stop-position=2612  -B >  /back.sql
    执行以下命令生成回滚sql,保存在根目录下面,名称为 back.sql(自己起一个就行)。

    在服务器的主目录下查看有没有生成

    7.把这个sql传输到本地(同时备份一遍,以防万一),用编辑器打开看一下是不是你要的sql。基本上只要定位好了,没什么问题。

     但是也有可能这个sql文件的列不对应,发生错乱。这就需要你仔细对比,修改成想要的。我那个就修改了好长时间

    8.用Navicat在一个备用的数据库里执行这个sql文件,而且是同名同结构的表,之后看看数据是不是恢复了

    我这里是实验成功了,恢复出来了原来的数据。

    9. 恢复之后,首先做的第一步便是:赶紧备份一份!

  • 相关阅读:
    base64编码
    ios开发之指纹识别
    date
    php的学习
    mac下安装mysql遇到的无法连接的问题
    关于git上传文件过大报错的问题 remote: warning: Large files detected.
    安卓开发中Theme.AppCompat.Light的解决方法
    ubuntu操作系统中卸载mysql的安装与卸载
    重新格式化删除U盘隐藏分区与如何在LMT下安装非Ghost win7
    网易有道笔试2015-05-12
  • 原文地址:https://www.cnblogs.com/gslgb/p/13210800.html
Copyright © 2020-2023  润新知