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
kaiger
V2EX  ›  MySQL

公司数据库数据被我更新成 null 了,救命!

  •  2
     
  •   kaiger · 2022-07-11 16:30:58 +08:00 · 11212 次点击
    这是一个创建于 858 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库有些数据值为: "保密"

    前面我在用 regex_replace 函数更新一些不规范数据

    我顺手就用 update lawyers set working_years=regexp_replace(working_years, "保密", null); 把 "保密" 更新为 null

    结果 working_years 字段全部被更新为 null !!!

    有办法恢复吗,大佬救命!!!

    第 1 条附言  ·  2022-07-11 17:07:56 +08:00
    数据没找回来,但事情解决了 [dog]
    第 2 条附言  ·  2022-07-11 17:44:38 +08:00
    1. 大哥们,数据没找回来,事情解决了是因为数据是实时抓取的数据,每天都要从互联网某些网站抓取更新,所以并不是很重要。
    2. 对于这种状况有解决办法的大佬欢迎指点(没备份,开了 binlog )
    79 条回复    2022-09-14 21:22:02 +08:00
    winterx
        1
    winterx  
       2022-07-11 16:31:46 +08:00   ❤️ 25
    手机叫个快车,赶紧收拾东西跑路
    GeorgeGalway
        2
    GeorgeGalway  
       2022-07-11 16:34:09 +08:00
    有备份的话回档吧
    hidemyself
        3
    hidemyself  
       2022-07-11 16:35:23 +08:00
    DBA 呢,准备背锅吧。。
    jjianwen68
        4
    jjianwen68  
       2022-07-11 16:35:24 +08:00
    生产库?
    skies457
        5
    skies457  
       2022-07-11 16:35:36 +08:00
    提桶跑路
    lujiaosama
        6
    lujiaosama  
       2022-07-11 16:35:46 +08:00
    呼叫 dba 恢复数据
    kaiger
        7
    kaiger  
    OP
       2022-07-11 16:35:58 +08:00
    @GeorgeGalway #2

    没备份咋办
    milkmlik
        8
    milkmlik  
       2022-07-11 16:36:06 +08:00   ❤️ 3
    不要慌不要慌太阳下山有月光。
    quicksand
        9
    quicksand  
       2022-07-11 16:36:15 +08:00
    赶紧找数据库日志,看看能不能恢复
    dem0ns
        10
    dem0ns  
       2022-07-11 16:36:33 +08:00
    用不规范的操作更新不规范的数据 =.=
    lovedoing
        11
    lovedoing  
       2022-07-11 16:36:41 +08:00
    备份没有,binlog 也没有?
    rapperx2
        12
    rapperx2  
       2022-07-11 16:37:06 +08:00
    赶紧躺进棺材里,盖好!
    iAndychan
        13
    iAndychan  
       2022-07-11 16:37:19 +08:00
    op 人还在吗?
    lambdaq
        14
    lambdaq  
       2022-07-11 16:38:22 +08:00   ❤️ 14
    mysql 的 update 有一个很强的非标准特性,就是可以加 limit 。初学者请务必每次 update 请务必用 limit 1 。
    muchenlou
        15
    muchenlou  
       2022-07-11 16:39:02 +08:00   ❤️ 5
    从入门到删库,别紧张,要不,先全部修改成保密?
    PMR
        16
    PMR  
       2022-07-11 16:39:43 +08:00 via Android
    开事务日志 /binlog 没

    没就抗拒从严 回家过年
    fy1206
        17
    fy1206  
       2022-07-11 16:41:23 +08:00
    备份没有的话 就看 binlog 开了没有 开了就可以解决(记好时间点), 没有开的话....
    yyysuo
        18
    yyysuo  
       2022-07-11 16:41:53 +08:00
    oracle 的话找 dba 按归档恢复一下应该就可以了,生产库的话,事故是跑不了了,不要拖,赶紧上报吧。
    jackliang007
        19
    jackliang007  
       2022-07-11 16:43:30 +08:00
    联系主管恢复到上一个备份
    dreasky
        20
    dreasky  
       2022-07-11 16:46:55 +08:00
    自首吧
    hs444
        21
    hs444  
       2022-07-11 16:47:32 +08:00
    之前在生产环境也干过这种事,但用的不是 mysql ,操作时事务也是手动提交的,一瞬间汗都要下来了,然后回滚了
    ikaros
        22
    ikaros  
       2022-07-11 16:48:53 +08:00
    再把 null 更新成保密啊, 问题不大, 反正应该也没人知道哪些保密 哪些 null
    danhahaha
        23
    danhahaha  
       2022-07-11 16:49:23 +08:00 via iPhone
    保密不就是 null 的意思吗
    kaiger
        24
    kaiger  
    OP
       2022-07-11 16:51:16 +08:00
    解决了,想问一下大佬

    update lawyers set working_years=regexp_replace(working_years, "保密", null)

    这条命令为什么会把我的全部数据替换为 null
    '
    F12
        25
    F12  
       2022-07-11 16:51:21 +08:00
    还能上 v2 上找解决方案,应该问题不大
    wzly
        26
    wzly  
       2022-07-11 16:52:48 +08:00
    先不要操作了,看下 data 目录下的 binlog 日志文件吧,以 utf8 打开,一个一个补数据吧
    geekershared
        27
    geekershared  
       2022-07-11 16:54:13 +08:00
    @kaiger 怎么解决的,目测你是没有加 where working_years = "保密"。
    hay313955795
        28
    hay313955795  
       2022-07-11 16:54:44 +08:00
    @kaiger 楼主是怎么解决的呢?
    philchang1995
        29
    philchang1995  
       2022-07-11 16:56:32 +08:00   ❤️ 1
    @kaiger #24 REGEXP_REPLACE() 函数在 str 中使用 replacement 替换和正则表达式 regexp 匹配的内容,并返回替换后的结果。

    如果 str, regexp 或者 replacement 为 NULL ,REGEXP_REPLACE() 将返回 NULL
    philchang1995
        30
    philchang1995  
       2022-07-11 16:57:08 +08:00
    同问 你是咋把数据找回来的
    RRRoger
        31
    RRRoger  
       2022-07-11 16:58:07 +08:00
    @philchang1995 regexp_replace 适用于 select 不适用于 update
    leiuu
        32
    leiuu  
       2022-07-11 16:58:30 +08:00   ❤️ 2
    https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-replace

    If expr, pat, or repl is NULL, the return value is NULL.
    MarkP
        33
    MarkP  
       2022-07-11 17:04:01 +08:00   ❤️ 2
    @kaiger #24 把保密更改为 null ,为什么要用 regexp_replace 这个正则函数?

    正常思路难道不是这样吗?
    update lawyers set working_years=null where regexp_replace='保密';


    至于为什么换替换为 null ,根据文档 https://dev.mysql.com/doc/refman/8.0/en/regexp.html

    Replaces occurrences in the string expr that match the regular expression specified by the pattern pat with the replacement string repl, and returns the resulting string. If expr, pat, or repl is NULL, the return value is NULL.

    大概意思正则匹配到了,则返回替换后的结果字符串,如果给定的三个参数里有 null ,则返回 null 。
    而你的第三个参数恰好是 null ,所以全被替换成 null 了。
    kaiger
        34
    kaiger  
    OP
       2022-07-11 17:06:12 +08:00
    @MarkP #33

    我前面用的 regex_replace 函数,我懒得重新写 sql 语句,就直接在上一条语句上修改了
    MoYi123
        35
    MoYi123  
       2022-07-11 17:06:53 +08:00
    下辈子改数据库前记得先打 begin;
    MarkP
        36
    MarkP  
       2022-07-11 17:08:03 +08:00
    @RRRoger update 也适用 update ,之前搬一个老项目的数据库,我常用。
    ixinshang
        37
    ixinshang  
       2022-07-11 17:08:40 +08:00
    @lambdaq 多谢分享
    kaiger
        38
    kaiger  
    OP
       2022-07-11 17:08:52 +08:00
    @MoYi123 #35

    不用下辈子,今天就打。
    Jooooooooo
        39
    Jooooooooo  
       2022-07-11 17:11:06 +08:00   ❤️ 16
    都是惨痛教训:

    1. 不是迫不得已不要手动改库

    2. 真的要手动改库一定先 select 一下看看影响的行数

    3. 改之前先改一条试试看, 防止写错了

    4. 大规模改库要备份
    MarkP
        40
    MarkP  
       2022-07-11 17:13:57 +08:00
    @kaiger 那也应该用 replace 而不是 regexp_replace
    kaiger
        41
    kaiger  
    OP
       2022-07-11 17:15:35 +08:00
    @MarkP #40

    可能昨天晚上通宵带妹?脑袋不清醒
    aitaii
        42
    aitaii  
       2022-07-11 17:17:36 +08:00   ❤️ 1
    有一个能跑就行
    kaiger
        43
    kaiger  
    OP
       2022-07-11 17:19:10 +08:00
    @Jooooooooo #39

    谢谢分享经验
    Ufo666
        44
    Ufo666  
       2022-07-11 17:21:28 +08:00
    怎么解决的!哇
    fmumu
        45
    fmumu  
       2022-07-11 17:24:20 +08:00
    生产环境改数据一定要备份再执行,开日志
    cubecube
        46
    cubecube  
       2022-07-11 17:24:33 +08:00
    这种 update 或者 delete 都还好,都有 log ,dba 都能恢复

    truncate 或者 drop 那种很难抢救回来(只能依靠之前的备份数据,会有丢失)
    neptuno
        47
    neptuno  
       2022-07-11 17:25:51 +08:00
    测试数据库都不测一下的吗?
    novolunt
        48
    novolunt  
       2022-07-11 17:26:38 +08:00
    @aitaii 哈哈哈哈哈哈哈
    两个都跑不掉怎么办
    james2013
        49
    james2013  
       2022-07-11 17:26:48 +08:00
    跑路了?
    vinceall
        50
    vinceall  
       2022-07-11 17:27:02 +08:00
    update 不加 where dba 能让你跑?
    MarkP
        51
    MarkP  
       2022-07-11 17:27:27 +08:00
    @MarkP 才发现 where 字段名字复制错了
    shalk
        52
    shalk  
       2022-07-11 17:27:28 +08:00
    怎么解决的,提了几个桶
    Zerek
        53
    Zerek  
       2022-07-11 17:28:07 +08:00
    @kaiger
    最后怎么恢复数据的?
    toneewang
        54
    toneewang  
       2022-07-11 17:29:32 +08:00
    通过 binlog 可以回滚的吧,就是恢复成本的事情
    TAFMT
        55
    TAFMT  
       2022-07-11 17:31:33 +08:00
    最后怎么恢复数据的?+1
    book1925
        56
    book1925  
       2022-07-11 17:33:25 +08:00
    事情怎么解决的?严重关注
    controller
        57
    controller  
       2022-07-11 17:53:08 +08:00
    改错数据库后端程序员必经之路。如果改错的是关键数据,只能停掉相关服务,防止错上加错,然后从备份和 binlog 恢复。如果不是关键数据,还能从业务逻辑里面重新搞到数据
    winglight2016
        58
    winglight2016  
       2022-07-11 17:57:25 +08:00
    如果数据库是云平台上的 rds ,那就简单了。。。自建的就要靠自己定时备份了
    yeyypp92
        59
    yeyypp92  
       2022-07-11 22:27:32 +08:00   ❤️ 1
    一般这种更新,最好还是先 select 出来,确定下,再更新
    coolloves
        60
    coolloves  
       2022-07-11 22:36:37 +08:00
    有 binlog 为啥不能恢复呢,直接 binlong 反向操作下就好了
    WIN2333
        61
    WIN2333  
       2022-07-11 22:45:10 +08:00
    任何数据修复都必须先备份
    wdlth
        62
    wdlth  
       2022-07-11 22:47:09 +08:00
    你这 SQL 在我们 DBA 眼里肯定被打回,没有开事务,连 WHERE 也没有。
    我们 UPDATE 生产库都得走 OA ,要两层审核,DBA 复核,并且会在一个部分克隆表中验证。
    potatowish
        63
    potatowish  
       2022-07-11 23:23:41 +08:00 via iPhone
    @yeyypp92 非常同意,我一般都是先写查询语句,确定查询没问题了,再改写成更新语句,现在其他环境执行没问题了,再提交生产
    jack778
        64
    jack778  
       2022-07-12 09:03:05 +08:00
    你没有责任,这是公司的责任,因为公司允许你这个菜鸟直接更新生成数据库,狗头
    scanjx
        65
    scanjx  
       2022-07-12 09:11:40 +08:00
    人和数据库有一个能跑就好
    di1012
        66
    di1012  
       2022-07-12 09:31:49 +08:00
    不加 where 条件就敢操作数据库
    fiht
        67
    fiht  
       2022-07-12 09:40:18 +08:00
    我也做过类似的事情 ahh~
    不过公司上云之后就很方便了,云上的 MySQL 基本都能通过回滚救过来
    James369
        68
    James369  
       2022-07-12 09:48:33 +08:00
    没啥事发生?看来这些用户数据没什么价值
    funbox
        69
    funbox  
       2022-07-12 10:28:22 +08:00
    职业生涯终结
    skadi
        70
    skadi  
       2022-07-12 10:34:18 +08:00
    binlog
    qwerthhusn
        71
    qwerthhusn  
       2022-07-12 11:37:51 +08:00
    缅甸急招工,来吗?
    badmarillo
        72
    badmarillo  
       2022-07-12 14:34:17 +08:00
    信女愿一生吃素保佑下辈子不做程序员
    jiazhoulvke
        73
    jiazhoulvke  
       2022-07-12 14:50:05 +08:00
    有 binlog 怕啥,只要用的 binlog format 是 row ,改了什么都能看得到,写个脚本都能复原回来
    kaiger
        74
    kaiger  
    OP
       2022-07-12 15:10:46 +08:00
    @badmarillo #72

    观自在菩萨,行深般若波罗密多时照见五蕴皆空,度一切苦厄。
    bzsh
        75
    bzsh  
       2022-07-12 15:17:54 +08:00
    抓取的数据啊,没所谓
    someonedeng
        76
    someonedeng  
       2022-07-13 15:24:14 +08:00
    下次先约好黑车,别订飞机火车票
    打开 binlog
    先 select 出来看看
    update 要带条件
    mrochcnnnnn
        77
    mrochcnnnnn  
       2022-08-31 13:17:57 +08:00
    哪天在 v2 上看到一个标题:
    遇到一个问题,想用 regex 来解决,好了你现在遇到两个问题了
    NoahVI
        78
    NoahVI  
       2022-09-09 15:31:28 +08:00
    @wdlth 想问下这种操作开事务有啥用?
    wdlth
        79
    wdlth  
       2022-09-14 21:22:02 +08:00
    @NoahVI 我们的生产批量更新操作是要人工复核的,不会直接执行一条更新语句。
    首先会在一个事务中更新,然后查询,最后会回滚。由另外的人来验证,验证后再让 DBA 进行将回滚改成提交执行,能降低误操作的几率。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2834 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:53 · PVG 14:53 · LAX 22:53 · JFK 01:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.