查询以检查在 oracle 中的 table 上完成的最后一个 DML 的日期和时间
Query to Check date and time of Last DML done on a table in oracle
根据要求,我需要在搜索时以完整模式捕获表中的最后一个 DML 操作,我注意到两个资源
资源 1
https://dba.stackexchange.com/questions/115062/how-to-get-a-last-dml-operation-in-oracle-10g-11g
资源 2
https://oraclebykkbakshi.blogspot.com/2018/04/check-date-and-time-of-last-dml-done-on.html
在上面我已经尝试使用这两个查询
查询 1 - DBA_TAB_MODIFICATIONS
SELECT TABLE_OWNER,TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP AS LAST_CHANGE
FROM DBA_TAB_MODIFICATIONS
WHERE TO_CHAR(TIMESTAMP,'DD.MM.YYYY') = TO_CHAR(sysdate,'DD.MM.YYYY')
and table_owner='SCHEMA_NAME'
and table_name in ('MY LIST OF TABLES')
结果 - 它只获取了只获取了几个表的结果
Query2 - 非常慢
select max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM 'MY LIST OF TABLES'
如果我使用查询 2 检查任何表,我会收到以下错误
错误查询 2
ORA-08181: specified number is not a valid system change number
ORA-06512: at "SYS.SCN_TO_TIMESTAMP", line 1
08181. 00000 - "specified number is not a valid system change number"
*Cause: supplied scn was beyond the bounds of a valid scn.
*Action: use a valid scn.
如何一次检查所有表,因为如果我需要使用查询 2,我如何在一个查询中列出多个表?
所以我的问题是要搜索的正确查询是什么?
或任何其他更好的查找方法,有什么建议吗?
根据建议我尝试了运行查询
SELECT *
FROM 'TABLE_NAME' t
MINUS
SELECT *
FROM 'TABLE_NAME'
AS OF timestamp systimestamp - interval '1' day t
AS OF timestamp systimestamp - 间隔“1”天 t - 我必须在此处使用的值是多少?
你可能会用到
AUDIT
单个模式的子句,例如 hr
AUDIT ALL BY hr BY ACCESS;
AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY hr BY ACCESS;
以管理员身份连接到 SYS 后,以捕获 DML。
或,或者您可以创建
- 一些数据库会触发一些所需的 tables,您需要跟踪其中的
DML 数据,以便在自定义创建的新文件中保留日志
table(s).
或为当前位置查询之前处理过的数据,可以用
闪回查询有
AS OF timestamp systimestamp - INTERVAL '<int>' [year|month|day|hour|minute|second]
个人 table 的语法
SELECT *
FROM tab t
WHERE t.id = :v_id
MINUS
SELECT *
FROM tab
AS OF timestamp systimestamp - interval '1' day t
WHERE t.id = :v_id;
哪returns前一天的数据相同
hour:minute:second 结合当前时间提供
undo_retention 数据库参数的值足以容纳
过去某个时间点的数据。 (对于这种情况,值应该
至少 86400(秒)
根据要求,我需要在搜索时以完整模式捕获表中的最后一个 DML 操作,我注意到两个资源
资源 1 https://dba.stackexchange.com/questions/115062/how-to-get-a-last-dml-operation-in-oracle-10g-11g
资源 2 https://oraclebykkbakshi.blogspot.com/2018/04/check-date-and-time-of-last-dml-done-on.html
在上面我已经尝试使用这两个查询
查询 1 - DBA_TAB_MODIFICATIONS
SELECT TABLE_OWNER,TABLE_NAME,INSERTS,UPDATES,DELETES,TIMESTAMP AS LAST_CHANGE
FROM DBA_TAB_MODIFICATIONS
WHERE TO_CHAR(TIMESTAMP,'DD.MM.YYYY') = TO_CHAR(sysdate,'DD.MM.YYYY')
and table_owner='SCHEMA_NAME'
and table_name in ('MY LIST OF TABLES')
结果 - 它只获取了只获取了几个表的结果
Query2 - 非常慢
select max(ora_rowscn),SCN_TO_TIMESTAMP(max(ora_rowscn)) FROM 'MY LIST OF TABLES'
如果我使用查询 2 检查任何表,我会收到以下错误
错误查询 2
ORA-08181: specified number is not a valid system change number
ORA-06512: at "SYS.SCN_TO_TIMESTAMP", line 1
08181. 00000 - "specified number is not a valid system change number"
*Cause: supplied scn was beyond the bounds of a valid scn.
*Action: use a valid scn.
如何一次检查所有表,因为如果我需要使用查询 2,我如何在一个查询中列出多个表?
所以我的问题是要搜索的正确查询是什么?
或任何其他更好的查找方法,有什么建议吗?
根据建议我尝试了运行查询
SELECT *
FROM 'TABLE_NAME' t
MINUS
SELECT *
FROM 'TABLE_NAME'
AS OF timestamp systimestamp - interval '1' day t
AS OF timestamp systimestamp - 间隔“1”天 t - 我必须在此处使用的值是多少?
你可能会用到
AUDIT
单个模式的子句,例如hr
AUDIT ALL BY hr BY ACCESS; AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY hr BY ACCESS;
以管理员身份连接到 SYS 后,以捕获 DML。
或,或者您可以创建
- 一些数据库会触发一些所需的 tables,您需要跟踪其中的 DML 数据,以便在自定义创建的新文件中保留日志 table(s).
或为当前位置查询之前处理过的数据,可以用
闪回查询有
AS OF timestamp systimestamp - INTERVAL '<int>' [year|month|day|hour|minute|second]
个人 table 的语法SELECT * FROM tab t WHERE t.id = :v_id MINUS SELECT * FROM tab AS OF timestamp systimestamp - interval '1' day t WHERE t.id = :v_id;
哪returns前一天的数据相同 hour:minute:second 结合当前时间提供 undo_retention 数据库参数的值足以容纳 过去某个时间点的数据。 (对于这种情况,值应该 至少 86400(秒)