V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
maowenjie
V2EX  ›  MySQL

求救 数据库里不小心 delete 数据怎么恢复

  •  
  •   maowenjie · 2018-09-06 14:37:22 +08:00 · 13879 次点击
    这是一个创建于 2304 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不小心 where 条件搞错了 删了一堆的数据

    mysql 5.6 的 innodb 数据库 日志模式 mixed

    尝试用 mysqlbinlog 导出了下 deldete 发现只是记录了 delete 那个语句 没有数据

    有没有具体的教程 网上的好杂乱 不敢乱弄了

    73 条回复    2020-06-18 19:13:32 +08:00
    opengps
        1
    opengps  
       2018-09-06 14:44:11 +08:00
    无论能不能恢复,现在第一时间要做的事是完整备份一下,然后抓紧用备份恢复的数据库研究
    sbmzhcn
        2
    sbmzhcn  
       2018-09-06 14:44:35 +08:00
    先把现场备份,然后再准备恢复尝试,如果失败了,还能还原。如果是 VPS 可以把整个 VPS 备份下。 一定要先备份再操作。
    maowenjie
        3
    maowenjie  
    OP
       2018-09-06 14:45:52 +08:00
    目前数据都导出备份了
    lcorange
        4
    lcorange  
       2018-09-06 14:49:51 +08:00
    看看有没有历史的备份点,数据库备份,硬盘快照什么任何的备份点。
    然后从那个时间点开始捋所有 binlog,然后在备份点的库上,重跑到目前为止所有 binlog 的 sql
    Perterually
        5
    Perterually  
       2018-09-06 15:02:45 +08:00
    删除之前先 select 查看一下。。。
    maowenjie
        6
    maowenjie  
    OP
       2018-09-06 15:07:34 +08:00
    已经恢复了
    数据库前几天建的 中午操作删除的
    所以直接把前几天到中午的数据重新恢复遍
    把数据库删了 然后
    /usr/local/mysql/bin/mysqlbinlog -d mydata --start-datetime='2018-09-04 08:00:00' --stop-datetime='2018-09-06 08:00:00' /usr/local/mysql/var/mysql-bin.000012>/home/mydata.sql
    导出 sql
    再把 sql 命令行倒回去
    maowenjie
        7
    maowenjie  
    OP
       2018-09-06 15:14:49 +08:00
    看了删除记录
    手残啊
    where id>19232
    变成了 where id>1923
    ruihe
        8
    ruihe  
       2018-09-06 15:16:55 +08:00
    你是不小心删了,我是前两天发现我司有个人删除数据用的是 delete 语句,瞬间无语……
    okjb
        9
    okjb  
       2018-09-06 15:17:55 +08:00 via Android   ❤️ 2
    删库到跑路,我以为一直开玩笑,没想到 v 友果然牛皮
    cncqw
        10
    cncqw  
       2018-09-06 15:20:43 +08:00
    @ruihe

    删除数据不用 delete 语句,你告诉我怎么删,瞬间无语……
    ruihe
        11
    ruihe  
       2018-09-06 15:25:31 +08:00
    @cncqw 难道不是把更新删除字段?
    zzf2017
        12
    zzf2017  
       2018-09-06 15:26:10 +08:00
    @cncqw 他应该是说'软删除'吧。数据不是真的删了,只是改变它的某个表明删除的字段
    calming
        13
    calming  
       2018-09-06 15:55:57 +08:00
    @cncqw 都是逻辑删除了老哥,谁还真的 delete 啊
    poliapo
        14
    poliapo  
       2018-09-06 16:10:34 +08:00
    现在谁还删数据啊 不都是软删除 给字段
    batter
        15
    batter  
       2018-09-06 16:22:34 +08:00
    我一直觉得 delete 是非常脑残的,奈何产品经理是个洁癖,觉得这些应该删除的数据是脏数据,,,,,,,😂😂
    PythonAnswer
        16
    PythonAnswer  
       2018-09-06 16:26:50 +08:00 via iPhone
    除非对文件大小有要求 别删东西啊
    loveCoding
        17
    loveCoding  
       2018-09-06 16:28:23 +08:00
    @cncqw #10 都是逻辑删除啊..
    Rizio
        18
    Rizio  
       2018-09-06 16:32:39 +08:00
    @cncqw 一般是修改某个字段例如 flag,以这个字段判断这行数据是否为删除状态。
    zr8657
        19
    zr8657  
       2018-09-06 16:45:12 +08:00
    2018 还有真删的?
    PerFectTime
        20
    PerFectTime  
       2018-09-06 16:49:30 +08:00
    @cncqw #10 delete_remark 了解一下
    gabezhao
        21
    gabezhao  
       2018-09-06 16:52:06 +08:00
    @ruihe 删除不用 delete 用什么呀???
    infra
        22
    infra  
       2018-09-06 17:00:41 +08:00
    跑路吧,修复不了的
    neutrino
        23
    neutrino  
       2018-09-06 17:02:17 +08:00
    一直真删,不要抱着侥幸心理。
    Raymon111111
        24
    Raymon111111  
       2018-09-06 17:02:53 +08:00
    binlog 重来一次呗
    liuhanghang
        25
    liuhanghang  
       2018-09-06 17:03:55 +08:00
    现在都是软删除吧 is_delete
    zhouren93
        26
    zhouren93  
       2018-09-06 17:09:49 +08:00
    开启 binlog 了么,有的话可以恢复
    luofan004
        27
    luofan004  
       2018-09-06 17:25:03 +08:00
    你们都不看前面楼么,别人楼主已经用 binlog 恢复了,都散了吧。。
    cncqw
        28
    cncqw  
       2018-09-06 17:42:52 +08:00
    软删除只能算更新,跟删除有什么关系?说现在不用物理删除数据的可能只是你们的业务规模太小,当然删不删都无所谓,我做移动广告分析每天产生几千万条数据,你们软删除一个给我试试,真是无语。。
    cncqw
        29
    cncqw  
       2018-09-06 17:53:33 +08:00   ❤️ 3
    我 3 年前做的项目就已经用上 delete_at 字段了,所以我猜楼上那些教我怎么删除的应该都是 phper,怎么讲,一种认为自己很懂但实际很 low 的感觉扑面而来,很符合 php 这门语言的气质
    KgM4gLtF0shViDH3
        30
    KgM4gLtF0shViDH3  
       2018-09-06 18:19:42 +08:00 via iPhone   ❤️ 2
    @cncqw #28 恼羞成怒
    fleam
        31
    fleam  
       2018-09-06 18:21:39 +08:00 via iPhone
    和语言有个毛关系……
    paicha
        32
    paicha  
       2018-09-06 18:23:59 +08:00
    deleted_at
    Rizio
        33
    Rizio  
       2018-09-06 18:25:29 +08:00
    @cncqw 嚯嚯嚯,来了来了
    choice4
        34
    choice4  
       2018-09-06 18:27:05 +08:00   ❤️ 1
    php: 人在家中坐,锅从天上来
    nananqujava
        35
    nananqujava  
       2018-09-06 18:27:14 +08:00
    删除数据不用 delete 语句,一般数据都很少
    liuguang
        36
    liuguang  
       2018-09-06 20:05:10 +08:00
    跑路吧,除非按日志恢复,估计搞死人,drop database 然后跑路。。。
    ballshapesdsd
        37
    ballshapesdsd  
       2018-09-06 20:30:03 +08:00
    @bestkayle #30 人家说的有啥不对
    KgM4gLtF0shViDH3
        38
    KgM4gLtF0shViDH3  
       2018-09-06 20:34:48 +08:00
    又 block 了几个人,好开心
    ericls
        39
    ericls  
       2018-09-06 20:40:06 +08:00
    @zr8657
    @ruihe
    @calming
    @batter
    @loveCoding

    有时候隐私条款会要求真正删除数
    zeraba
        40
    zeraba  
       2018-09-06 21:08:21 +08:00 via Android
    mixed delete 的话 binlog 只记录删除的这一条 sql 你可以看到了,没法从 binlog 恢复 只能从历史备份恢复,之后如果性能没问题,数据又重要还是 row 吧 还有就是多做备份 有备无患
    zhihhh
        41
    zhihhh  
       2018-09-06 21:14:19 +08:00   ❤️ 1
    哈哈上面 show is_delete 的好好笑。忍不住了。
    zcjwxf
        42
    zcjwxf  
       2018-09-07 00:32:13 +08:00
    新当年我也 delete 过一次,还没加 where 那种,幸亏那张表最近没变化
    dearmymy
        43
    dearmymy  
       2018-09-07 00:40:37 +08:00
    之前也删过。还好用阿里云的数据库,有备份
    IllBeBack
        44
    IllBeBack  
       2018-09-07 04:47:34 +08:00
    1. Select * from ...
    2. Delete from ...

    先 select 再 delete,后面都一样,复制粘贴就可以。
    严格按这个顺序,一般不会出问题。
    metrxqin
        45
    metrxqin  
       2018-09-07 06:23:34 +08:00 via iPhone
    根据业务需求来决定只不执行物理删除。
    msg7086
        46
    msg7086  
       2018-09-07 07:51:50 +08:00
    ermmm 人家的明文密码啊信用卡号啊身份证号啊手机号啊这些你们都是永久保存的?
    贵国的程序员真是可怕。
    lcdxiangzi
        47
    lcdxiangzi  
       2018-09-07 08:15:15 +08:00 via Android
    一切抛开业务场景的技术谈论都是瞎比比
    lcdxiangzi
        48
    lcdxiangzi  
       2018-09-07 08:17:46 +08:00 via Android
    上次是存身份证图片,这次是逻辑删除😂
    59php
        49
    59php  
       2018-09-07 08:45:39 +08:00
    在进行数据库操作之前,首先要做的就是备份一下数据
    当然数据库过于巨大的工资的话,应该会有自己的备份机制
    keymao
        50
    keymao  
       2018-09-07 09:01:46 +08:00
    is_delete... 其实还是看数据规模吧 那种每天在线几百人的 数据产出小的 就没所谓了

    数据量大的 不物理删除 等着数据服务器炸掉么...
    wanwaneryide
        51
    wanwaneryide  
       2018-09-07 09:03:32 +08:00
    你需要买一本书:从删库到跑路。(≖ᴗ≖)✧
    leonnew
        52
    leonnew  
       2018-09-07 09:07:05 +08:00
    还恢复啥。。跑路呗
    ccl945
        53
    ccl945  
       2018-09-07 09:12:45 +08:00 via Android
    什么鬼,产品经理管天管地数据库模型也要管,这还干个毛,拿起椅子上
    batter
        54
    batter  
       2018-09-07 09:20:31 +08:00
    @keymao 我不太明白,如果数据量巨大,每天新增上亿的数据量,难道还用数据库来做操作吗?数据库不是作为最后的留存使用吗?不应该是分布式存储,况且我们采集的存储的数据不应该是需要 delete 数据极少数,占比不会超过千分之一甚至十万分之一吧,如果真的需要按照日期删除,难道不应该是按照日期分表,然后去删除表吗?菜鸟一枚,勿喷
    Marmot
        55
    Marmot  
       2018-09-07 09:27:40 +08:00
    做不做物理删除看情况决定吧,说实话,敏感数据,还真没有几个公司是删除了的
    顺便楼上那个炮轰的 php 的,笑死我了,php 真的是人在家中坐,锅从天上来
    liuguang
        56
    liuguang  
       2018-09-07 09:31:24 +08:00
    select * from table where deleted_at is not null;
    jydeng
        57
    jydeng  
       2018-09-07 09:35:42 +08:00
    可以从日志恢复嘛,不是很了解。
    公司用 Oracle,可以从日志恢复。
    nosay
        58
    nosay  
       2018-09-07 09:38:27 +08:00 via iPhone
    @cncqw 稍微翻了一下你以往的回复记录,回复最多的恐怕就是 php 相关的讨论,我猜你可能是一名 phper,至少曾经是的。而你竟然可以把 phper 变成侮辱性词汇,真是讽刺,已 block
    llvm
        59
    llvm  
       2018-09-07 09:54:04 +08:00
    MySQL 有闪回工具
    CoderGeek
        60
    CoderGeek  
       2018-09-07 10:05:52 +08:00
    日志 sql
    weizhen199
        61
    weizhen199  
       2018-09-07 10:48:59 +08:00
    该做 log 备份了
    moregun
        62
    moregun  
       2018-09-07 11:35:27 +08:00
    嗯 命令行是比图形界面方便
    sampeng
        63
    sampeng  
       2018-09-07 12:31:37 +08:00
    恩。相信我。你以后一定在操作删除操作的时候瑟瑟发抖。。

    delete 的时候。一定要加一个 limit。。。
    likuku
        64
    likuku  
       2018-09-07 12:33:18 +08:00 via iPhone
    没有有效的备份,那么请节哀
    gaMe5hGLc86G4U52
        65
    gaMe5hGLc86G4U52  
       2018-09-07 12:38:01 +08:00
    设置个 isDelete 字段,逻辑删除,默认 0,逻辑删除更新值为 1
    zeroliu
        66
    zeroliu  
       2018-09-07 13:39:14 +08:00
    呃 为啥不试试先锁表,然后根据备份搭建主从,然后开启复制 start ...到 delete 之前呢?不过这个情况需要你的备份里面有 binlog file 和 position 信息或者是 gtid 信息吧,还有就是明确的知道你这个 delete 的 position 信息啊
    xiaoyang7545
        67
    xiaoyang7545  
       2018-09-07 13:58:12 +08:00
    逻辑删除还是用 delete 还是需求决定的吧,楼上那些纠结这个的真的可笑啊。而且贴主这个还不一定是在程序环境中,可能是清理数据呢。
    xionghongzhi
        68
    xionghongzhi  
       2018-09-07 14:10:17 +08:00
    @IllBeBack 我一般都是这样用
    xionghongzhi
        69
    xionghongzhi  
       2018-09-07 14:13:06 +08:00
    都是些玻璃心
    di1012
        70
    di1012  
       2018-09-07 14:28:20 +08:00
    sql server 中的 truncate 删除了解下,敢这么用的人一定是和公司有仇的
    killerv
        71
    killerv  
       2018-09-07 14:34:15 +08:00




    @nosay 这个人经历了什么?
    @cncqw
    cnyang
        72
    cnyang  
       2018-09-07 14:49:58 +08:00
    看着楼上各位的逻辑,终于感受到无责任心的公司为啥这么多了
    codebigbang
        73
    codebigbang  
       2020-06-18 19:13:32 +08:00
    抛开业务场景谈技术实现,跟抛开计量谈毒性一样,都是耍流氓。(逃~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5368 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:13 · PVG 16:13 · LAX 00:13 · JFK 03:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.