数据库有些数据值为: "保密"
前面我在用 regex_replace 函数更新一些不规范数据
我顺手就用 update lawyers set working_years=regexp_replace(working_years, "保密", null);
把 "保密" 更新为 null
结果 working_years 字段全部被更新为 null !!!
有办法恢复吗,大佬救命!!!
1
winterx 2022-07-11 16:31:46 +08:00 25
手机叫个快车,赶紧收拾东西跑路
|
2
GeorgeGalway 2022-07-11 16:34:09 +08:00
有备份的话回档吧
|
3
hidemyself 2022-07-11 16:35:23 +08:00
DBA 呢,准备背锅吧。。
|
4
jjianwen68 2022-07-11 16:35:24 +08:00
生产库?
|
5
skies457 2022-07-11 16:35:36 +08:00
提桶跑路
|
6
lujiaosama 2022-07-11 16:35:46 +08:00
呼叫 dba 恢复数据
|
7
kaiger OP |
8
milkmlik 2022-07-11 16:36:06 +08:00 3
不要慌不要慌太阳下山有月光。
|
9
quicksand 2022-07-11 16:36:15 +08:00
赶紧找数据库日志,看看能不能恢复
|
10
dem0ns 2022-07-11 16:36:33 +08:00
用不规范的操作更新不规范的数据 =.=
|
11
lovedoing 2022-07-11 16:36:41 +08:00
备份没有,binlog 也没有?
|
12
rapperx2 2022-07-11 16:37:06 +08:00
赶紧躺进棺材里,盖好!
|
13
iAndychan 2022-07-11 16:37:19 +08:00
op 人还在吗?
|
14
lambdaq 2022-07-11 16:38:22 +08:00 14
mysql 的 update 有一个很强的非标准特性,就是可以加 limit 。初学者请务必每次 update 请务必用 limit 1 。
|
15
muchenlou 2022-07-11 16:39:02 +08:00 5
从入门到删库,别紧张,要不,先全部修改成保密?
|
16
PMR 2022-07-11 16:39:43 +08:00 via Android
开事务日志 /binlog 没
没就抗拒从严 回家过年 |
17
fy1206 2022-07-11 16:41:23 +08:00
备份没有的话 就看 binlog 开了没有 开了就可以解决(记好时间点), 没有开的话....
|
18
yyysuo 2022-07-11 16:41:53 +08:00
oracle 的话找 dba 按归档恢复一下应该就可以了,生产库的话,事故是跑不了了,不要拖,赶紧上报吧。
|
19
jackliang007 2022-07-11 16:43:30 +08:00
联系主管恢复到上一个备份
|
20
dreasky 2022-07-11 16:46:55 +08:00
自首吧
|
21
hs444 2022-07-11 16:47:32 +08:00
之前在生产环境也干过这种事,但用的不是 mysql ,操作时事务也是手动提交的,一瞬间汗都要下来了,然后回滚了
|
22
ikaros 2022-07-11 16:48:53 +08:00
再把 null 更新成保密啊, 问题不大, 反正应该也没人知道哪些保密 哪些 null
|
23
danhahaha 2022-07-11 16:49:23 +08:00 via iPhone
保密不就是 null 的意思吗
|
24
kaiger OP 解决了,想问一下大佬
update lawyers set working_years=regexp_replace(working_years, "保密", null) 这条命令为什么会把我的全部数据替换为 null ' |
25
F12 2022-07-11 16:51:21 +08:00
还能上 v2 上找解决方案,应该问题不大
|
26
wzly 2022-07-11 16:52:48 +08:00
先不要操作了,看下 data 目录下的 binlog 日志文件吧,以 utf8 打开,一个一个补数据吧
|
27
geekershared 2022-07-11 16:54:13 +08:00
@kaiger 怎么解决的,目测你是没有加 where working_years = "保密"。
|
28
hay313955795 2022-07-11 16:54:44 +08:00
@kaiger 楼主是怎么解决的呢?
|
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 |
30
philchang1995 2022-07-11 16:57:08 +08:00
同问 你是咋把数据找回来的
|
31
RRRoger 2022-07-11 16:58:07 +08:00
@philchang1995 regexp_replace 适用于 select 不适用于 update
|
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. |
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 了。 |
34
kaiger OP |
35
MoYi123 2022-07-11 17:06:53 +08:00
下辈子改数据库前记得先打 begin;
|
39
Jooooooooo 2022-07-11 17:11:06 +08:00 16
都是惨痛教训:
1. 不是迫不得已不要手动改库 2. 真的要手动改库一定先 select 一下看看影响的行数 3. 改之前先改一条试试看, 防止写错了 4. 大规模改库要备份 |
42
aitaii 2022-07-11 17:17:36 +08:00 1
有一个能跑就行
|
43
kaiger OP |
44
Ufo666 2022-07-11 17:21:28 +08:00
怎么解决的!哇
|
45
fmumu 2022-07-11 17:24:20 +08:00
生产环境改数据一定要备份再执行,开日志
|
46
cubecube 2022-07-11 17:24:33 +08:00
这种 update 或者 delete 都还好,都有 log ,dba 都能恢复
truncate 或者 drop 那种很难抢救回来(只能依靠之前的备份数据,会有丢失) |
47
neptuno 2022-07-11 17:25:51 +08:00
测试数据库都不测一下的吗?
|
49
james2013 2022-07-11 17:26:48 +08:00
跑路了?
|
50
vinceall 2022-07-11 17:27:02 +08:00
update 不加 where dba 能让你跑?
|
52
shalk 2022-07-11 17:27:28 +08:00
怎么解决的,提了几个桶
|
54
toneewang 2022-07-11 17:29:32 +08:00
通过 binlog 可以回滚的吧,就是恢复成本的事情
|
55
TAFMT 2022-07-11 17:31:33 +08:00
最后怎么恢复数据的?+1
|
56
book1925 2022-07-11 17:33:25 +08:00
事情怎么解决的?严重关注
|
57
controller 2022-07-11 17:53:08 +08:00
改错数据库后端程序员必经之路。如果改错的是关键数据,只能停掉相关服务,防止错上加错,然后从备份和 binlog 恢复。如果不是关键数据,还能从业务逻辑里面重新搞到数据
|
58
winglight2016 2022-07-11 17:57:25 +08:00
如果数据库是云平台上的 rds ,那就简单了。。。自建的就要靠自己定时备份了
|
59
yeyypp92 2022-07-11 22:27:32 +08:00 1
一般这种更新,最好还是先 select 出来,确定下,再更新
|
60
coolloves 2022-07-11 22:36:37 +08:00
有 binlog 为啥不能恢复呢,直接 binlong 反向操作下就好了
|
61
WIN2333 2022-07-11 22:45:10 +08:00
任何数据修复都必须先备份
|
62
wdlth 2022-07-11 22:47:09 +08:00
你这 SQL 在我们 DBA 眼里肯定被打回,没有开事务,连 WHERE 也没有。
我们 UPDATE 生产库都得走 OA ,要两层审核,DBA 复核,并且会在一个部分克隆表中验证。 |
63
potatowish 2022-07-11 23:23:41 +08:00 via iPhone
@yeyypp92 非常同意,我一般都是先写查询语句,确定查询没问题了,再改写成更新语句,现在其他环境执行没问题了,再提交生产
|
64
jack778 2022-07-12 09:03:05 +08:00
你没有责任,这是公司的责任,因为公司允许你这个菜鸟直接更新生成数据库,狗头
|
65
scanjx 2022-07-12 09:11:40 +08:00
人和数据库有一个能跑就好
|
66
di1012 2022-07-12 09:31:49 +08:00
不加 where 条件就敢操作数据库
|
67
fiht 2022-07-12 09:40:18 +08:00
我也做过类似的事情 ahh~
不过公司上云之后就很方便了,云上的 MySQL 基本都能通过回滚救过来 |
68
James369 2022-07-12 09:48:33 +08:00
没啥事发生?看来这些用户数据没什么价值
|
69
funbox 2022-07-12 10:28:22 +08:00
职业生涯终结
|
70
skadi 2022-07-12 10:34:18 +08:00
binlog
|
71
qwerthhusn 2022-07-12 11:37:51 +08:00
缅甸急招工,来吗?
|
72
badmarillo 2022-07-12 14:34:17 +08:00
信女愿一生吃素保佑下辈子不做程序员
|
73
jiazhoulvke 2022-07-12 14:50:05 +08:00
有 binlog 怕啥,只要用的 binlog format 是 row ,改了什么都能看得到,写个脚本都能复原回来
|
74
kaiger OP |
75
bzsh 2022-07-12 15:17:54 +08:00
抓取的数据啊,没所谓
|
76
someonedeng 2022-07-13 15:24:14 +08:00
下次先约好黑车,别订飞机火车票
打开 binlog 先 select 出来看看 update 要带条件 |
77
mrochcnnnnn 2022-08-31 13:17:57 +08:00
哪天在 v2 上看到一个标题:
遇到一个问题,想用 regex 来解决,好了你现在遇到两个问题了 |