1、使用ORA_ROWSCN伪列获取表最后的DML时间
默认情况下,每行记录的ORA_ROWSCN是基于数据块(block)的,这样对于某一行最后的DML时间是不准确的,除非在建表的时候执行开启行级跟踪(create table … rowdependencies),这样才会是在行级记录级别的SCN。
而每个数据块(block)在头部是记录了该数据块(block)最近事务的SCN,所以默认情况下,只需要从块的头部直接获取这个值就可以了,不需要其他任何的开销。但是这明显是不精确的,一个数据块(block)中会有很多行记
录,每次事务不可能影响到整个数据块(block)中所有的行,所以这是一个非常不精准的估算值,同一个数据块(block)的所有记录的ORA_ROWSCN都会是相同的。
备注:假如表的数据被TRUNCATE掉或全部DELETE后,也会导致无法定位最后一次DML操作的时间 select max(ora_rowscn), scn_to_timestamp(max(ora_rowscn)) from xxx.xxx; select min(scn) from sys.smon_scn_time; ---最小scn,默认5天。超过记录5天会报ora-08181 eg: select application_number,ora_rowscn from application where application_number=''; select scn_to_timestamp(4364757568) from dual;
2、使用DBA_TAB_MODIFICATIONS来查找
1、表之前没有设置MONITORING属性,那么无法查找最后一次DML操作的时间,设置MONITORING属性后,DBA_TAB_MODIFICATIONS视图里面收集的是这个设置时间点后面的DML操作时间。 2、需要执行EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO后,视图才会有数据。 3、DML操作不提交或回滚,也会记录到视图中。这样就会导致数据不准确。 4、收集完统计信息(ANALYZE或dbms_stats包收集统计信息)后,视图中相关表记录会置空 5、CTAS建立的插入信息不会记录 select owner,table_name,monitoring from dba_tables where owner='test' and table_name='test'; alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"; select inserts,updates,deletes,truncated,timestamp from dba_tab_modifications where table_name='test' and table_owner='test';