1. Oracle 12c SQL执行监控全攻略
在Oracle数据库运维中,实时监控SQL执行情况是性能调优和故障排查的基础技能。当系统出现性能瓶颈时,DBA需要快速定位问题SQL;当应用出现异常时,开发人员需要确认程序实际执行的SQL语句。本文将详细介绍Oracle 12c环境下查看历史SQL和实时SQL的完整方案,包含7种实用方法和14个实战技巧。
2. 核心监控视图解析
2.1 V$SQL与V$SQLAREA深度对比
这两个视图是监控SQL执行的基石,但设计目的不同:
- V$SQL:存储所有共享池中的SQL语句及其执行统计信息
- V$SQLAREA:聚合相同SQL语句的统计信息(忽略大小写和空格差异)
关键字段说明:
SELECT sql_id, -- SQL唯一标识符 executions, -- 执行次数 elapsed_time, -- 总耗时(微秒) cpu_time, -- CPU耗时 disk_reads, -- 物理读 buffer_gets, -- 逻辑读 rows_processed, -- 处理行数 sql_text -- SQL文本(前1000字符) FROM v$sql WHERE last_active_time > SYSDATE-1/24; -- 最近1小时注意:v$sqltext存储完整SQL文本,当sql_text截断时需关联此视图
2.2 V$SESSION与V$SQLSTATS联动查询
实时监控会话执行的SQL:
SELECT s.sid, s.serial#, s.username, s.machine, q.sql_id, q.sql_text, q.executions, q.elapsed_time/1000000 "Elapsed(s)" FROM v$session s JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.status = 'ACTIVE' AND s.type != 'BACKGROUND';典型输出分析:
- 高ELAPSED_TIME但低EXECUTIONS:可能为长事务或阻塞操作
- 高DISK_READS:可能缺少合适索引
- 高BUFFER_GETS:可能存在全表扫描
3. 历史SQL查询方案
3.1 AWR报告深度解析
AWR(Automatic Workload Repository)是Oracle提供的性能诊断工具,包含SQL执行历史:
- 生成AWR报告:
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_text( l_dbid => (SELECT dbid FROM v$database), l_inst_num => (SELECT instance_number FROM v$instance), l_bid => (SELECT min(snap_id)-1 FROM dba_hist_snapshot WHERE begin_interval_time > SYSDATE-1), l_eid => (SELECT max(snap_id) FROM dba_hist_snapshot) ));- 关键章节解读:
- SQL ordered by Elapsed Time
- SQL ordered by CPU Time
- SQL ordered by Gets
3.2 ASH(Active Session History)实时分析
ASH每秒采样活动会话信息,保留时间通常为1小时:
SELECT sample_time, session_id, sql_id, event, wait_time, time_waited FROM v$active_session_history WHERE sample_time > SYSDATE-1/24 ORDER BY sample_time DESC;4. 高级监控技巧
4.1 SQL Trace与TKPROF实战
- 开启10046事件跟踪:
-- 会话级跟踪 ALTER SESSION SET tracefile_identifier = 'my_trace'; ALTER SESSION SET events '10046 trace name context forever, level 12'; -- 对指定会话跟踪 EXEC DBMS_MONITOR.session_trace_enable(session_id=>123, serial_num=>456, waits=>TRUE, binds=>TRUE);- 使用TKPROF解析跟踪文件:
tkprof ora_12345_my_trace.trc output.txt sys=no sort=prsela,exeela,fchela4.2 实时SQL监控(Real-Time SQL Monitoring)
Oracle 11g引入的功能,对长时间运行的SQL自动监控:
SELECT dbms_sqltune.report_sql_monitor( sql_id => 'g8uxf5abfz7v9', type => 'TEXT', report_level => 'ALL') FROM dual;5. 性能优化实战案例
5.1 定位高负载SQL
SELECT sql_id, executions, round(elapsed_time/1000000,2) "总耗时(s)", round(elapsed_time/decode(executions,0,1,executions)/1000000,4) "单次耗时(s)", round(buffer_gets/decode(executions,0,1,executions),2) "逻辑读/次", round(disk_reads/decode(executions,0,1,executions),2) "物理读/次", sql_text FROM ( SELECT * FROM v$sqlarea ORDER BY buffer_gets DESC ) WHERE rownum <= 10;5.2 识别低效执行计划
SELECT p.sql_id, p.child_number, p.plan_hash_value, p.object_name, p.options, p.cost, p.cardinality FROM v$sql_plan p WHERE p.sql_id = 'g8uxf5abfz7v9' ORDER BY p.id;6. 监控脚本集锦
6.1 实时监控脚本
SELECT s.sid, s.serial#, s.status, s.username, s.osuser, s.machine, s.program, s.module, s.action, q.sql_id, substr(q.sql_text,1,100) sql_text, q.executions, q.elapsed_time/1000000 "elapsed(s)", q.cpu_time/1000000 "cpu(s)", q.disk_reads, q.buffer_gets FROM v$session s LEFT JOIN v$sql q ON s.sql_id = q.sql_id WHERE s.type = 'USER' ORDER BY q.elapsed_time DESC NULLS LAST;6.2 历史SQL分析脚本
SELECT h.sql_id, h.disk_reads_total, h.buffer_gets_total, h.elapsed_time_total/1000000 "elapsed(s)", s.sql_text FROM dba_hist_sqlstat h JOIN dba_hist_sqltext s ON h.sql_id = s.sql_id WHERE h.snap_id BETWEEN &begin_snap AND &end_snap ORDER BY h.disk_reads_total DESC FETCH FIRST 20 ROWS ONLY;7. 常见问题排查
7.1 SQL文本截断问题
当SQL_TEXT被截断时,使用DBMS_LOB获取完整SQL:
SELECT sql_id, dbms_lob.substr(sql_fulltext, 4000, 1) as full_text FROM v$sqlarea WHERE sql_id = 'g8uxf5abfz7v9';7.2 共享池刷新导致SQL丢失
配置AWR保留策略确保历史SQL不丢失:
-- 修改AWR保留时间(默认8天) EXEC DBMS_WORKLOAD_REPOSITORY.modify_snapshot_settings( retention => 43200, -- 分钟(30天) interval => 60); -- 快照间隔(分钟)8. 安全审计方案
8.1 细粒度审计(FGA)
监控特定表的SELECT操作:
BEGIN DBMS_FGA.add_policy( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'AUDIT_EMP_SALARY', audit_condition => 'SALARY > 10000', audit_column => 'SALARY', handler_schema => NULL, handler_module => NULL, enable => TRUE, statement_types => 'SELECT'); END; /查询审计结果:
SELECT timestamp, db_user, os_user, sql_text FROM dba_fga_audit_trail ORDER BY timestamp DESC;9. 性能监控视图维护
9.1 统计信息收集策略
-- 自动统计信息收集 BEGIN DBMS_AUTO_TASK_ADMIN.enable( client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL); END; / -- 手动收集统计信息 EXEC DBMS_STATS.gather_schema_stats('SCOTT');9.2 AWR基线管理
创建性能基线:
BEGIN DBMS_WORKLOAD_REPOSITORY.create_baseline( start_snap_id => 1234, end_snap_id => 1235, baseline_name => 'Peak Load Baseline', expiration => NULL); END; /10. 云环境特别注意事项
在Oracle Cloud和Exadata环境中,监控需额外关注:
- IORM资源管理对SQL执行的影响
- Smart Scan卸载的SQL语句
- 存储节点资源使用情况
-- 检查资源管理器配置 SELECT * FROM dba_rsrc_plans; SELECT * FROM v$rsrc_consumer_group_stats; -- Exadata特定监控 SELECT * FROM v$sqlstats WHERE io_cell_offload_eligible > 0;