2014年7月14日,我接到站务部长的通知,说有人反应论坛登录不上。我就去登陆了一下。现象主要如下:
- 论坛首页可以访问。
- 进入校内门户,再进入论坛登录界面,可以读取到用户信息
- 登录,提示成功登录。
- 返回到论坛首页,发现问题了,没有读到用户。这个时候还可以访问,时间大概是13点。
接着我去找原因。
我先试了下进网站的后台,发现没有问题,可以进入。也可以审核用户。顺手就审核了用户。用大号在后台看了下管理员后台登录和操作,10号的时候lwcjjpw这个用户登录了后台。奇怪了,这个不是以前的老人的号么?大概到了14点的时候。主页访问不了了。
SELECT p.*, m.uid, m.username, m.groupid, m.adminid, m.regdate, m.lastactivity, m.posts, m.threads, m.digestposts, m.oltime,
m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5, m.extcredits6,
m.extcredits7, m.extcredits8, m.email, m.gender, m.showemail, m.invisible, mf.nickname, mf.site,
mf.icq, mf.qq, mf.yahoo, mf.msn, mf.taobao, mf.alipay, mf.location, mf.medals,
mf.sightml AS signature, mf.customstatus, mf.spacename , mf.field_2
FROM [Table]posts p
LEFT JOIN [Table]members m ON m.uid=p.authorid
LEFT JOIN [Table]memberfields mf ON mf.uid=m.uid
WHERE p.tid=’344231’ AND p.invisible=’0’ ORDER BY dateline LIMIT 0, 20
这个是提示信息。
数据库中少了张表。
好好的不可能少张表啊,没有人闲着没事去删除你的表啊。于是我就去数据库服务器上看了下现存的表有没有members,找到了一张site_members这个是网站的用户表,还有张uc_members这个是ucenter的吧。论坛的数据库中表前缀是bbs,找了一圈,没有找到应该有的bbs_members。问题很严重了。用户表没有了。
难道是db的连接文件上写错了?上ftp看个究竟。找了半天,汗。都写的是members。说明不是文件上有人改了,而是真的数据库出问题了。
找了下以前写论坛的师兄帮忙,说明了下情况。
师兄说,后台日志看到10号的时候,服务器上有文件修改记录。但是引发这个错误的原因,他也不清楚。
当时我的猜想是论坛和网站用的用户表是一张表,然后论坛的用记表是动态的,会在服务器启动时触发事务,然后创建已经登录用户的表,然后把他们的数据加进来。所以我就向老师申请了重启服务器。
最后就是一天时间的漫长等待。
师兄最后给的结论是:由于管理员误操作,导致论坛数据库中用户表被误删除。
由于和网站用的是同一个用户群体,他对数据做了最大程度上的恢复。
这是对此次故障的处理办法。丢失了数据,真是不应该。作为线上最高管理,居然发生了这种事。我很难想象开学来了用户看到自己数据全没有的心情。
可是这次事件致使我写下这篇文档的原因不只是这个。更是让我难以理解的,是怎么会丢失表。以下几点比较难以理解:
- 现在留下的几个人里,知道ftp密码的人就我和站务部长,其他人都不知道论坛的ftp的密码的。也就是说,能通过ftp来看到网站源文件的,进而看到数据库密码和地址的人,也就我和他。而他怎么会懂数据库的东西。而我在10号到14号的时候因为自己有事,一直没有看论坛,一个连前台都没有登录的人,不可能是我误操作了吧。
- 如果是站务部的人在后台操作的时候不小心删除的。但是站务部的只能做到删除用户,不能删除表。你就算是全部把用户删除了,表还是在的吧。这就是可疑的第二点。
- Lwcjjpw以前主席干的?我去查了下他的账号,普通用户组,奇怪,普通用户组没有后台登录的权限,他是怎么登录的?再说,他是以前的主席,站务部长,怎么可能会去删除论坛的表?
- 知道服务器ftp的除了我们,应该还有网站的人了,这么多年都没有事,也不会是他们做的吧。
- 还有一点,就是注入了。有人注入,然后删除表,破坏数据。可是这个要怎么去证明呢?要查数据库的日志,可是我没有办法去查。暂且留意下这个。
- 最后一点就是我最疑惑的地方。
记住这个时间,是6月,6月的运行记录里就出现了有表不存在的错误。
而第一次出现members这张表不存在的记录在7月2号就发生了。
7月11号的时候就可以正常登录,7月2号表不存在的错误就已经有了。这是为什么?而且,在7月出现了一个实体重复的错误。这个错误是怎么引起的?
同时在我写日志的今天。也就是2014年7月18日星期五也出现了这个表不存在的错误。不是在15号的时候就已经修复了吗?为什么到现在还是有这个错误存在?
难以琢磨。我的推测是写论坛的时候,师兄还是个学生,开发的时候做的不是很严谨,存在逻辑上的错误。虽然在以前没有体现出来,但是由于去年换了登录方式,结果现在的错误就体现出来了。这里的问题是:为什么一年以后才会体现出来?奇怪。我问了下师兄,他在工作,也没有时间回我,他估计是觉得能运行就可以了,但是我不能这样,下次要是还出现这种情况怎么办?
至于原因,我暂时没有想明白。要想知道是怎么发生的,只能查数据库的日志,但是这个真的不现实。我只能现在记录下最近发生的这些,以备后来故障时做参考。
Mdcici.Yan 2014年7月18日