外观
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/O | SELECT 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/O | SELECT 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性能监控
| 命令类型 | 示例命令 | 说明 |
|---|---|---|
| 查看长时间运行的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; | 查看运行时间超过60秒的SQL |
| 查看消耗资源最多的SQL | SELECT * FROM v$sqlstats ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY; | 查看CPU消耗最多的前10条SQL |
| 查看逻辑读最多的SQL | SELECT * FROM v$sqlstats ORDER BY buffer_gets DESC FETCH FIRST 10 ROWS ONLY; | 查看逻辑读最多的前10条SQL |
| 查看物理读最多的SQL | SELECT * FROM v$sqlstats ORDER BY disk_reads DESC FETCH FIRST 10 ROWS ONLY; | 查看物理读最多的前10条SQL |
| 查看执行次数最多的SQL | SELECT * 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的会话详细信息 |
| 查看会话SQL | SELECT 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 Advisor | DECLARE 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 Advisor | EXEC 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: 可以使用以下步骤快速定位数据库性能瓶颈:
查看数据库负载:
sqlSELECT * FROM v$sysmetric WHERE metric_name IN ('CPU Usage Per Sec', 'User Calls Per Sec') AND group_id = 2;查看主要等待事件:
sqlSELECT event, COUNT(*) FROM v$session_wait GROUP BY event ORDER BY COUNT(*) DESC;查看消耗资源最多的SQL:
sqlSELECT * FROM v$sqlstats ORDER BY cpu_time DESC FETCH FIRST 10 ROWS ONLY;生成AWR报告进行深入分析:
sql@$ORACLE_HOME/rdbms/admin/awrrpt.sql
Q2: 如何查看数据库中的锁和阻塞?
A: 可以使用以下命令查看数据库中的锁和阻塞:
查看阻塞会话:
sqlSELECT blocking_session, sid, serial#, wait_class, event FROM v$session WHERE blocking_session IS NOT NULL;查看锁持有情况:
sqlSELECT 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;查看锁等待链:
sqlSELECT * FROM v$lock_held h, v$lock_wait w WHERE h.sid = w.holding_session;
Q3: 如何生成AWR报告?
A: 可以使用以下步骤生成AWR报告:
连接到数据库:
bashsqlplus / as sysdba运行AWR报告生成脚本:
sql@$ORACLE_HOME/rdbms/admin/awrrpt.sql按照提示选择报告格式(HTML或TEXT)、快照起始和结束ID、报告文件名等。
Q4: 如何查看数据库中的坏块?
A: 可以使用以下命令查看数据库中的坏块:
sql
SELECT * FROM v$database_block_corruption;如果发现坏块,可以使用RMAN进行恢复:
sql
RMAN> BLOCKRECOVER CORRUPTION LIST;Q5: 如何监控实时SQL执行情况?
A: 可以使用以下命令监控实时SQL执行情况:
查看正在执行的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;查看实时执行计划:
sqlSELECT * FROM v$sql_plan_monitor WHERE sql_id = 'f4j23k123l4j';使用Oracle Enterprise Manager (OEM)或其他监控工具查看实时性能图表。
最佳实践
- 定期生成和分析AWR报告:定期生成AWR报告,分析数据库性能趋势,及时发现潜在问题。
- 监控关键指标:监控数据库的关键指标,如CPU使用率、I/O等待、会话数等,设置合理的告警阈值。
- 及时收集统计信息:定期收集数据库对象的统计信息,确保优化器生成高效的执行计划。
- 使用绑定变量:在编写SQL语句时,尽量使用绑定变量,减少硬解析,提高共享池利用率。
- 监控锁和阻塞:定期监控数据库中的锁和阻塞情况,及时解决锁争用问题。
- 定期检查数据库完整性:定期使用DBV和RMAN验证数据库的完整性,确保数据安全。
- 保留足够的日志:保留足够的告警日志、审计日志和跟踪文件,便于故障诊断。
- 使用自动化工具:使用Oracle Enterprise Manager (OEM)、Prometheus + Grafana等工具实现自动化监控和告警。
- 定期进行性能调优:定期对数据库进行性能调优,优化SQL语句和数据库参数。
- 建立故障处理流程:建立完善的故障处理流程,确保在出现问题时能够快速定位和解决。
