微软学生俱乐部招新网站删库事故处理记录

如题,我是傻逼。

起因

之前预计能在 17 号上线选组别的功能,但是由于比赛等一系列原因耽误,在 17 号晚上熬了一个通宵把前后端改好了。

改好之后,由于项目体积比较大,服务器上又没有配置 GitHub 加速,于是打算直接去服务器上把代码目录删掉,然后从本地重新上传整个项目代码目录,然后再去服务器端用 docker-compose 重新部署。

但是问题在于我当时是这么配置 docker-compose 的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3'

services:
msc2021:
build: .
...
volumes:
- .data/msc/logs:/var/log/msc <- WARN!
- .:/opt/msc:ro
- /tmp:/tmp
depends_on:
- database
- cache
networks:
...
adminer:
...
database:
image: mariadb:10.6.4
...
environment:
...
volumes:
- .data/mysql:/var/lib/mysql <- WARN!
...
cache:
image: redis:5
restart: always
volumes:
- .data/redis:/data <- WARN!
...
networks:
...

为了管理方便,我把 log 目录,数据目录全部映射到了项目文件夹下的 .data 文件夹。于是部署后的网站目录大概长这样:

1
2
3
4
5
6
7
8
/home/msc/Backend
|- .data
| |- log ...
| |- mysql ...
| ...
|- src
|- docker-compose.yml
|- ...

然后 docker-compose build && docker-compose up -d,把网站跑起来。

在我对代码进行了较多改动之后,我直接删掉了 Backend,当时我还没有反应过来,紧接着往服务器上 push 了改动后的 Backend 目录,但是.data 已经遗失了,所有报名数据全部丢失。

尝试恢复手段

/proc//fd

第一个想到的就是日常删文件之后后悔了,从正在运行的程序 fd 里复制出来。其实如果我只是删掉网站目录但是没有 push 新网站目录的话,恢复到这一步就结束了。但是 push 之后可能把原来文件的 inode 全给覆写掉了,从 fd 里复制出来的 users.ibd 是一个空文件,里面什么也没有。

lsof | grep deleted 获取到了一批被正在运行的程序使用,但是已经删除的目录,在其中找到了 mysql/msc 的部分:(截图是事后截的,系统时间不是案发时间)

image.png

记下了 pid 为 28726

然后在 /proc/28726/fd 下面发现了正在占用的映射文件:(截图是事后截的,系统时间不是案发时间)

image.png

找到了 54 -> '/var/lib/mysql/msc/users.ibd (deleted)',于是将其复制出来,hexdump 一下:

image.png

全是 0,毛都不剩了。

extundelete

这个方法从一开始我就没有抱希望。毕竟删掉之后又写了一大堆文件进去,fd 指向的文件改变就已经说明了 inode 信息丢失,extundelete 有再大神通也找不回来。

绝处逢生

删库之后大概是凌晨四点,我先去招新群里发了个消息,说这短时间内不能报名,然后就叫了 Frank 一起想怎么救回来。把所有的恢复手段全部尝试了一遍之后,没有一个有效的。折腾到凌晨五点,我已经开始犹豫要不要把工作重心转移到如何写检讨上了。但是不管检讨有多么深刻,近 200 人的报名数据丢失,差不多相当于把今年的招新给扬了。

然后我瘫在椅子上想怎么办。

Frank 点开浏览器,点开 Google,在犹豫搜什么。

然后我看到了浏览器上方堆积如麻的标签页,突然想到之前为了偷懒,直接拿了个 adminer 套在数据库上了,如果这堆标签页里碰巧有我之前查看报名信息的页面呢?

然后就找到了,从编号 0 的 admin 到 190 的报名信息,总共 167 条一个不少。

image.png

唯一的问题就是有些人的个人简介太长,adminer 没有把所有的简介都写出来,显示出来的只有半截。

image.png

我直接把页面内容复制了出来,写了个脚本转换成 csv,然后重置网站,导入数据,赶在天亮之前尽力把网站恢复到了原来的样子,然后老老实实的做功能升级。

后记

谢邀,已经对 rm PTSD 了。

还有,我是 sb。

评论

:D 一言句子获取中...