如何确定 MySQL 表中的特定列是否曾经被选择或显式更新或插入或在 WHERE 子句中引用?如果我也能确定正在使用该列的数据库用户,那就太好了。
这是在 MySQL 5.0 上,但我可以将其移至 5.6 或 5.7。
背景: 我正在维护一个带有 AUTOINCREMENT 字段 ( "id"
) 的遗留应用程序,该字段将在该应用程序停用之前可预见地达到其最大 INT 值。
我怀疑,但不知道,实际上根本没有人在 SQL 中引用这个字段。理想情况下,我会“监视”该列一两个星期,如果它没有出现在任何查询中,我会将它变成 BIGINT 或放弃它以支持自然键。如果该列确实出现在某人的查询中,我将需要跟踪那个人并协调更改。
注意间隔
如果 id 有很多差距,让我给你第三个选择......
“用完 id 值”的一个重要原因是在
AUTO_INCREMENT
值中留下间隙的查询。未插入行的INSERT
语句首先分配一个 auto-inc 值,然后无法使用它。INSERT IGNORE
会默默地做这件事。有时,一个有用的解决方法是更改代码,使其在不会
INSERT
成功时不执行。规范化可能是这种情况的正常情况。 下面是一种避免该问题的批量归一化技术。(好吧,如果你不能找到源代码,这个建议就没有用了。但它可能对其他读者有用;它救了我几次。)
一般日志
通过打开“通用日志”一段时间,您可以收集所有查询。然后你可以搜索表或“id”等,这将是繁琐的。它不是 100% 安全的,因为在此期间可能没有执行某些查询。
innodb_autoinc_lock_mode
innodb_autoinc_lock_mode
直到 5.5 才存在,所以这不是一个选项。(再次,我向其他读者提及这一点。)