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)
怎么运行?
谢谢
看起来DELETE实际上是按照你的方式运行的bin-log。因此,更巧合的选项(MySQL 中的错误、不相关导入期间的问题(如果确实不相关))似乎不太可能。
我们有 2 个选择: 1.“授权”但未知,例如,您的代码库中有一个删除方法,但您只是没有找到它,或者具有有效登录名的人运行了命令(您不需要申请删除方法)这本身,但您确实需要访问允许登录数据库的服务器) 2. 未经授权:有人获得了对您系统的访问权限(并进行了清理),或者有人发现了 sql 注入
真的很难说哪一个最有可能。从您所做的检查来看,很难说您的检查有多彻底,但是系统访问(无事故)和代码问题(防止注入)都很难完全找出。另一方面,如果有很多人可以访问该系统,则很难排除这种情况。
如果您确实觉得这种情况可能会再次发生,您可能应该启用通用查询日志。这会给你一些来源的提示。你可以每天检查它并旋转它,这样它就不会变得太大。
如果您的服务器存在偏执级别的问题,您可以尝试将日志保存在外部,只有您有权访问的地方:这将消除任何证据篡改。我自己还不会走那么远。
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |