information_schema.TABLES 不更新

【 使用环境 】测试环境

【 使用版本 】Server version: 5.7.25 OceanBase_CE 4.3.5.2 (r102000112025051418-f481a33c42054b0944ae0e9926651b550157e467) (Built May 14 2025 18:45:56)

【问题描述】向数据表 test 中插入、修改、删除表记录后, information_schema.TABLES 中的相关记录未更新。当 truncate test 表后,information_schema.TABLES 中的 UPDATE_TIME 更新为了最新时间。 预期增删改记录后 TABLES 表也应该更新,

截图上传总是失败,复现流程为:

  1. 创建表 test:
    CREATE TABLE test(id int);

  2. 查询 select * from information_schema.TABLES where TABLE_NAME = ‘test’;

  3. 向 test1 表写入数据

  4. 查询 select * from information_schema.TABLES where TABLE_NAME = ‘test’;
    结果与第 2 步的结果相同, UPDATE_TIME 时间未更新【预期应该更新】

  5. truncate test1

  6. 查询 select * from information_schema.TABLES where TABLE_NAME = ‘test’;
    此时 UPDATE_TIME 字段值被更新为最新值。

2 个赞


mysql 和ob不同的版本 可能有不同的差异。

3 个赞

这是碰到bug了吗

应该就是 DDL 肯定会更新这个字段, 比如 create_time 或者 update_time 等。

mysql 测试了几个

  1. DDL 会更新 create_time字段
  2. update_time字段 一直是 NULL的 。 跟写入 data file有关系

官方解释

1 个赞

好的,谢谢。目前使用的 mariadb,应该是跟 mysql 的行为不完全一致。看官方文档对该字段的描述也不同

mariadb:

1 个赞

oceanbase 有其他类似 information_schema.TABLES.UPDATE_TIME 的表/字段来查看数据表的 最后一次增删改时间么。
或者是有其他手段来监听数据表的变更么?

DDL操作UPDATE_TIME会推高:但是drop table 如果进入回收站 回收站的被删除的表没有清理 也会推高;如果被清理了该记录会被删除; DROP TABLE table_name PURGE;不进入回收站 该记录会被删除
dml操作UPDATE_TIME不会推高

1 个赞

@Giant @淇铭
mysql 的行为取决于 information_schema_stats_expiry 变量的值,当该值为 0 的时候, INSERT 操作是会更新 UPDATE_TIME 字段的。

而根据 oceanbase 文档中的说法,该变量在 oceanbase 中并不生效。
我测试了下,在 oceanbase 中修改此变量也的确没有效果,

这是否是一个兼容性问题?

由于不允许新用户上传多个图片,我会分多次回复贴上相关截图。

1 个赞

在 mysql 中的复现流程

1 个赞

mysql 的一个关于更新 UPDATE_TIME 字段的回复:https://bugs.mysql.com/bug.php?id=95407

information_schema_stats_expiry 变量的官方文档说明:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry

1 个赞

测试的表是 innodb 引擎

1 个赞

文档也有介绍 没有实际的功能 只是兼容这个变量

1 个赞

所以目前来看 oceanbase 在这部分是没有兼容 mysql,不支持通过 information_schema.TABLES 的 UPDATE_TIME 字段来查询表最后一次数据变更时间的。

那么是否有其他手段来获取表的最后一次数据变更时间?

1 个赞

文档也有介绍 没有实际的功能 只是兼容这个变量

目前业务应用中 不需要这个字段来判断啊

  1. 所有业务表中 有 update_time字段 类型为 default current_time,每次进行任何操作都能通过这个行上的时间进行判断

一般会自己增加create_time字段,代表记录的创建时间

###########################
您可以看下 oceanbase的数据字典表 ,几乎都有这两个相似的字段

1 个赞

目前ob确实是这样的 如果想捕捉到dml操作的记录时间 你可以自己写个触发器 修改的时候触发

1 个赞

查业务数据表 max(update_time) 不太合适,在要判断的表比较多的时候比较麻烦,表数据量大的话还得建索引。不如直接从 information_schema.TABLE 查询方便。

多谢解答,确认 oceanbase 不支持的话,我就找其他方式来搞了。

1 个赞

好的,多谢。

1 个赞

:fist: :fist: :fist: :fist: :fist: