如何在Oracle SQL Developer中查询近期被增删改的表?
找出Oracle中近期有DML操作的表
你当前用的all_objects.last_ddl_time记录的是**表结构变更(DDL)**的时间(比如CREATE TABLE、ALTER TABLE),和数据增删改(DML:INSERT/UPDATE/DELETE)无关,所以得用以下几种方法:
方法1:用USER_TAB_MODIFICATIONS视图
这个视图会记录表的DML操作统计,包括最后修改时间,但依赖Oracle的监控数据,默认可能延迟,需要手动刷新:
查询语句
SELECT owner, table_name, inserts, updates, deletes, last_modified FROM all_tab_modifications WHERE owner = 'DB_NAME' AND (inserts > 0 OR updates > 0 OR deletes > 0) ORDER BY last_modified DESC;
注意事项
如果结果不实时,先执行以下语句刷新监控数据(需要对应权限):
EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
方法2:用AWR(自动工作负载库)查询历史DML
如果数据库开启了AWR,可以查近几天的历史SQL记录,定位有DML操作的表:
SELECT DISTINCT obj.owner, obj.object_name FROM dba_hist_sqltext st JOIN dba_hist_sql_plan sp ON st.sql_id = sp.sql_id JOIN dba_objects obj ON sp.object_id = obj.object_id WHERE (st.sql_text LIKE '%INSERT INTO%' OR st.sql_text LIKE '%UPDATE%' OR st.sql_text LIKE '%DELETE FROM%') AND obj.owner = 'DB_NAME' AND sp.timestamp > SYSDATE - 7 -- 调整为你需要的时间范围,比如近7天 ORDER BY obj.object_name;
注意事项
- 需要有访问
DBA_HIST_*系列视图的权限 - AWR默认保留8天数据,保留时长可配置
方法3:启用审计长期跟踪
如果需要长期监控DML操作,建议开启Oracle审计:
开启审计
AUDIT INSERT, UPDATE, DELETE ON DB_NAME.* BY ACCESS;
(前提是数据库已开启审计功能,初始化参数AUDIT_TRAIL需设置为DB或DB_EXTENDED)
查询审计记录
SELECT obj$owner, obj$name, action_name, timestamp FROM dba_audit_trail WHERE obj$owner = 'DB_NAME' AND action_name IN ('INSERT', 'UPDATE', 'DELETE') ORDER BY timestamp DESC;
方法4:用ASH查看近期活跃DML
如果要找最近1小时内的活跃DML操作表,可以用活动会话历史:
SELECT DISTINCT obj.owner, obj.object_name FROM v$active_session_history ash JOIN dba_objects obj ON ash.current_obj# = obj.object_id WHERE ash.sql_opname IN ('INSERT', 'UPDATE', 'DELETE') AND obj.owner = 'DB_NAME' AND ash.sample_time > SYSDATE - 1 -- 调整时间范围,比如近1天 ORDER BY obj.object_name;
注意事项
- 需要访问
V$ACTIVE_SESSION_HISTORY的权限 - ASH默认保留约1小时数据,具体时长取决于数据库配置
内容的提问来源于stack exchange,提问作者hkay
相关产品推荐
相关产品推荐

