5年后,几行从myql innoDB表中消失了

BeA*_*AsT 8 mysql database innodb

我在InnoDB上有几个DDBB(MySQL 5.5.7.-FreeBSD).5年来我没有任何问题.我意识到定期检查表,优化,......

神秘的是,其中一个数据库的表从70(DELETE!)丢失了20行.几年前插入了这些行.它们之间没有关系(随机ID).这是一张非常小的桌子.

经过几个小时的研究(谷歌),我没有找到原因.我通过上次备份恢复了信息.

我检查了:

WEB APP:

1)应用程序没有DELETE语句,只有SELECT或UPDATE.

2)没有DELETE ON CASCADE,没有外键.

2)受保护的SQL INJECT.

3)没有应用程序管理表(如phpMysqlAdmin).

4)我的应用程序日志没有显示在这些时间内攻击或访问的尝试.

MYSQL:

1)所有行的验证都是在mysql控制台中直接进行的,不使用APP.

2)mysqlcheck:受影响的表中没有错误.

3)Mysqldump:没有转储消失的行,只剩下剩余的行.

4)错误日志:没有注册错误.

5)table.idb文件不包含丢失的记录,只包含剩余的行.

6)mysql用户只能在本地访问(通过IP).

服务器:

1)任何人都访问过服务器.

2)HDD或控制器上没有发生错误.

3)我没有在系统日志中看到事件.

显然一切都是正确的.我不知道发生了什么.

我想到两个选择:

1)MySQL 5.5.7中的一个错误???

2)在记录丢失的几小时内,我正在进行(在不同数据库中)百万INSERT和DELETE的导入.我不认为这个激烈的进程已经损坏(没有跟踪)另一个数据库中的另一个表.

我很担心它是否会再次发生!

谢谢!

更新1 @pala_建议我查阅bin-log(我没看过!).

在bin-log 20中查询着名的DELETE!

我粘贴bin-log:

(...)
BEGIN
/*!*/;
# at 83069675
# at 83069772
# at 83070746
# at 83071672
# at 83072677
#150505 12:29:18 server id 168291  end_log_pos 83069772         Table_map: `affected_database`.`affected_table` mapped to number 583255
#150505 12:29:18 server id 168291  end_log_pos 83070746         Delete_rows: table id 583255
#150505 12:29:18 server id 168291  end_log_pos 83071672         Delete_rows: table id 583255
#150505 12:29:18 server id 168291  end_log_pos 83072677         Delete_rows: table id 583255
#150505 12:29:18 server id 168291  end_log_pos 83073123         Delete_rows: table id 583255 flags: STMT_END_F
### DELETE FROM affected_database.affected_table
### WHERE
###   @1=xxxxxxx
###   @2=xxxxxxxx
###   @3=xxxxxxxxxx
###   @4=xxxxxxxxx
###   @5=xxxxxxxxx
###   @6=xxxxxxxxx
###   @7=xxxxxxxxxx
###   @8=xxxxxxxxx
###   @9=xxxxxxxxxx
###   @10=xxxxxxxxxxxx
###   @11=xxxxxxxxxxx
###   @12=xxxxxxxxxxx
###   @13=xxxxxxxxxxx
###   @14=xxxxxxxxxxx
###   @15=xxxxxxxxxxx
###   @16=xxxxxxxxxxx
###   @17=xxxxxxxxxxx
###   @18=xxxxxxxxxxx
###   @19=xxxxxxxxxxx
###   @20=xxxxxxxxxxx
###   @21=xxxxxxxxxxx
###   @22=xxxxxxxxxxx
###   @23=xxxxxxxxxxx
###   @24=xxxxxxxxxxx
### DELETE FROM affected_database.affected_table
### WHERE
(...) x20
Run Code Online (Sandbox Code Playgroud)

怎么运行?

谢谢

Nan*_*nne 1

看起来DELETE实际上是按照你的方式运行的bin-log。因此,更巧合的选项(MySQL 中的错误、不相关导入期间的问题(如果确实不相关))似乎不太可能。

我们有 2 个选择: 1.“授权”但未知,例如,您的代码库中有一个删除方法,但您只是没有找到它,或者具有有效登录名的人运行了命令(您不需要申请删除方法)这本身,但您确实需要访问允许登录数据库的服务器) 2. 未经授权:有人获得了对您系统的访问权限(并进行了清理),或者有人发现了 sql 注入

真的很难说哪一个最有可能。从您所做的检查来看,很难说您的检查有多彻底,但是系统访问(无事故)和代码问题(防止注入)都很难完全找出。另一方面,如果有很多人可以访问该系统,则很难排除这种情况。

如果您确实觉得这种情况可能会再次发生,您可能应该启用通用查询日志。这会给你一些来源的提示。你可以每天检查它并旋转它,这样它就不会变得太大。

如果您的服务器存在偏执级别的问题,您可以尝试将日志保存在外部,只有您有权访问的地方:这将消除任何证据篡改。我自己还不会走那么远。