Skip to content

Oracle 监控诊断命令

性能监控命令

系统级监控

命令类型示例命令说明
查看实例状态SELECT instance_name, status, database_status FROM v$instance;查看数据库实例状态
查看数据库版本SELECT * FROM v$version;查看数据库版本信息
查看数据库启动时间SELECT startup_time FROM v$instance;查看数据库启动时间
查看数据库负载SELECT * FROM v$sysmetric WHERE metric_name IN ('CPU Usage Per Sec', 'User Calls Per Sec') AND group_id = 2;查看数据库CPU使用率和用户调用率
查看会话数SELECT COUNT(*) FROM v$session;查看当前数据库会话总数
查看活跃会话数SELECT COUNT(*) FROM v$session WHERE status = 'ACTIVE';查看当前活跃会话数
查看等待事件SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY COUNT(*) DESC;查看数据库中主要等待事件
查看锁信息SELECT * FROM v$lock WHERE block = 1;查看阻塞其他会话的锁

内存监控

命令类型示例命令说明
查看SGA配置SELECT * FROM v$sga_dynamic_components;查看SGA动态组件配置
查看SGA使用情况SELECT * FROM v$sga_resize_ops;查看SGA组件调整历史
查看PGA使用情况SELECT * FROM v$pga_target_advice;查看PGA目标建议
查看共享池使用情况SELECT * FROM v$shared_pool_reserved;查看共享池保留区域使用情况
查看库缓存命中率SELECT SUM(pins) "Total Pins", SUM(reloads) "Total Reloads", ROUND((SUM(pins) - SUM(reloads))/SUM(pins)*100, 2) "Hit Ratio" FROM v$librarycache;计算库缓存命中率
查看字典缓存命中率SELECT SUM(gets) "Total Gets", SUM(getmisses) "Total Get Misses", ROUND((SUM(gets) - SUM(getmisses))/SUM(gets)*100, 2) "Hit Ratio" FROM v$rowcache;计算字典缓存命中率

I/O监控

命令类型示例命令说明
查看数据文件I/OSELECT file_name, phyrds, phywrts, phyblkrd, phyblkwrt FROM v$filestat fs JOIN dba_data_files df ON fs.file# = df.file_id ORDER BY phyrds + phywrts DESC;查看数据文件的I/O统计
查看表空间I/OSELECT ts.name "Tablespace", SUM(fs.phyrds) "Reads", SUM(fs.phywrts) "Writes" FROM v$filestat fs JOIN v$datafile df ON fs.file# = df.file# JOIN v$tablespace ts ON df.ts# = ts.ts# GROUP BY ts.name ORDER BY SUM(fs.phyrds + fs.phywrts) DESC;查看表空间的I/O统计
查看I/O等待事件SELECT event, total_waits, time_waited FROM v$system_event WHERE event LIKE '%I/O%' ORDER BY time_waited DESC;查看I/O相关的等待事件
查看数据库文件位置SELECT name FROM v$datafile UNION ALL SELECT name FROM v$controlfile UNION ALL SELECT member FROM v$logfile;查看所有数据库文件的位置

SQL性能监控

命令类型示例命令说明
查看长时间运行的SQLSELECT s.sid, s.serial#, s.username, s.machine, s.program, ROUND(elapsed_seconds/60, 2) minutes_running, sql_text FROM v$session_longops l, v$sql s WHERE l.sql_id = s.sql_id AND elapsed_seconds > 60 ORDER BY elapsed_seconds DESC;查看运行时间超过60秒的SQL
查看消耗资源最多的SQLSELECT * FROM v$sqlstats ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY;查看CPU消耗最多的前10条SQL
查看逻辑读最多的SQLSELECT * FROM v$sqlstats ORDER BY buffer_gets DESC FETCH FIRST 10 ROWS ONLY;查看逻辑读最多的前10条SQL
查看物理读最多的SQLSELECT * FROM v$sqlstats ORDER BY disk_reads DESC FETCH FIRST 10 ROWS ONLY;查看物理读最多的前10条SQL
查看执行次数最多的SQLSELECT * FROM v$sqlstats ORDER BY executions DESC FETCH FIRST 10 ROWS ONLY;查看执行次数最多的前10条SQL
查看SQL执行计划EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10;
SELECT * FROM TABLE(dbms_xplan.display());
查看SQL语句的执行计划
查看实时执行计划SELECT * FROM v$session WHERE sql_id = 'f4j23k123l4j';
SELECT * FROM v$sql_plan_monitor WHERE sql_id = 'f4j23k123l4j';
查看正在执行的SQL的实时执行计划

故障诊断命令

日志文件查看

命令类型示例命令说明
查看告警日志位置SELECT value FROM v$parameter WHERE name = 'background_dump_dest';查看告警日志文件位置
查看最新告警日志tail -n 100 /path/to/alert_orcl.log查看告警日志最后100行(Linux)
查看会话跟踪文件位置SELECT p.tracefile FROM v$session s JOIN v$process p ON s.paddr = p.addr WHERE s.sid = 123;查看指定会话的跟踪文件位置
查看监听日志位置lsnrctl status查看监听器状态和日志位置
查看审计日志位置SELECT value FROM v$parameter WHERE name = 'audit_file_dest';查看审计日志文件位置

错误信息查询

命令类型示例命令说明
查看最近错误SELECT * FROM v$diag_error ORDER BY timestamp DESC FETCH FIRST 10 ROWS ONLY;查看最近的10个错误信息
查看ORA错误信息SELECT * FROM v$instance_error ORDER BY first_time DESC;查看实例级错误信息
查看会话错误SELECT * FROM v$session WHERE last_call_et > 3600 AND status = 'INACTIVE';查看长时间不活动的会话
查看数据文件错误SELECT * FROM v$recover_file;查看需要恢复的数据文件
查看坏块信息SELECT * FROM v$database_block_corruption;查看数据库中的坏块信息

锁和阻塞诊断

命令类型示例命令说明
查看阻塞会话SELECT blocking_session, sid, serial#, wait_class, event FROM v$session WHERE blocking_session IS NOT NULL;查看被阻塞的会话
查看锁持有情况SELECT s.sid, s.serial#, s.username, l.type, l.id1, l.id2, l.lmode, l.request FROM v$session s, v$lock l WHERE s.sid = l.sid AND l.block = 1;查看持有锁的会话
查看锁等待链SELECT * FROM v$lock_held h, v$lock_wait w WHERE h.sid = w.holding_session;查看锁等待链
查看死锁信息SELECT * FROM v$deadlock;查看死锁信息
查看DDL锁SELECT * FROM v$lock WHERE type IN ('TM', 'TX');查看表级(TM)和事务级(TX)锁
生成锁报告EXEC DBMS_LOCK.ALLOCATE_UNIQUE('LOCK_NAME', :lockhandle);生成锁报告(需要进一步处理)

系统状态查询命令

数据库结构查询

命令类型示例命令说明
查看表空间列表SELECT tablespace_name, status FROM dba_tablespaces;查看所有表空间及其状态
查看数据文件信息SELECT file_name, tablespace_name, bytes/1024/1024 MB, status FROM dba_data_files;查看所有数据文件信息
查看临时文件信息SELECT file_name, tablespace_name, bytes/1024/1024 MB FROM dba_temp_files;查看所有临时文件信息
查看控制文件信息SELECT name, status FROM v$controlfile;查看控制文件信息
查看重做日志信息SELECT * FROM v$log;查看重做日志组信息
查看重做日志成员SELECT * FROM v$logfile;查看重做日志成员信息
查看归档日志信息SELECT * FROM v$archived_log ORDER BY sequence# DESC FETCH FIRST 10 ROWS ONLY;查看最近10条归档日志信息

内存结构查询

命令类型示例命令说明
查看SGA结构SELECT name, value/1024/1024 MB FROM v$sga;查看SGA各组件大小
查看PGA使用情况SELECT spid, username, program, pga_used_mem/1024/1024 PGA_USED_MB, pga_alloc_mem/1024/1024 PGA_ALLOC_MB FROM v$process ORDER BY pga_used_mem DESC;查看进程PGA使用情况
查看共享池内容SELECT owner, name, type FROM v$db_object_cache WHERE type IN ('PACKAGE', 'PROCEDURE', 'FUNCTION') ORDER BY loads DESC FETCH FIRST 10 ROWS ONLY;查看共享池中加载最多的对象
查看缓冲区缓存命中率SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS, 1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio" FROM V$BUFFER_POOL_STATISTICS;计算缓冲区缓存命中率

进程和会话查询

命令类型示例命令说明
查看所有进程SELECT spid, pid, program FROM v$process;查看所有Oracle进程
查看用户会话SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.status FROM v$session s WHERE s.username IS NOT NULL;查看所有用户会话
查看特定用户会话SELECT s.sid, s.serial#, s.username, s.machine, s.program FROM v$session s WHERE s.username = 'HR';查看HR用户的所有会话
查看会话详细信息SELECT * FROM v$session WHERE sid = 123;查看指定SID的会话详细信息
查看会话SQLSELECT s.sid, s.serial#, s.username, t.sql_text FROM v$session s, v$sqltext t WHERE s.sql_id = t.sql_id AND s.sid = 123 ORDER BY t.piece;查看指定会话正在执行的SQL
查看会话等待事件SELECT s.sid, s.serial#, s.username, w.event, w.wait_time, w.seconds_in_wait FROM v$session s, v$session_wait w WHERE s.sid = w.sid AND s.sid = 123;查看指定会话的等待事件

常用诊断工具命令

AWR报告生成

命令类型示例命令说明
生成AWR报告@$ORACLE_HOME/rdbms/admin/awrrpt.sql生成AWR报告(交互式)
生成指定快照AWR报告EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
手动创建快照并生成AWR报告
生成AWR比较报告@$ORACLE_HOME/rdbms/admin/awrddrpt.sql生成两个时段的AWR比较报告
查看AWR快照信息SELECT * FROM dba_hist_snapshot ORDER BY snap_id DESC;查看所有AWR快照信息
配置AWR快照间隔EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 60, retention => 7*24*60);设置AWR快照间隔为60分钟,保留7天

ASH报告生成

命令类型示例命令说明
生成ASH报告@$ORACLE_HOME/rdbms/admin/ashrpt.sql生成ASH报告(交互式)
生成指定时间ASH报告@$ORACLE_HOME/rdbms/admin/ashrpt.sql生成指定时间范围的ASH报告
查看ASH数据SELECT * FROM v$active_session_history WHERE sample_time > SYSDATE - 1/24 ORDER BY sample_time DESC;查看最近1小时的ASH数据
查看ASH等待事件SELECT event, COUNT(*) FROM v$active_session_history WHERE sample_time > SYSDATE - 1/24 GROUP BY event ORDER BY COUNT(*) DESC;查看最近1小时的主要等待事件

ADDM报告生成

命令类型示例命令说明
生成ADDM报告@$ORACLE_HOME/rdbms/admin/addmrpt.sql生成ADDM报告(交互式)
生成指定快照ADDM报告EXEC DBMS_ADDM.ANALYZE_INST(100, 101, 'ADDM_RUN_1');分析快照100到101并生成ADDM报告
查看ADDM任务SELECT * FROM dba_addm_tasks ORDER BY task_id DESC;查看所有ADDM任务
查看ADDM结果SELECT * FROM dba_addm_findings WHERE task_id = 1 ORDER BY impact_pct DESC;查看ADDM报告的主要发现

SQL Tuning Advisor

命令类型示例命令说明
运行SQL Tuning AdvisorDECLARE
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_id => 'f4j23k123l4j',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'sql_tuning_task_1',
description => 'Tune statement f4j23k123l4j');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => 'sql_tuning_task_1');
END;
/
创建并执行SQL调优任务
查看调优建议SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('sql_tuning_task_1') FROM dual;查看SQL调优建议
自动运行SQL Tuning AdvisorEXEC DBMS_AUTO_SQLTUNE.EXECUTE_TUNING_TASK();运行自动SQL调优任务

其他诊断工具

命令类型示例命令说明
运行数据库健康检查@$ORACLE_HOME/rdbms/admin/dbmshealth.sql运行数据库健康检查脚本
生成健康检查报告EXEC DBMS_HM.RUN_CHECK('DB Structure Integrity Check', 'HM_RUN_1');运行数据库结构完整性检查
查看健康检查结果SELECT * FROM DBA_HM_RUNS WHERE run_name = 'HM_RUN_1';查看健康检查运行结果
生成健康检查报告SELECT DBMS_HM.GET_RUN_REPORT('HM_RUN_1') FROM dual;查看健康检查详细报告
运行UTLSTATS报告@$ORACLE_HOME/rdbms/admin/utlstats.sql运行UTLSTATS报告(旧版统计信息报告)

维护诊断命令

统计信息收集

命令类型示例命令说明
收集表统计信息EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES', CASCADE => TRUE);收集HR.EMPLOYEES表及其索引的统计信息
收集模式统计信息EXEC DBMS_STATS.GATHER_SCHEMA_STATS('HR', CASCADE => TRUE);收集HR模式下所有对象的统计信息
收集数据库统计信息EXEC DBMS_STATS.GATHER_DATABASE_STATS(CASCADE => TRUE);收集整个数据库的统计信息
收集固定对象统计信息EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS();收集固定对象(如动态性能视图)的统计信息
查看表统计信息SELECT table_name, num_rows, last_analyzed FROM dba_tables WHERE table_name = 'EMPLOYEES';查看表的统计信息
查看索引统计信息SELECT index_name, blevel, leaf_blocks, num_rows FROM dba_indexes WHERE index_name = 'EMP_EMP_ID_PK';查看索引的统计信息

碎片整理诊断

命令类型示例命令说明
检查表碎片SELECT table_name, num_rows, blocks, empty_blocks, avg_space, chain_cnt FROM dba_tables WHERE table_name = 'EMPLOYEES';检查表的碎片情况
检查索引碎片SELECT index_name, blevel, leaf_blocks, distinct_keys, clustering_factor FROM dba_indexes WHERE index_name = 'EMP_EMP_ID_PK';检查索引的碎片情况
查看表空间碎片SELECT tablespace_name, COUNT(*) fragments, SUM(bytes)/1024/1024 total_mb FROM dba_free_space GROUP BY tablespace_name ORDER BY fragments DESC;查看表空间的碎片情况
查看大段对象SELECT owner, segment_name, segment_type, tablespace_name, bytes/1024/1024 MB FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;查看数据库中最大的10个段对象

数据库验证命令

命令类型示例命令说明
验证表结构ANALYZE TABLE employees VALIDATE STRUCTURE;验证EMPLOYEES表的结构完整性
验证索引结构ANALYZE INDEX emp_emp_id_pk VALIDATE STRUCTURE;验证索引的结构完整性
验证表和索引ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;验证表及其所有索引的结构完整性
检查数据块完整性DBV FILE='/oradata/orcl/users01.dbf' LOGFILE='dbv_users01.log';使用DBV工具检查数据文件的逻辑块完整性
检查数据库物理完整性RMAN> BACKUP VALIDATE DATABASE;使用RMAN检查数据库的物理块完整性
检查归档日志完整性RMAN> VALIDATE ARCHIVELOG ALL;使用RMAN检查所有归档日志的完整性

常见问题(FAQ)

Q1: 如何快速定位数据库性能瓶颈?

A: 可以使用以下步骤快速定位数据库性能瓶颈:

  1. 查看数据库负载:

    sql
    SELECT * FROM v$sysmetric WHERE metric_name IN ('CPU Usage Per Sec', 'User Calls Per Sec') AND group_id = 2;
  2. 查看主要等待事件:

    sql
    SELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY COUNT(*) DESC;
  3. 查看消耗资源最多的SQL:

    sql
    SELECT * FROM v$sqlstats ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY;
  4. 生成AWR报告进行深入分析:

    sql
    @$ORACLE_HOME/rdbms/admin/awrrpt.sql

Q2: 如何查看数据库中的锁和阻塞?

A: 可以使用以下命令查看数据库中的锁和阻塞:

  1. 查看阻塞会话:

    sql
    SELECT blocking_session, sid, serial#, wait_class, event FROM v$session WHERE blocking_session IS NOT NULL;
  2. 查看锁持有情况:

    sql
    SELECT s.sid, s.serial#, s.username, l.type, l.id1, l.id2, l.lmode, l.request FROM v$session s, v$lock l WHERE s.sid = l.sid AND l.block = 1;
  3. 查看锁等待链:

    sql
    SELECT * FROM v$lock_held h, v$lock_wait w WHERE h.sid = w.holding_session;

Q3: 如何生成AWR报告?

A: 可以使用以下步骤生成AWR报告:

  1. 连接到数据库:

    bash
    sqlplus / as sysdba
  2. 运行AWR报告生成脚本:

    sql
    @$ORACLE_HOME/rdbms/admin/awrrpt.sql
  3. 按照提示选择报告格式(HTML或TEXT)、快照起始和结束ID、报告文件名等。

Q4: 如何查看数据库中的坏块?

A: 可以使用以下命令查看数据库中的坏块:

sql
SELECT * FROM v$database_block_corruption;

如果发现坏块,可以使用RMAN进行恢复:

sql
RMAN> BLOCKRECOVER CORRUPTION LIST;

Q5: 如何监控实时SQL执行情况?

A: 可以使用以下命令监控实时SQL执行情况:

  1. 查看正在执行的SQL:

    sql
    SELECT s.sid, s.serial#, s.username, s.machine, s.program, ROUND(elapsed_seconds/60, 2) minutes_running, sql_text FROM v$session_longops l, v$sql s WHERE l.sql_id = s.sql_id AND elapsed_seconds > 60 ORDER BY elapsed_seconds DESC;
  2. 查看实时执行计划:

    sql
    SELECT * FROM v$sql_plan_monitor WHERE sql_id = 'f4j23k123l4j';
  3. 使用Oracle Enterprise Manager (OEM)或其他监控工具查看实时性能图表。

最佳实践

  1. 定期生成和分析AWR报告:定期生成AWR报告,分析数据库性能趋势,及时发现潜在问题。
  2. 监控关键指标:监控数据库的关键指标,如CPU使用率、I/O等待、会话数等,设置合理的告警阈值。
  3. 及时收集统计信息:定期收集数据库对象的统计信息,确保优化器生成高效的执行计划。
  4. 使用绑定变量:在编写SQL语句时,尽量使用绑定变量,减少硬解析,提高共享池利用率。
  5. 监控锁和阻塞:定期监控数据库中的锁和阻塞情况,及时解决锁争用问题。
  6. 定期检查数据库完整性:定期使用DBV和RMAN验证数据库的完整性,确保数据安全。
  7. 保留足够的日志:保留足够的告警日志、审计日志和跟踪文件,便于故障诊断。
  8. 使用自动化工具:使用Oracle Enterprise Manager (OEM)、Prometheus + Grafana等工具实现自动化监控和告警。
  9. 定期进行性能调优:定期对数据库进行性能调优,优化SQL语句和数据库参数。
  10. 建立故障处理流程:建立完善的故障处理流程,确保在出现问题时能够快速定位和解决。