我在 AWS 上使用 percona server 5.7 作为数据库。问题是,有时行会莫名其妙地消失,没有任何线索。我使用 Node.JS 的后端已经从自动增量中插入了 id,但之后,这些行就消失得无影无踪。这种情况只是偶尔发生,但每天都在发生。我应该怎么做才能开始诊断问题?
更多信息:有时我的自动增量会跳过,例如从 1000 到 1004,没有人从 phpmyadmin 或我的脚本中删除它,因为它是“用户”表。在 1000 到 1004 之间的注册时间,mysql 和 nodejs 根本没有错误日志。然而,此时 MySQL 会遇到一些表锁定问题,原因不明,有时会使插入语句成为排队事件,我根本不会进行修改表或任何表级更改。
答案1
您是否使用过 MySQL 事务、AUTO_INCREMENT
和 InnoDB/XtraDB?
你的 Node.js MySQL 驱动程序是否使用了隐式事务?
如果是这样,你可能遇到了 InnoDBAUTO_INCREMENT
序列间隙问题。你可以查看文档这里,简而言之,
在所有锁定模式下 (
innodb_autoinc_lock_mode
= 0、1 和 2),如果生成自动增量值的事务回滚,则这些自动增量值将“丢失”。一旦为自动增量列生成值,无论“INSERT 类”语句是否完成,无论包含该值的事务是否回滚,都无法回滚。这些丢失的值不会被重用。因此,存储在表的 AUTO_INCREMENT 列中的值可能会有间隙。
如果你对删除的行很担心,可以使用general_log
MySQL 配置参数生成查询日志,然后根据缺失的行检查查询日志。请注意,查询日志可能非常大,并且会影响性能。