【问题标题】:After 5 years, several rows disappeared from mySQL innoDB table5 年后,几行从 mySQL innoDB 表中消失了
【发布时间】:2015-05-07 10:29:02
【问题描述】:

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

神秘的是,其中一个数据库的表从 70 行中丢失了 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

它是如何运行的?

谢谢

【问题讨论】:

  • sql-server 是与 mysql 不同的数据库 - 如果不需要,请不要标记它。您是否启用了二进制日志记录?如果是这样,请检查是否通过查询实际删除了行
  • 你很快!我正在编辑以删除标记,因为我看到提到 Microsoft SQL Server。谢谢!
  • 请记住,REPLACE INTO 语句可能会在与新值replace-into-think-twice 冲突时删除行,请提供表的结构(如果有)。
  • 我用 bin-log 更新了帖子。奇怪的是,DELETE 查询显示。
  • 你查看过general_log吗?

标签: mysql database innodb


【解决方案1】:

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

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

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

如果你真的觉得这可能会再次发生,你应该启用general query log。这会给你一个来源的提示。您可以每天查看并旋转它,以免它变得太大。

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

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多