› 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 · Jul 11, 2022 · 12965 views
    This topic created in 1586 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

    如果 str, regexp 或者 replacement 为 NULL ,REGEXP_REPLACE() 将返回 NULL
    zzvgtiger
    zzvgtiger
    Jul 11, 2022
    30
    同问 你是咋把数据找回来的
    RRRoger
    RRRoger
    Jul 11, 2022
    31
    @philchang1995 regexp_replace 适用于 select 不适用于 update
    xiaoba25
    xiaoba25
    Jul 11, 2022❤️2
    32
    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
    MarkP
    Jul 11, 2022❤️2
    33
    @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
    kaiger
    OP
    Jul 11, 2022
    34
    @MarkP #33

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

    不用下辈子,今天就打。
    Jooooooooo
    Jooooooooo
    Jul 11, 2022❤️16
    39
    都是惨痛教训:

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

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

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

    4. 大规模改库要备份
    MarkP
    MarkP
    Jul 11, 2022
    40
    @kaiger 那也应该用 replace 而不是 regexp_replace
    kaiger
    kaiger
    OP
    Jul 11, 2022
    41
    @MarkP #40

    可能昨天晚上通宵带妹?脑袋不清醒
    aitaii
    aitaii
    Jul 11, 2022❤️1
    42
    有一个能跑就行
    kaiger
    kaiger
    OP
    Jul 11, 2022
    43
    @Jooooooooo #39

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

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

    观自在菩萨,行深般若波罗密多时照见五蕴皆空,度一切苦厄。
    bzsh
    bzsh
    Jul 12, 2022
    75
    抓取的数据啊,没所谓
    someonedeng
    someonedeng
    Jul 13, 2022
    76
    下次先约好黑车,别订飞机火车票
    打开 binlog
    先 select 出来看看
    update 要带条件
    mrochcnnnnn
    mrochcnnnnn
    Aug 31, 2022
    77
    哪天在 v2 上看到一个标题:
    遇到一个问题,想用 regex 来解决,好了你现在遇到两个问题了
    NoahVI
    NoahVI
    Sep 9, 2022
    78
    @wdlth 想问下这种操作开事务有啥用?
    wdlth
    wdlth
    Sep 14, 2022
    79
    @NoahVI 我们的生产批量更新操作是要人工复核的,不会直接执行一条更新语句。
    首先会在一个事务中更新,然后查询,最后会回滚。由另外的人来验证,验证后再让 DBA 进行将回滚改成提交执行,能降低误操作的几率。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2091 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 135ms · UTC 04:52 · PVG 12:52 · LAX 20:52 · JFK 23:52
    ♥ Do have faith in what you're doing.