今天同事询问是否可以知道某些表是否被增删改过?
对于这个问题,我们特别自然容易想到的解决方法就是使用ORACLE的AUDIT。
其实对于一些只需要知道表是否被增删改的问题“大颗粒”安全性要求,可以使用一个我们平常不曾注意的一个建表属性MONITORING。
对于ORACLE中表的“成堆”属性,一般情况下,在建表时我们会经常使用ORACLE的默认参数。而MONITORING这个参数也经常会默认一把,非默认时使用NOMONITORING参数。
其实这个参数可以轻松解决我同事的这个需求。
一旦使用这个参数建立表并且ORACLE完成了对该表的统计信息采集后,就会在DBA[ALL/USER]_TAB_MODIFICATIONS表中记录该表被修改的信息了!
其中记录了该表或表的PARTITION的INSERT/UPDATE/DELETE/DROP_SEGMENTS/TRUNCAE的次数。但要注意的一 点就是:INSERT/UPDATE/DELETE只能记录一个大概次数。而不是十分精确的次数。以下为ORACLE官方文档提供的 DBA_TAB_MODIFICATIONS字段及其说明。
还有需要注意的重要一点,出于保护ORACLE数据库性能方面的考虑,在XXX_TAB_MODIFICATIONS表中显示的数据并不是实时的数据,如果需要看到最近发生的最新数据,可以使用DBMS_STAT包来统计最新变化。
如:SQL> exec dbms_stats.flush_database_monitoring_info;
PL/SQL procedure successfully completed
================小发现
ORACLE官方10.2版本的文档(Part Number B14237-02)在描述表结构时和实际的10.2版本数据库中的DBA_TAB_MODIFICATIONS不完全相同,少记录了一个叫做 TRUNCATED的字段,用来记录该表被TRUNCATED的次数。
对于这个问题,我们特别自然容易想到的解决方法就是使用ORACLE的AUDIT。
其实对于一些只需要知道表是否被增删改的问题“大颗粒”安全性要求,可以使用一个我们平常不曾注意的一个建表属性MONITORING。
对于ORACLE中表的“成堆”属性,一般情况下,在建表时我们会经常使用ORACLE的默认参数。而MONITORING这个参数也经常会默认一把,非默认时使用NOMONITORING参数。
其实这个参数可以轻松解决我同事的这个需求。
一旦使用这个参数建立表并且ORACLE完成了对该表的统计信息采集后,就会在DBA[ALL/USER]_TAB_MODIFICATIONS表中记录该表被修改的信息了!
其中记录了该表或表的PARTITION的INSERT/UPDATE/DELETE/DROP_SEGMENTS/TRUNCAE的次数。但要注意的一 点就是:INSERT/UPDATE/DELETE只能记录一个大概次数。而不是十分精确的次数。以下为ORACLE官方文档提供的 DBA_TAB_MODIFICATIONS字段及其说明。
TABLE_OWNER Owner of the modified table.
TABLE_NAME Name of the modified table
PARTITION_NAME Name of the modified partition
SUBPARTITION_NAME Name of the modified subpartition
INSERTS NUMBER Approximate number of inserts since the
last time statistics were gathered
UPDATES NUMBER Approximate number of updates since the
last time statistics were gathered
DELETES NUMBER Approximate number of deletes since the
last time statistics were gathered
TIMESTAMP DATE Indicates the last time the table was modified
DROP_SEGMENTS Number of partition and subpartition segments
dropped since the last analyze
TABLE_NAME Name of the modified table
PARTITION_NAME Name of the modified partition
SUBPARTITION_NAME Name of the modified subpartition
INSERTS NUMBER Approximate number of inserts since the
last time statistics were gathered
UPDATES NUMBER Approximate number of updates since the
last time statistics were gathered
DELETES NUMBER Approximate number of deletes since the
last time statistics were gathered
TIMESTAMP DATE Indicates the last time the table was modified
DROP_SEGMENTS Number of partition and subpartition segments
dropped since the last analyze
还有需要注意的重要一点,出于保护ORACLE数据库性能方面的考虑,在XXX_TAB_MODIFICATIONS表中显示的数据并不是实时的数据,如果需要看到最近发生的最新数据,可以使用DBMS_STAT包来统计最新变化。
如:SQL> exec dbms_stats.flush_database_monitoring_info;
PL/SQL procedure successfully completed
================小发现
ORACLE官方10.2版本的文档(Part Number B14237-02)在描述表结构时和实际的10.2版本数据库中的DBA_TAB_MODIFICATIONS不完全相同,少记录了一个叫做 TRUNCATED的字段,用来记录该表被TRUNCATED的次数。
同时,也“难能可贵”的出现了拼写错误将DBMS_STAT写成了DIMS_STATS
,让我还以为是个新的系统管理包。-:)
本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/54132如需转载请自行联系原作者
Larry.Yue