[英]Cannot find last modification date for a table in Oracle SQL
我的数据库中有两个表,我正在尝试使用 Oracle 12DB 中的“SCN_TO_TIMESTAMP(MAX(ora_rowscn))”和“dba_tab_modifications”获取最后一个 DML(插入、更新或删除时间戳)。
以下是两张表的信息:
Table Name | Create Date | Last DML | SCN_TO_TIMESTAMP(MAX(ora_rowscn))
| |(as given from user)|
-----------+-------------+--------------------+-----------------------------------
Table1 | 25 SEP 2017 | 13 OCT 2020 |ORA-08181: specified number is not a valid system change number
| | |ORA-06512: at "SYS.SCN_TO_TIMESTAMP"
Table2 | 30 JAN 2017 | 29 OCT 2020
结果如下:
Table Name | SCN_TO_TIMESTAMP(MAX(ora_rowscn)) |dba/all_tab_modifications
-----------+--------------------------------------+-------------------------
Table1 |ORA-08181: specified number is not a | NULL (0 row returned)
| valid system change number |
|ORA-06512: at "SYS.SCN_TO_TIMESTAMP" |
Table2 |29/OCT/20 03:40:15.000000000 AM | 29/OCT/20 03:50:52
来自 dba/all_tab_modifications 的最早日期:
02/10/18 22:00:02
谁能告诉我为什么我无法获得 Table1 的最后一个 DML,但我可以为 Table2 获得它?
我想按照其他博客的建议执行“DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO”。 但是,我的问题是如果第二个表的 DML 已被监控,它应该已经被刷新。
两个表都在同一用户 ID 下的不同存储过程中更新。
任何人都可以分享我如何获得第一个表的最后一个 DML 的想法吗? 提前致谢!
实际上,如果您需要此信息,则需要将其存储在表中、使用审计或执行其他操作来捕获更改(即填充修改表的触发器)。
max(ORA_ROWSCN)
将为您提供修改的最后一个 SCN(请注意,默认情况下,这存储在块级别而不是行级别,因此具有max(ora_rowscn)
行不一定是最近修改的)。 但是 Oracle 只在有限的时间内维护 SCN 到时间戳的映射。 在文档中,Oracle 保证它将维护映射 120 小时(5 天)。 如果上次修改是在几天前, scn_to_timestamp
将不再起作用。 如果您的系统具有相对恒定的 SCN 生成率,您可以尝试构建自己的函数来生成近似时间戳,但这可能会产生明显的不准确性。
优化器使用dba_tab_modifications
来识别需要收集新统计信息的表,以便数据更加短暂。 如果您每晚都启用统计信息收集,您会期望每晚都会删除有关某些表的信息,具体取决于哪些表收集了新的统计信息。 另外,时间戳不是为了准确识别底层表被修改的时间,而是 Oracle 写入监控信息的时间。
如果这是你需要继续做的事情,你可以
如果您真的确定,假设数据库处于archivelog
模式并且您拥有自上次修改每个表以来的所有归档日志文件,您可以使用 LogMiner 读取每个归档日志并找到上次修改的时间戳。 但这会非常慢,并且取决于您的备份策略,允许您将旧日志文件恢复到上次更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.