精华内容
参与话题
问答
  • MYSQL误删数据恢复

    2019-11-09 17:41:46
    MYSQL误删数据恢复,有备份的话很简单,只需要生成一个最近备份的数据 然后用mysqlbinlog找回备份时间点之后的数据 再恢复到现网即可。要是没有备份 可能就会比较麻烦,找回数据的成本也是非常之高的. 下面介绍下 ...

    MYSQL误删数据恢复,有备份的话很简单,只需要生成一个最近备份的数据 然后用mysqlbinlog找回备份时间点之后的数据 再恢复到现网即可。要是没有备份 可能就会比较麻烦,找回数据的成本也是非常之高的.
    下面介绍下 mysqlbinlog找回备份时间点之后的数据的办法:

    做个简单的实验,将MySQL的表数据删除之后,然后用mysqlbinlog 找回刚才删除的表的数据。
    app表的创建时间和数据的插入: 2013-02-04 10:00:00
    原理: mysqlbinlog
    前提: mysql开启了bin log日志
    测试删除之前:

    mysql> show tables;
    +-----------------------+
    | Tables_in_report_sina |
    +-----------------------+
    | app                   |
    | test                  |
    +-----------------------+
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2013-02-04 11:45:44 |
    +---------------------+
    1 row in set (0.01 sec)
    
    mysql> select count(1) from app;
    +----------+
    | count(1) |
    +----------+
    |       10 |
    +----------+
    1 row in set (0.01 sec)
    

    开始删除数据:

    mysql> delete from app where id =1;
    Query OK, 1 row affected (0.00 sec)
    mysql> 
    mysql> delete from  app where id <6;
    Query OK, 4 rows affected (0.01 sec)
    mysql> select count(1) from app;
    +----------+
    | count(1) |
    +----------+
    |        5 |
    +----------+
    1 row in set (0.00 sec)
     
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2013-02-04 12:08:45 |
    +---------------------+
    

    开始找回数据:
    1.找到bin log的位置:

    /app/mysql/log
    -rw-rw---- 1 mysql mysql  17K Feb  4 11:43 alert.log
    -rw-rw---- 1 mysql mysql 1.0K Nov  1 14:52 master-bin.000001
    -rw-rw---- 1 mysql mysql  126 Dec 25 14:00 master-bin.000002
    -rw-rw---- 1 mysql mysql  126 Dec 25 14:02 master-bin.000003
    -rw-rw---- 1 mysql mysql  126 Dec 25 14:02 master-bin.000004
    -rw-rw---- 1 mysql mysql  107 Dec 25 14:02 master-bin.000005
    -rw-rw---- 1 mysql mysql  13K Feb  4 12:02 master-bin.000006
    

    可以看到 最近被修改的bin log 只有 master-bin.000006
    (要是误删除跨越了好几个bin log 找回数据的时候就必须一个个的bin log日志去找回了)
    将这一段时间所有执行的sql语句存入到 待恢复的 sql文件中。

    mysqlbinlog --start-date='2013-02-04 10:00:00' --stop-date='2013-02-04 12:08:45' /app/mysql/log/master-bin.000006 >/app/mysql/mysql_restore_20130204.sql
    

    当然在现网环境下 ,这个时间可能没那么的准确,并且还有其他事务sql语句的干扰。

    创建临时数据库

    create database for_bak;
    

    导出当前数据库中被误删的表 app

    mysqldump -uroot -ppwd my_db app > /app/mysql/app.sql
    

    将现在的数据导入到临时表:

    mysql -root -ppwd for_bak < /app/mysql/app.sql
    

    我们再来看下 /app/mysql/mysql_restore_20130204.sql的部分内容: (可以看到罪恶的delete 语句)

    SET TIMESTAMP=1359949544/*!*/;
    BEGIN
    /*!*/;
    # at 12878
    #130204 11:45:44 server id 1  end_log_pos 12975  Query thread_id=5 exec_time=974 error_code=0
    SET TIMESTAMP=1359949544/*!*/;
    delete from app where id =1
    /*!*/;
    # at 12975
    #130204 11:45:44 server id 1  end_log_pos 13002  Xid = 106
    COMMIT/*!*/;
    # at 13002
    #130204 11:45:44 server id 1  end_log_pos 13077  Query thread_id=5 exec_time=1013 error_code=0
    SET TIMESTAMP=1359949544/*!*/;
    BEGIN
    /*!*/;
    # at 13077
    #130204 11:45:44 server id 1  end_log_pos 13175  Query thread_id=5 exec_time=1013 error_code=0
    SET TIMESTAMP=1359949544/*!*/;
    delete from  app where id <6
    /*!*/;
    # at 13175
    #130204 11:45:44 server id 1  end_log_pos 13202  Xid = 107
    COMMIT/*!*/;
    DELIMITER ;
    # End of log file
    

    可以看到 数据是什么时间点删除的 。 具体的时间也可以用 select from_unixtime(1359949544); 来查询
    令人欣慰的是 create table app 语句和 insert 的语句也在这个文件之中。 在手工去掉 delete 语句之后 在临时库里面进行 source mysqlbinlog找回来的sql文件就将app恢复到被删除之前的状态了。 然后将临时库的数据导入到现网数据(这个不是这篇文章的重点了)。

    要是没有备份,要找回所有app表相关的数据 那可能就非常的麻烦了 尤其是 binlog文件非常多 而且每个都比较的大。那样的话也只有从app的建立到现在 用mysqlbinlog来逐个的找回与app表相关dml操作的sql记录,然后整合恢复数据。我想这种情况一般比较的少。虽然麻烦,但是也不是不能恢复。

    展开全文
  • mysql误删数据恢复

    2019-10-05 08:13:56
    数据库忘记备份,可以使用mysql的日志二进制文件(binlog)进行数据恢复。 首先查看是否开启了binlog。 show variables like 'log_%'; 进入mysql根目录, 会看到有binlog.*的日志文件。取后面数字最大的...

    数据库忘记备份,可以使用mysql的日志二进制文件(binlog)进行数据恢复。 

    1. 首先查看是否开启了binlog。
      show variables like 'log_%';

       

    2. 进入mysql根目录, 会看到有binlog.*的日志文件。取后面数字最大的日志文件,数据恢复。

        3.检查某一时间端的binlog (start-datetime是开始的时间,stop-datetime是结束的时间)。

    mysqlbinlog  --start-datetime="2019-10-05 09:00:00" --stop-datetime="2019-10-05 12:00:00" binlog.000010

     

    4.找到某一个节点,进行数据恢复(也可以按照时间直接进行导出)

    mysqlbinlog --stop-position=2213743 mysql-bin.000010 > ~/Backup_1.sql

    5.将导出的sql文件导入到数据库中就OK了。

    展开全文
  • mysql 误删数据恢复

    千次阅读 2013-01-23 16:46:47
    数据平台开发误删数据,但是不知道具体时间点,就给了一个模糊时间,同事使用rollback逆向恢复(解析binlog产生反向SQL),我使用备份集恢复apply binlog正向恢复,尽快解决问题 【原正向恢复方式】 ...

    数据平台开发误删数据,但是不知道具体时间点,就给了一个模糊时间,同事使用rollback逆向恢复(解析binlog产生反向SQL),我使用备份集恢复apply binlog正向恢复,尽快解决问题

    【原正向恢复方式】
    • 选择数据出问题时间之前最近的备份集恢复在一个新实例(restorebak.pl恢复工具支持,操作方便)
    • 将备份集pos与数据出问题pos之间的binlog拷贝到新实例上(拷贝binlog操作繁琐)
    • 使用mysqlbinlog –stop-datetime来apply binlog到新实例,以便恢复到数据出问题前的一致性数据快照(mysqlbinlog每次只支持单个binlog apply ,操作繁琐)

     

    其中关于pos点的查找一般都是通过类似mysqlbinlog –no-defaults –stop-datetime=”2012-11-11 11:11:11″ |grep “具体操作”  -C 3方式来查找的,先通过大体时间段确定一个范围,然后在范围内的精确查找具体的pos

     

    其实mysql有个函数master_pos_wait 可以指定具体pos并返回期间执行事件,于是改进恢复过程,将新实例直接指向原主库拉binlog

    【新正向恢复方式】
    • 选择数据出问题时间之前最近的备份集恢复在一个新实例(恢复工具支持,操作方便)
    • start slave;select MASTER_POS_WAIT(‘mysql-bin.000396′,67698920,0);stop slave; (relay 到指定pos后 触发stop slave操作)
    • show slave status\G;  (保存复制关系)
    • change master to  master_host=’ ‘, master_user=’slave’,master_password=’slave’; (取消复制关系,防止误操作开启复制)
    【问题】
    这种方式在新实例上会多执行几个事件,所以需要将MASTER_POS_WAIT设置的pos提前一些,只适用于基于时间恢复的粗略场景,但是这种场景占绝大多数情况

     MASTER_POS_WAIT(log_name,log_pos[,timeout])

    This function is useful for control of master/slave synchronization. It blocks until the slave has read and applied all updates up to the specified position in the master log. The return value is the number of log events the slave had to wait for to advance to the specified position. The function returns NULL if the slave SQL thread is not started, the slave’s master information is not initialized, the arguments are incorrect, or an error occurs. It returns -1 if the timeout has been exceeded. If the slave SQL thread stops while MASTER_POS_WAIT() is waiting, the function returns NULL. If the slave is past the specified position, the function returns immediately.

    If a timeout value is specified, MASTER_POS_WAIT() stops waiting when timeout seconds have elapsed. timeoutmust be greater than 0; a zero or negative timeout means no timeout.

    This function is unsafe for statement-based replication. Beginning with MySQL 5.5.1, a warning is logged if you use this function when binlog_format is set to STATEMENT. (Bug #47995)

     

    【分享】
    后来同事分享其实start slave直接可以指定停止的pos,汗
    START SLAVE [SQL_THREAD] UNTIL MASTER_LOG_FILE = ‘log_name‘, MASTER_LOG_POS = log_pos

    An UNTIL clause may be added to specify that the slave should start and run until the SQL thread reaches a given point in the master binary log or in the slave relay log. When the SQL thread reaches that point, it stops. If the SQL_THREAD option is specified in the statement, it starts only the SQL thread. Otherwise, it starts both slave threads. If the SQL thread is running, the UNTIL clause is ignored and a warning is issued.

    For an UNTIL clause, you must specify both a log file name and position. Do not mix master and relay log options.

    Any UNTIL condition is reset by a subsequent STOP SLAVE statement, a START SLAVE statement that includes noUNTIL clause, or a server restart.

    The UNTIL clause can be useful for debugging replication, or to cause replication to proceed until just before the point where you want to avoid having the slave replicate an event. For example, if an unwise DROP TABLE statement was executed on the master, you can use UNTIL to tell the slave to execute up to that point but no farther. To find what the event is, use mysqlbinlog with the master binary log or slave relay log, or by using a SHOW BINLOG EVENTS statement.

    If you are using UNTIL to have the slave process replicated queries in sections, it is recommended that you start the slave with the –skip-slave-start option to prevent the SQL thread from running when the slave server starts. It is probably best to use this option in an option file rather than on the command line, so that an unexpected server restart does not cause it to be forgotten.

    【最终正向恢复方式】
    • 选择数据出问题时间之前最近的备份集恢复在一个新实例(恢复工具支持,操作方便)
    • start slave until master_log_file=’mysql-bin.000396′,master_log_pos=67698920;
    • show slave status\G;  (保存复制关系)
    • change master to  master_host=’ ‘, master_user=’slave’,master_password=’slave’; (取消复制关系,防止误操作开启复制)
    【改进】
    可以直接把start slave until语句直接做到恢复工具中,很大的收获
    感谢印风和智盛的idea,感谢维西的分享

    转自:http://www.taobaodba.com/html/1590_%E5%BC%80%E5%8F%91%E8%AF%AF%E5%88%A0%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D.html/comment-page-1#comment-19171
    展开全文
  • Mysql误删数据恢复方法-mysqlbinlog

    千次阅读 2017-02-22 15:49:41
    这里写一下MySql 数据误删除的恢复过程。这里采用的方式是mysqlbinlog的日志恢复 首先,mysql要配置开启bin-log。查看my.ini文件(默认是my-default.ini),在文件后面加入 log-bin = mysql-bin 另外,配置一下...

    这里写一下MySql 数据误删除的恢复过程。这里采用的方式是mysqlbinlog的日志恢复

    首先,mysql要配置开启bin-log。查看my.ini文件(默认是my-default.ini),在文件后面加入

    log-bin = mysql-bin

    另外,配置一下bin-log的格式,我这里使用了mixed。在文件后面加入

    binlog_format = mixed

    如下:

    bin-log有3种格式,每种格式都有好处,这里带上API,https://dev.mysql.com/doc/internals/en/binlog-formats.html

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

    然后重启mysql

    进入mysql , 输入show variables like '%bin%'; 查看是否开启binlog。 如下图:

     

    为ON 代表开启,接着我们新建一个数据表,来进行测试。下面是一些基本的mysql操作,就不一一介绍了,直接上图

    数据给误删除了,接着我们要进行恢复。

    打开mysql的安装目录,在Data(数据库)文件夹里面,可以看到一些mysql-bin.xxxxxx文件。如:

    这些都是二进制文件,我们找到最新的那一个,mysql-bin.000004. 接着我们需要把它转成sql文件。如何转????

    在cmd中,进入mysql的bin目录,然后输入

    mysqlbinlog "mysql-bin.000004文件的路径" > "目标sql保存路径"。如:

    接着在目标路径可以找到目标sql,这里我的路径时d盘根目录下的test.sql。我们把这文件给打开。会发现里面有许多日志信息,包括一些执行过的sql。我在最后面看到了我刚刚的delete操作。

    做了删除操作,我们得把数据给insert 回去,继续看日志,会发现

     

    我们的任务就是把目标起点到目标终点的事重新做一遍。

    mysqlbinlog "mysql-bin.000004的路径" --start-position=目标起点 --stop-position=目标终点 | mysql -u root -p

    如图:

    接着我们再去查一下数据库,发现刚刚删除的数据又回来了

     

     

    以上就是这个数据误删除的日志恢复流程。也是数据误删除的日志恢复方式。

     

    此刻,你们是否有这种感觉,没意义呀。如果我数据一个月了呢?一年了呢?,要找回所有的数据怎么可能?

    很直接告诉你,只靠这种方式几乎不可能恢复的很全。

     

    主从数据备份+日志,才是正解。好好学习

     

    展开全文
  • 相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来。...
  • MySQL日志 开启bin-log日志 1,使用vim或其它编辑器 打开 mysql 配置文件 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 2,找到 以下两个配置项 server-id = 123456 log_bin = /var/log/mysql/mysql-b...
  • show variables like '%...打开数据库所在路径查看有mysql-bin.****这样的文件,注意DELETE删除的时间,对比mysql-bin文件的修改时间,我的是26号下午18点左右进行的删除数据,所以找mysql-bin.000028这个文件 把...
  • mysql 误删数据应用备份与binlog恢复数据 今天测试使用binlog恢复数据时碰到了一个小问题,记录一下。 作者:zhou_rose mysql版本:5.7 场景模拟误删数据 delete from table; 由于是测试我就没有按文档完全一样的...
  • 使用binlog恢复MySQL误删数据 本文章使用CentOS 7.6版本进行测试 使用docker安装MySQL 1. 安装docker yum install docker 2. 启动docker systemctl start docker 3. 拉取MySQL镜像 docker pull mysql:5.6...
  • mysql误删数据恢复

    千次阅读 2018-03-22 19:57:28
    今天误删mysql,只剩下/var/lib/mysql 里面的ib_logfile0、ib_logfile1、ibdata1! 然后yum install mysql失败,原因是require的 mysql和available的mysql不一样。 第一个问题无法安装mysql 原因是源不对所以...
  • MySQL误删恢复实战

    2019-09-18 06:27:29
    创建测试库、表 create database test; use test; create table leo (id int,name ...插入数据 insert into leo values (1,"liufeng"); insert into leo values (2,"zhangsan"); insert into leo values (3,"liufen...
  • 利用主从搭建恢复时: 一种加速的方法是,在用备份恢复出临时实例之后,将这个临时实例设置成线上备库的从库, 这样:在 start slave 之前,先...这样做也可以用上并行复制技术,来加速整个数据恢复过程。 方...
  • 转发:https://www.cnblogs.com/cpw6/p/12518726.html
  • MySQL数据误删恢复

    2020-08-15 14:21:28
    一、查看MySQL的binlog是否开启 ...三、根据误删的时间找到相对应的binlog日志 四、转换binlog为正常sql mysqlbinlog --base64-output=decode-rows -v --database=DBName --start-datetime="2020-08-15
  • Mysql 表中误删数据的处理方法!!!(本人亲身经历的事) 最笨的方法是也是最有效的方法。 就是去查看历史日志。 在工具-> 历史日志 或者 用快捷键 Ctrl+H。 如果是整个表误删了,在有备份的数据库和开启binlog...
  •  当时想了一下,因为博主没有遇到过这个问题,但是也多少了解一些,所以就回答通过mysql的binlog日志进行恢复。  面试官当时问了一下具体的流程。就有些懵逼了。所以就总结了一下,前提一定要做好备份! 数据库...
  • mysql 数据误删恢复

    2019-09-27 02:29:02
    当binlog_format设置为ROW时,想查看binlog中的sql语句时,需要解密,添加这个 --base64-output=decode-rows -v 转载于:https://www.cnblogs.com/theone67/p/11200928.html
  • 1、 在mysql的安装目录下找到对应的mysql-bin文件 参考路径:mysql/data 2、 把对应的mysql-bin文件生成对应的sql文件 参考命令:mysqlbinlog --base64-output=DECODE-ROWS -v ...① insure_middleground(恢复的库名)
  • --查看bin-log是否开启 show variables like '%log_bin%';...--查看产生的binary log,找到误删的pos mysqlbinlog YY-20150409AOUK-bin.000006|grep -C 5 "delete from"   --...
  • mysql误删数据 使用delete语句误删数据行 使用drop table或者truncate table误删数据表 使用drop database语句误删数据库 使用rm误删mysql整个实例 对于误删行 使用flashback工具闪回,把数据恢复回来。原理是修改...
  • mysql误删数据 使用delete语句误删数据行 使用drop table或者truncate table误删数据表 使用drop database语句误删数据库 使用rm误删mysql整个实例 对于误删行 使用flashback工具闪回,把数据恢复回来。原理是...
  • mysql 误删ibdata1文件 恢复数据

    千次阅读 2019-04-11 16:58:26
    mysql Innodb存储的数据,data目录下 ibd文件存储数据, 把原来的data目录下的数据库文件备份一下 删除数据库 再重建同名数据库,或者直接重命名原来的数据库 新建原来同名数据库 如果有原来数据库的表结构 先...
  • mysql 恢复误删数据

    千次阅读 2017-11-18 13:14:26
    mysql通过bin_log恢复数据 转载 2016年09月26日 15:55:39 标签:恢复数据 /bin_log 2897 一、开启binlog日志:  编辑打开mysql配置文件my.cnf,在[mysqld]区块设置/添加 log-bin=...

空空如也

1 2 3 4 5 ... 18
收藏数 343
精华内容 137
关键字:

mysql误删数据恢复

mysql 订阅