首页   注册   登录
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
拉钩
V2EX  ›  MySQL

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

  •  
  •   maowenjie · 97 天前 · 5736 次点击
    这是一个创建于 97 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    72 回复  |  直到 2018-09-07 14:49:58 +08:00
        1
    opengps   97 天前
    无论能不能恢复,现在第一时间要做的事是完整备份一下,然后抓紧用备份恢复的数据库研究
        2
    sbmzhcn   97 天前
    先把现场备份,然后再准备恢复尝试,如果失败了,还能还原。如果是 VPS 可以把整个 VPS 备份下。 一定要先备份再操作。
        3
    maowenjie   97 天前
    目前数据都导出备份了
        4
    lcorange   97 天前
    看看有没有历史的备份点,数据库备份,硬盘快照什么任何的备份点。
    然后从那个时间点开始捋所有 binlog,然后在备份点的库上,重跑到目前为止所有 binlog 的 sql
        5
    Perterually   97 天前
    删除之前先 select 查看一下。。。
        6
    maowenjie   97 天前
    已经恢复了
    数据库前几天建的 中午操作删除的
    所以直接把前几天到中午的数据重新恢复遍
    把数据库删了 然后
    /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 命令行倒回去
        7
    maowenjie   97 天前
    看了删除记录
    手残啊
    where id>19232
    变成了 where id>1923
        8
    ruihe   97 天前
    你是不小心删了,我是前两天发现我司有个人删除数据用的是 delete 语句,瞬间无语……
        9
    okjb   97 天前 via Android   ♥ 2
    删库到跑路,我以为一直开玩笑,没想到 v 友果然牛皮
        10
    cncqw   97 天前
    @ruihe

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

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

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

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

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




    @nosay 这个人经历了什么?
    @cncqw
        72
    cnyang   96 天前
    看着楼上各位的逻辑,终于感受到无责任心的公司为啥这么多了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2437 人在线   最高记录 4019   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 29ms · UTC 12:46 · PVG 20:46 · LAX 04:46 · JFK 07:46
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1