一次项目数据恢复记录

前言

实验室的师兄师姐好几年前曾经开发了一个类似于在线靶场的项目,用于老板的本科生课程实践部分。这个老项目简单来说的逻辑就是:提供一个 web 界面,用户可以通过这个界面注册登录并加入课程,由课程助教每周发布对应的 CTF 题目,题目由后端启动对应的 docker 容器提供给学生交互,根据题目内容在对应的容器中获取 flag 并提交完成作业。

这个项目大概在 2018 年完成,而后在实验室物理服务器上运行了一段时间,并向本科生提供服务。中间经历过代码重构、网站被攻击、物理服务器宕机、实验室断电等一系列问题后,终于在 2020 年左右迁移到学院与华为云合作的云平台上。本以为在云端的加持下,项目可以平稳运行。没想到在 2023 年 4 月 3 号还是出现了问题...

问题发生

2023 年 4 月 3 日晚上,助教群突然反映服务器 IP 没法正常访问,网站访问为白页,起初以为是正常的服务器抽风,于是在云平台重启云主机,但始终停留在 CentOS 的开机页面。等到 4 号上午助教反应依旧没法正常启动主机,当时就意识到问题的严重性。

这里插一句,因为这个项目实际上没有人维护,之前维护的学姐也只给当时负责制作题目和课程助教的我扔了一个大概 5 GB 的压缩包,里面包含了从项目立项到我入学的所有历史代码和文档,是名副其实的“屎山”。因为是“屎山”加上实验室课题组之间跨度过大,因此没有一个正经的运维人员,数据备份也是随缘进行。

当时让助教联系华为那边的工程师看看他们有什么办法,大概搞了一上午得到的结论是:没有办法。下午被老板一个微信叫到办公室,就开始加入到恢复项目的队伍中。

确定问题

一开始是和助教进行一对一对线,助教负责在中间传递工程师和我的对话。那边的意思是只能恢复文件数据,主机肯定是开不了机了。同时将根目录下的数据全部挂载到另一台主机上,提供了一个 ssh 连接。

仔细分析了一下,由于这个主机上主要保存了四大部分:后端代码、前端代码、数据库中间件、题目 docker 镜像。其中前后端代码在我当助教时因为对这种压缩包版本控制嗤之以鼻,已经 git 存在云端。当时刚入学时需要我们进行题目镜像的制作,因此有一台备用服务器上面有题目 docker 镜像。到目前为止,可以确定的是我们似乎只失去了数据库中的文件。

但是由于工程师将我们的数据进行了恢复,所以情况还是比较乐观的。

那么问题就简化为了:如何从 Unix 文件结构中找到我们需要的 MySQL 的数据,并迁移到另一台可以运行 MySQL 的服务器上?

解决问题

等到确定最终问题已经下午六点了,通过云平台的克隆模式,将备用服务器克隆了一下准备进行尝试。

由于备用服务器使用的 MySQL 版本和主服务器版本一致,这减轻了不少工作量。我的初步猜想是只要找到 MySQL 存储数据的文件夹,直接将里面的内容替换为我们恢复的数据即可。通过查阅资料了解到 MySQL 存储数据的位置在 /var/lib/mysql 目录下。因为仅仅使用 MySQL 而没有分析过 MySQL 目录结构,一度担心 MySQL 会根据不同的服务器对数据进行加密。后来也没细想,直接使用 scp 从工程师提供的 IP 中复制已宕机的服务器中对应的数据,直接进行了替换。

替换后启动 MySQL 一直报错,启动 systemctl start mysqld 提示 Error: 13 (权限不够),想了半天才想到直接梭哈:

chmod 777 /var/lib/mysql

或者可以直接

chown -R mysql /var/lib/mysql

没想到运行起来之后还真的就正常提供服务了。(后面查阅资料后,才感谢备用服务器的 MySQL 表结构和主服务器一致)

将前后端部署到新服务器上后,web 端恢复正常运行,可以正常访问网站。

后记

半夜助教又反馈:访问倒是能访问了,但是学生找到 flag 后提交一直显示答案错误。后来第二天我又一次打开那坨文档,排查错误点,还是没什么不对的地方。算了干脆去查日志,找到了一个没有被任何文档提及的配置,修改后部署,答案正确。

后后记

又过了一天,助教反映:忘记密码模块有问题,学生收不到重置密码的邮件。。。。


一次项目数据恢复记录
http://shijieq.github.io/2023/04/06/Misc/一次项目数据恢复/
Author
ShijieQ
Posted on
April 6, 2023
Licensed under