精华内容
下载资源
问答
  • mysql 误删除数据恢复

    千次阅读 2017-04-01 16:03:43
    mysql 误删除数据恢复 1.首先确认误删除了那些表的数据以及什么时间执行的删除操作 2.根据上面的时间去mysql服务器下载二进制日志 3.把下载的二进制日志文件上传到本地数据库服务器上,执行如下命令分析 ...
    mysql 误删除数据恢复
    1.首先确认误删除了那些表的数据以及什么时间执行的删除操作
    2.根据上面的时间去mysql服务器下载二进制日志
    3.把下载的二进制日志文件上传到本地数据库服务器上,执行如下命令分析
    mysqlbinlog  --no-defaults -v -v --base64-output=DECODE-ROWS --start-datetime="2017-04-01 00:00:00"  --stop-datetime="2017-04-01 00:18:50" /home/mysqldata/mysql-bin.000561 >rmdata.txt
    mysqlbinlog  --no-defaults -v -v --base64-output=DECODE-ROWS  /home/mysqldata/mysql-bin.000562 >rmdata.txt
    --start-datetime 开始时间
    --stop-datetime  结束时间
    4.提取相应表的删除语句
    sed -n '/DELETE FROM `xxx`.`table_name`/,/@15=/{p}' rmdata.txt  >tablename.txt
    @15表中的最后一个字段
    5.提取的delete语句转换成相应的insert语句
    python recover.py tablename.txt 25 > tablename.sql
    命令行中的25 表示 需要还原的表的字段有25个
    recover.py 脚本内容如下(网上找的)
    #!/bin/env python 
    # -*- encoding: utf-8 -*- 
    #------------------------------------------------------------------------------- 
    # Name:        recover.py 
    # Purpose:     通过Binlog恢复Delete误操作数据 
    # Author:      
    # Created:     
    # update:     
    # Copyright:  
    # Licence:     
    #------------------------------------------------------------------------------- 
    def read_binlog(file,column_num): 
        f=open(file) 
        num = '@'+str(column_num) 
        while True: 
            lines = f.readline() 
            if lines.strip()[0:3] == '###': 
                lines=lines.split(' ',3) 
                if lines[1] == 'DELETE' and lines[2] =='FROM':           #该部分替换Delete为Insert 
                    lines[1] = "INSERT" 
                    lines[2] = 'INTO' 
                    lines[-1] = lines[-1].strip() 
                if lines[1].strip() == 'WHERE': 
                    lines[1] = 'VALUES (' 
                if  ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] <> num:          #num为列数,要是小于最大的列数,后面均加, 
                    lines[3] = lines[3].split('=',1)[-1].strip() 
                    if lines[3].strip('\'').strip().find('\'') <> -1: 
                        lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #这里过滤掉转义的字符串 
                        lines[3] = '\'' + lines[3] + '\',' 
                    elif lines[3].find('INT meta') <> -1:                #过滤Int类型的字段为负数后带的(),正数不受影响 
                        lines[3] = lines[3].split('/*')[0].strip() 
                        lines[3] = lines[3].split()[0] + ',' 
                    elif lines[3].find('NULL') <> -1: 
                        lines[3] = lines[3].split('/*')[0].strip() 
                        lines[3] = lines[3] + ',' 
                    else: 
                        lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #这里过滤掉转义的字符串 
                        lines[3] = '\'' + lines[3].strip('\''' ') + '\',' 
                if  ''.join(lines).find('@') <> -1 and lines[3].split('=',1)[0] == num:          #num为列数,要是小于最大的列数,后面均加); 
                    lines[3] = lines[3].split('=',1)[-1].strip() 
                    if lines[3].find('\'') <> -1:  
                        lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #同上 
                        lines[3] = '\'' + lines[3] + '\');' 
                    elif lines[3].find('INT meta') <> -1:                #同上 
                        lines[3] = lines[3].split('/*')[0].strip() 
                        lines[3] = lines[3].split(' ')[0] + ');' 
                    elif lines[3].find('NULL') <> -1: 
                        lines[3] = lines[3].split('/*')[0].strip() 
                        lines[3] = lines[3] + ');' 
                    else: 
                        lines[3] = lines[3].split('/*')[0].strip('\'').strip().strip('\'').replace('\\','').replace('\'','\\\'')  #同上 
                        lines[3] = '\'' + lines[3].strip('\''' ') + '\');' 
                print ' '.join(lines[1:]) 
            if lines == '': 
                break 
    if __name__ == '__main__': 
        import sys 
        read_binlog(sys.argv[1],sys.argv[2]) 


    6.查看tablename.sql文件语句确认没有问题,执行语句即可恢复删除数据
    展开全文
  • mysql误删除数据恢复

    2021-05-28 16:09:44
    登录mysql ./mysql -u root -p123456 执行查询命令 show variables like 'log_bin%'; log_bin 的value为ON 说明已开启 开启binlog日志 使用vi编辑器修改MySQL的my.cnf配置文件 vim /etc/my.cnf 在my....

    检查binlog日志是否开启

    登录mysql

    ./mysql -u root -p123456

    执行查询命令

     show variables like 'log_bin%';

    log_bin 的value为ON 说明已开启

    开启binlog日志

    使用vi编辑器修改MySQL的my.cnf配置文件

    vim /etc/my.cnf

     在my.cnf配置文件中添加如下图的语句 并保存 退出即可

    重启MySQL

    service mysqld restart

     

    通过mysqlbinlog 恢复删除的数据日志记录

    /usr/local/mysql/bin/mysqlbinlog  /usr/local/mysql/data/mysql-bin.000032 -v  --base64-output=decode-rows -v --database=canal_test  --start-datetime="2021-05-28 15:56:00" --stop-datetime="2021-05-28 18:10:00" > /usr/local/mysql/data/mysqllog.sql
    

    mysqlbinlog 命令的参数说明
    --base64-output=decode-rows //数据转换正常的字符,如果不设置这个参数将显示base64的数据
    --database=DBName  //数据库名(一个mysql数据库比较多,指定方便恢复)
    --start-datetime="2021-05-28 18:00:00"  //恢复起始时间
    --stop-datetime="2021-05-28 18:10:00"  //恢复结束时间
    /usr/local/mysql/data/mysql-bin.000032 //为数据恢复的日志文件
    mysqllog.sql    //恢复以后我们需要的文件名

     打开mysqllog.sql文件,搜索 DELETE 关键字,找到被删除数据,如下图

    把mysqllog的DELETE转换为INSERT语句 保存到 mysqllogRollbak.sql

    cat /usr/local/mysql/data/mysqllog.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.*),/\1;/g' | sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' > /usr/local/mysql/data/mysqllogRollbak.sql
    

    打开mysqllogRollbak.sql 如下图 

     

    注意

    MySQL read_log_event(): 'Found invalid event in binary log'  

    错误原因可能是自己安装的 跟 缺省的 版本存在冲突  最好使用全路径命令

     

    展开全文
  • mysql误删除数据恢复处理
    1.事故
    后台操作权限较高人员执行错误的删除语句:mysql> delete from order where order_id=1;
    2.事故影响
    用户看不到这个定单,且这个定单是活跃的定单
    3.是故时间
    4.恢复处理流程
    保留现场。
    mysql> delete from order where order_id=4;
    Query OK, 1 row affected (0.00 sec)
    记录误操作语句。
    delete from order where order_id=1;
    评估受影响数据库,表,和记录数。
    weshop_pure,order,1行记录被删除
    拷贝最近备份文件和从备份时间到当前的binlog日志文件到测试机
    2016-02-29.3:18:48.db3.weshop_pure.sql.gz
    mysql-bin.000039:包含从2016-02-29.3:18:48到当前的二进制日志
    查看二进制中误操作语句执行的位置点
    mysqlbinlog   ./mysql-bin.000039 >./mysqlbinlog.tmp
    view ./mysqlbinlog.tmp
    /*!*/;
    # at 21729
    #160229 11:23:03 server id 1  end_log_pos 21860 CRC32 0xab8e98fc        Query   thread_id=29217 exec_time=0     error_code=0
    SET TIMESTAMP=1456716183/*!*/;
    delete from order where order_id=4
    /*!*/;
    解压数据备份文件
    gunzip 2016-02-29.3:18:48.db3.weshop_pure.sql.gz
    在测试库中执行数据备份文件,恢复数据库到初始时间点
    mysql -udba -p -h127.0.0.1 < ./2016-02-29.11:18:48.db3.weshop_pure.sql
    执行binlog日志恢复到误操作之前
    mysqlbinlog  --stop_position=21729 ./mysql-bin.000039 |mysql -udba -p123456 -h127.0.0.1
    查看数据是否恢复
    mysql> SELECT * FROM `order`;
    +----------+------------------+------------------+----------+--------------+----------+------------+--------------+------------+--------------+--------------+---------------+--------------+--------------+------------+-----------+---------------+--------------+------------------+-------------+--------------+------------+--------------+---------------+------------+------------+---------------+
    | order_id | order_sn         | pay_sn           | store_id | store_name   | buyer_id | buyer_name | buyer_email  | add_time   | payment_code | payment_time | finnshed_time | goods_amount | order_amount | rcb_amount | pd_amount | rebate_amount | shipping_fee | evaluation_state | order_state | refund_state | lock_state | delete_state | refund_amount | delay_time | order_from | shipping_code |
    +----------+------------------+------------------+----------+--------------+----------+------------+--------------+------------+--------------+--------------+---------------+--------------+--------------+------------+-----------+---------------+--------------+------------------+-------------+--------------+------------+--------------+---------------+------------+------------+---------------+
    |        2 | 8000000000050501 | 6005100574235001 |        1 | **联盟     |      363 | crj        |******3.com | 1456713480 | predeposit   |   1456713480 |    1456715975 |      1000.00 |      1000.00 |    1000.00 |      0.00 |          0.00 |         0.00 |                0 |          40 |            0 |          0 |            0 |          0.00 | 1456713523 |          1 | NULL          |
    |        3 | 8000000000050601 | 5105100600824001 |        1 | **联盟     |      363 | crj        | ******3.com | 1456716008 | offline      |            0 |             0 |      1000.00 |      1000.00 |       0.00 |      0.00 |          0.00 |         0.00 |                0 |           0 |            0 |          0 |            0 |          0.00 |          0 |          1 |               |
    |        4 | 8000000000050701 | 9205100601392001 |        1 | **联盟     |      363 | crj        | ******3.com | 1456716107 | predeposit   |   1456716107 |             0 |      1000.00 |      1000.00 |    1000.00 |      0.00 |          0.00 |         0.00 |                0 |          30 |            0 |          0 |            0 |          0.00 | 1456716134 |          1 | NULL          |
    +----------+------------------+------------------+----------+--------------+----------+------------+--------------+------------+--------------+--------------+---------------+--------------+--------------+------------+-----------+---------------+--------------+------------------+-------------+--------------+------------+--------------+---------------+------------+------------+---------------+
    3 rows in set (0.00 sec)
    导出误删数据
    mysqldump -udba -p -h127.0.0.1 weshop_pure --tables order --extended-insert=false --complete-insert --where='order_id=4'
    ......
    LOCK TABLES `order` WRITE;
    /*!40000 ALTER TABLE `order` DISABLE KEYS */;
    INSERT INTO `order` (`order_id`, `order_sn`, `pay_sn`, `store_id`, `store_name`, `buyer_id`, `buyer_name`, `buyer_email`, `add_time`, `payment_code`, `payment_time`, `finnshed_time`, `goods_amount`, `order_amount`, `rcb_amount`, `pd_amount`, `rebate_amount`, `shipping_fee`, `evaluation_state`, `order_state`, `refund_state`, `lock_state`, `delete_state`, `refund_amount`, `delay_time`, `order_from`, `shipping_code`) VALUES (4,8000000000050701,9205100601392001,1,'**联盟',363,'crj','123E@123.com',1456716107,'predeposit',1456716107,0,1000.00,1000.00,1000.00,0.00,0.00,0.00,0,30,0,0,0,0.00,1456716134,1,NULL);
    /*!40000 ALTER TABLE `order` ENABLE KEYS */;
    UNLOCK TABLES;
    ......
    拷贝insert语句到主库上执行

    检查是否还原数据


    5.备注
    本次案例展示了delete误删除生产数据,利用dump备份和binlog日志恢复数据,其实所有的误操作都可以通过此方式恢复
    应该严格控制数据库权限,最大限度降低误操作概率
    养成好习惯,危险操作(delete,update,DDL)之前一定要先备份数据
    展开全文
  • 恢复概览: 1、通过mysql二进制日志文件生成sql,整个库恢复需把删除的sql语句去掉,运行sql 2、部分恢复同样生成sql文件,过滤sql文件,复制sql后去掉不需要的sql语句,运行sql 生成sql文件方法: 通过...

    恢复前提 :mysql有打开日志记录

    恢复概览: 1、通过mysql二进制日志文件生成sql,整个库恢复需把删除的sql语句去掉,运行sql

                       2、部分恢复同样生成sql文件,过滤sql文件,复制sql后去掉不需要的sql语句,运行sql


    生成sql文件方法:

    通过mysqlbinlog工具 一般在/mysql/bin 下面

    执行命令: 

    mysqlbinlog --no-defaults --base64-output=decode-rows -v --start-datetime="2018-12-14 10:30:00" --stop-datetime="2019-04-08 10:50:00" --database=数据库名 /data/mysql/data/mysql-bin.000004 > a1.sql

    ps: start-datetime~stop-datetime 是误操作时间段

    ps: /data/mysql/data/mysql-bin.000018 日志文件

     show master status;

    然后执行

            find / -name mysql-bin.000018 找到路径mysql-bin开头的可能有多个

    cat a1.sql 后可看到操作的sql

    拿到 end_log_pos 2442766

    以它为结束点 执行:

          mysqlbinlog --no-defaults -d 数据库名 --stop-position=2442766 /data/mysql/data/mysql-bin.000018>>back.sql

    得到所有执行过的sql 语句

    全量恢复执行:去掉back.sql 不需要执行的sql

    筛选恢复: 

            more back.sql |grep -E 'INSERT INTO `PhoneTag`|update PhoneTag|delete from PhoneTag' -A5   

    ps:参数A5向下获取5行 B5向上获取5行

    复制筛选后的sql运行。


    总结:

        新建数据表能不采用自增id就不采用,恢复数据时执行过的sql大多根据id来过滤,日志新增语句不会带上id。

     

        

     

     

     

     

     

    展开全文
  • 环境信息:mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapperCentOS release 6.5 (Final)binlog_format: rowtx_isolation: read-commit昨天业务不小心删除了生产环境mysql中的一张表。...
  • 环境信息:mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapperCentOS release 6.5 (Final)binlog_format: rowtx_isolation: read-commit步骤大体如下:(1) 拷贝备份文件到服务器;...
  • 环境信息:mysql Ver 14.14 Distrib 5.6.35, for Linux (x86_64) using EditLine wrapperCentOS release 6.5 (Final)binlog_format: rowtx_isolation: read-commit具体参考方法:...
  • mysql误删除数据库恢复 mysql数据库误删除表数据恢复 mysql删除数据恢复 客户名称 保密 数据类型 MYSQL 5.7 数据大小 10 mb 故障检测 误操作导致表数据被删除。 修复结果 直接从表物理文件提取删除记录,数据恢复率达...
  • mysql删除数据恢复 mysql删除表数据恢复 mysql删除数据库恢复 数据类型 Mysql 5.7 innodb表 数据大小 user表 5MB 故障检测 误删除了表记录。 客户要求 恢复全部的删除记录。 修复结果 frm ...
  • 据类型 MYSQL 5.6 数据大小 2.5 GB ...修复结果 直接从磁盘提取客户需要的表数据完成恢复,数据恢复率达99% 客户非常满意 分享以下解密 网址供大家参考希望可以帮到您 https://www.emsisoft.com/decrypter/ ...
  • Mysql 通过binlog日志恢复数据 Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来...
  • Mysql数据库误删除数据恢复成功 【客户描述】 客户在网站管理后台误操作把“报表”和“代理”数据删除,因数据库只有2月份的备份,丢失近三个月的数据。 【数据库分析】 因为客户并不了解数据库结构,所以拿到数据库...
  • 一、系统环境配置情况 系统环境: Linux 2.6.32-754.3.5.el6.x86_64 数据库环境:mysql 5.7.23日志格式... 某技术人员在上午10点不小心trancate了一个表,上午11点发现了异常需紧急恢复删除数据。   三、...
  • mysql误操作删除数据数据恢复

    千次阅读 2018-09-17 09:06:17
    关于操作删除数据数据恢复,一定要有安全意识,MySQL数据的找回,一定要在配置bin-log,否则数据丢失将无法恢复:  在MySQL的my.ini(或my.cnf,视操作系统不同而不同)添加:  [mysqld]  log-bin=binlog...
  • mysql数据误删除恢复

    2021-03-18 12:06:56
    情况说明:数据库里的整个数据表被删除 第一步:找到日志文件所在位置(在data文件夹下,名字为binlog.XXXXXX),文件不能直接打开阅读 第二步:通过mysqlbinlog转化为sql文件。在bin文件夹中进入控制界面,并把之前...
  • 使用rm -f ib*删除数据文件和重做日志文件。 这时mysql进程还存在,mysql还能正常使用。 文件恢复: 1:查找mysqld的进程号。 1 2 #netstat-ntpl|grepmysqld tcp000.0.0.0:33060.0.0.0:*LIS...
  • MYSQL数据库误删除恢复 mysql数据库丢失恢复 mysql数据库drop database恢复 数据类型 mysql 5.7 for XFS文件系统 数据大小 10 GB 故障检测 误删除数据库后,客户自己还原了备份及在原始分区尝试使用binlog恢复,但是...
  • MySQL:生产误删除数据恢复方法

    千次阅读 2016-08-17 11:00:16
    因为生产上执行语句,需要找回原数据 delete from `xxx` where a = 1; 步骤 1、解析主的binlog找到执行删除语句时对应的pos点,如下: # at 272065343 #160815 16:27:46 server id 1 end_log_pos ...
  • 现在遇到数据误删除的问题,查了资料,很遗憾没找到具体的解决方法,都是一两句话带过,也没有个详细的过程。只有在这里向大牛们请教了。 操作系统版本:CentOS release 5.10 (Final) 32位 MySQL版本:5.5.10-...
  • 1.先查看binlog功能是否开启 show variables like ‘%log_bin%’;(查看log_bin字段是否为on) ...4.通过mysqlbinlog恢复删除数据日志记录 mysqlbinlog --base64-output=decode-rows -v --database=databaseName
  • mysql数据库删除恢复 mysql drop数据库恢复 mysql drop表数据恢复 客户名称 保密 数据类型 mysql 5.6 for win 数据容量 6 G 故障类型 数据库被误删除。客户自己尝试各类恢复工具无法找到丢失的...
  • 下面就根据我恢复的经历,讲一下mysql数据库数据恢复的方法: 1. 首先,我慌的不行,还好有人提醒我还有binlog日志可以恢复数据,我才恍然大悟,以前没发生过这种事,还没遇到过,环境如下: ...
  • mysql数据库误删除后的数据恢复操作说明 在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失! 然后,是人总难免会犯错误,说不定哪天大脑短路了来个...
  • 一、误删除数据恢复 1、配置/etc/my.cnf,添加如下参数打开binlog server_id=181 log_bin=binlog binlog_format=ROW 2、创建表及测试数据 mysql> create table test(id int(4),name varchar(22)); Query OK, 0 ...
  • 详解Mysql数据库恢复误删除数据

    千次阅读 2019-03-04 09:26:53
    直接上操作步骤及恢复思路(友情提示:数据库的任何操作都要提前做好备份),以下是Mysql数据后的恢复过程: 1. 找到binlog 恢复数据的前提是必须开启Mysql的binlog日志,如果binlog日志没开启,请忽略此篇文档。...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 379
精华内容 151
关键字:

mysql误删除数据恢复

mysql 订阅