Skip to content

Oracle 常用监控指标详解

CPU 指标

系统级 CPU 指标

指标名称说明计算公式正常范围告警阈值数据来源
CPU Usage Per Sec每秒CPU使用率(百分比)(CPU_USER_TIME + CPU_SYSTEM_TIME) / (ELAPSED_TIME * CPU_COUNT) * 1000-70%>85%v$sysmetric
CPU User Time Per Sec每秒用户态CPU时间(毫秒)直接采集依赖系统负载持续高于90%v$sysstat
CPU System Time Per Sec每秒系统态CPU时间(毫秒)直接采集依赖系统负载持续高于20%v$sysstat
CPU Utilization总体CPU利用率(busy_time / (busy_time + idle_time)) * 1000-70%>85%OS 命令(如 top, vmstat

数据库级 CPU 指标

指标名称说明计算公式正常范围告警阈值数据来源
User Calls Per Sec每秒用户调用次数直接采集依赖系统负载异常波动v$sysmetric
SQL Service Response TimeSQL服务响应时间(毫秒)(CPU_TIME + WAIT_TIME) / EXECUTIONS<50ms>200msv$servicemetric
Database Time Per Sec每秒数据库时间直接采集依赖系统负载异常波动v$sysmetric

内存指标

SGA 指标

指标名称说明计算公式正常范围告警阈值数据来源
SGA SizeSGA总大小直接采集系统内存的40-50%超过系统内存70%v$sga
Buffer Cache Hit Ratio缓冲区缓存命中率(1 - (physical_reads / (db_block_gets + consistent_gets))) * 100>95%<90%v$sysstat
Shared Pool Hit Ratio共享池命中率(1 - (sum(reloads) / sum(pins))) * 100>95%<90%v$librarycache
Library Cache Hit Ratio库缓存命中率(1 - (sum(reloads) / sum(pins))) * 100>95%<90%v$librarycache
Dictionary Cache Hit Ratio字典缓存命中率(1 - (sum(getmisses) / sum(gets))) * 100>95%<90%v$rowcache

PGA 指标

指标名称说明计算公式正常范围告警阈值数据来源
PGA Aggregate TargetPGA聚合目标大小直接采集系统内存的20-30%超过系统内存50%v$pgastat
PGA Used当前PGA使用大小直接采集<PGA_TARGET的80%>PGA_TARGET的95%v$pgastat
PGA Cache Hit PercentagePGA缓存命中率直接采集>90%<80%v$pga_target_advice
Workarea One-Pass Executions Ratio工作区一次通过执行率onepass_executions / (optimal_executions + onepass_executions + multipass_executions) * 100<5%>10%v$sql_workarea
Workarea Multi-Pass Executions Ratio工作区多次通过执行率multipass_executions / (optimal_executions + onepass_executions + multipass_executions) * 1000%>1%v$sql_workarea

I/O 指标

数据文件 I/O 指标

指标名称说明计算公式正常范围告警阈值数据来源
Physical Reads Per Sec每秒物理读次数直接采集依赖系统负载异常波动v$sysmetric
Physical Writes Per Sec每秒物理写次数直接采集依赖系统负载异常波动v$sysmetric
I/O Wait Time Per Sec每秒I/O等待时间(毫秒)直接采集依赖系统负载持续高于500msv$sysstat
Average Read Time平均读时间(毫秒)read_time / phyrds<10ms>20msv$filestat
Average Write Time平均写时间(毫秒)writetime / phywrts<10ms>20msv$filestat
Read Throughput读吞吐量(MB/s)(phyblkrd * block_size) / 1024 / 1024依赖存储性能低于存储标称性能的50%v$filestat
Write Throughput写吞吐量(MB/s)(phyblkwrt * block_size) / 1024 / 1024依赖存储性能低于存储标称性能的50%v$filestat

重做日志 I/O 指标

指标名称说明计算公式正常范围告警阈值数据来源
Redo Generated Per Sec每秒生成的重做日志量(KB)直接采集依赖系统负载异常波动v$sysmetric
Redo Writes Per Sec每秒重做日志写次数直接采集依赖系统负载异常波动v$sysstat
Average Redo Write Time平均重做日志写时间(毫秒)redo_write_time / redo_writes<10ms>20msv$sysstat
Log File Sync Wait Time日志文件同步等待时间(毫秒)直接采集<5ms>20msv$system_event
Log File Parallel Write Wait Time日志文件并行写等待时间(毫秒)直接采集<5ms>20msv$system_event
Log Switch Per Hour每小时日志切换次数直接采集<20次>60次v$log_history

会话与连接指标

会话指标

指标名称说明计算公式正常范围告警阈值数据来源
Total Sessions总会话数直接采集<processes参数的80%>processes参数的90%v$session
Active Sessions活跃会话数直接采集<CPU核心数*2持续高于CPU核心数*4v$session
Inactive Sessions非活跃会话数直接采集依赖应用设计非活跃会话占比>80%v$session
Blocked Sessions被阻塞会话数直接采集0>0v$session
Session Limit %会话使用率total_sessions / processes * 100<80%>90%v$session

连接指标

指标名称说明计算公式正常范围告警阈值数据来源
User Calls Per Sec每秒用户调用次数直接采集依赖系统负载异常波动v$sysstat
Logons Current当前登录会话数直接采集依赖系统负载异常波动v$sysstat
Logons Per Sec每秒登录次数直接采集依赖系统负载异常波动v$sysstat
Executions Per Sec每秒SQL执行次数直接采集依赖系统负载异常波动v$sysstat

SQL 执行指标

SQL 性能指标

指标名称说明计算公式正常范围告警阈值数据来源
SQL Execution TimeSQL执行时间(毫秒)直接采集<50ms>200msv$sql
SQL CPU Time Per Exec每次执行的CPU时间(毫秒)cpu_time / executions<20ms>100msv$sql
SQL Elapsed Time Per Exec每次执行的 elapsed 时间(毫秒)elapsed_time / executions<50ms>200msv$sql
SQL Buffer Gets Per Exec每次执行的逻辑读次数buffer_gets / executions<1000>10000v$sql
SQL Disk Reads Per Exec每次执行的物理读次数disk_reads / executions<100>1000v$sql
SQL Rows Per Exec每次执行返回的行数rows_processed / executions依赖查询逻辑异常波动v$sql

SQL 效率指标

指标名称说明计算公式正常范围告警阈值数据来源
SQL EfficiencySQL效率(行/逻辑读)rows_processed / NULLIF(buffer_gets, 0)>1<0.1v$sql
Parse Calls Per Exec每次执行的解析调用次数parse_calls / executions<1.1>2v$sql
Hard Parse Ratio硬解析比率hard_parse_count / parse_count_total * 100<5%>15%v$sysstat
Soft Parse Ratio软解析比率(parse_count_total - hard_parse_count) / parse_count_total * 100>95%<85%v$sysstat

锁与等待指标

锁指标

指标名称说明计算公式正常范围告警阈值数据来源
Lock Waits Per Sec每秒锁等待次数直接采集0>0v$system_event
Average Lock Wait Time平均锁等待时间(毫秒)直接采集0>50msv$system_event
Deadlocks Per Hour每小时死锁次数直接采集0>0v$sysstat
Enqueue Waits队列等待次数直接采集依赖系统负载异常波动v$enqueue_statistics
Long Running Locks长时间运行的锁数量直接采集0>0v$lock

等待事件指标

指标名称说明计算公式正常范围告警阈值数据来源
Top Wait Events主要等待事件按等待时间排序依赖系统类型等待时间占比>50%v$system_event
Wait Time Per Sec每秒等待时间(毫秒)直接采集依赖系统负载异常波动v$sysmetric
DB Time Ratio数据库时间比率db_time / (elapsed_time * cpu_count)依赖系统负载>1.5v$sysmetric
Idle Time Ratio空闲时间比率idle_time / (elapsed_time * cpu_count)依赖系统负载<10%v$sysmetric

表空间与存储指标

表空间指标

指标名称说明计算公式正常范围告警阈值数据来源
Tablespace Usage %表空间使用率(total_mb - free_mb) / total_mb * 100<80%>90%dba_free_space
Tablespace Free MB表空间剩余空间(MB)直接采集>1GB或总空间的20%<500MBdba_free_space
Tablespace Growth Rate表空间增长率(MB/天)(current_size - previous_size) / days依赖业务增长异常波动dba_data_files
Temp Tablespace Usage %临时表空间使用率used_mb / total_mb * 100<80%>90%v$temp_space_header

数据文件指标

指标名称说明计算公式正常范围告警阈值数据来源
Data File Growth Rate数据文件增长率(MB/天)(current_size - previous_size) / days依赖业务增长异常波动dba_data_files
Autoextend Enabled Data Files启用自动扩展的数据文件数直接采集依赖存储设计禁用自动扩展的数据文件占比>50%dba_data_files
Data Files Near Max Size接近最大大小的数据文件数直接采集0>0dba_data_files

备份与恢复指标

备份指标

指标名称说明计算公式正常范围告警阈值数据来源
Last Backup Age上次备份时间(小时)(SYSDATE - last_backup_time) * 24<24小时>48小时v$rman_backup_job_details
Backup Success Rate备份成功率success_count / total_count * 100100%<100%v$rman_backup_job_details
Backup Duration备份持续时间(分钟)直接采集依赖数据量超过预期时间的2倍v$rman_backup_job_details
Backup Size备份文件大小(GB)直接采集依赖数据量异常波动v$rman_backup_job_details

恢复指标

指标名称说明计算公式正常范围告警阈值数据来源
Recovery Point Objective (RPO)恢复点目标(小时)直接采集依赖业务要求超过业务要求v$archived_log
Recovery Time Objective (RTO)恢复时间目标(分钟)直接采集依赖业务要求超过业务要求v$recovery_file_dest
Archive Log Gap归档日志缺口直接采集0>0v$archive_gap
Flash Recovery Area Usage %闪回恢复区使用率space_used / space_limit * 100<80%>90%v$recovery_file_dest

常见问题(FAQ)

Q1: 如何监控Oracle数据库的CPU使用率?

A: 可以使用以下方法监控Oracle数据库的CPU使用率:

  1. 使用动态性能视图:

    sql
    SELECT metric_name, value FROM v$sysmetric WHERE metric_name IN ('CPU Usage Per Sec', 'CPU User Time Per Sec', 'CPU System Time Per Sec');
  2. 使用AWR报告:查看AWR报告中的"Top 5 Timed Foreground Events"和"CPU Usage"部分。

  3. 使用操作系统命令:如 top, vmstat, iostat 等。

Q2: 如何监控Oracle数据库的内存使用率?

A: 可以使用以下方法监控Oracle数据库的内存使用率:

  1. 监控SGA使用情况:

    sql
    SELECT component, current_size/1024/1024 current_mb FROM v$sga_dynamic_components;
  2. 监控PGA使用情况:

    sql
    SELECT name, value/1024/1024 value_mb FROM v$pgastat;
  3. 监控内存命中率:

    sql
    SELECT 'Buffer Cache Hit Ratio' metric, ROUND((1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS))) * 100, 2) value FROM V$BUFFER_POOL_STATISTICS WHERE NAME = 'DEFAULT';

Q3: 如何监控Oracle数据库的I/O性能?

A: 可以使用以下方法监控Oracle数据库的I/O性能:

  1. 监控数据文件I/O:

    sql
    SELECT df.name file_name, fs.phyrds reads, fs.phywrts writes, ROUND((fs.readtime / NULLIF(fs.phyrds, 0)), 2) avg_read_time, ROUND((fs.writetime / NULLIF(fs.phywrts, 0)), 2) avg_write_time FROM v$datafile df, v$filestat fs WHERE df.file# = fs.file# ORDER BY (fs.phyrds + fs.phywrts) DESC;
  2. 监控重做日志I/O:

    sql
    SELECT metric_name, value FROM v$sysmetric WHERE metric_name IN ('Redo Generated Per Sec', 'Redo Writes Per Sec');
  3. 监控等待事件:

    sql
    SELECT event, total_waits, time_waited, ROUND(average_wait, 2) avg_wait FROM v$system_event WHERE wait_class != 'Idle' ORDER BY time_waited DESC FETCH FIRST 10 ROWS ONLY;

Q4: 如何监控Oracle数据库的会话状态?

A: 可以使用以下方法监控Oracle数据库的会话状态:

  1. 查看会话总数和活跃会话数:

    sql
    SELECT COUNT(*) total_sessions, SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) active_sessions, SUM(CASE WHEN status = 'INACTIVE' THEN 1 ELSE 0 END) inactive_sessions, SUM(CASE WHEN blocking_session IS NOT NULL THEN 1 ELSE 0 END) blocked_sessions FROM v$session WHERE type = 'USER';
  2. 查看被阻塞的会话:

    sql
    SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.status, s.event, s.wait_class, s.seconds_in_wait FROM v$session s WHERE s.blocking_session IS NOT NULL;
  3. 查看长时间运行的会话:

    sql
    SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.status, s.last_call_et/60 minutes_running, t.sql_text FROM v$session s, v$sqltext t WHERE s.sql_id = t.sql_id AND s.last_call_et > 3600 ORDER BY s.last_call_et DESC;

Q5: 如何监控Oracle数据库的表空间使用情况?

A: 可以使用以下方法监控Oracle数据库的表空间使用情况:

sql
SELECT ts.tablespace_name, 
       ROUND(SUM(df.bytes)/1024/1024, 2) total_mb, 
       ROUND(SUM(fs.bytes)/1024/1024, 2) free_mb, 
       ROUND((SUM(df.bytes) - SUM(fs.bytes))/1024/1024, 2) used_mb, 
       ROUND(((SUM(df.bytes) - SUM(fs.bytes))/SUM(df.bytes))*100, 2) used_pct
FROM dba_tablespaces ts, 
     dba_data_files df, 
     dba_free_space fs
WHERE ts.tablespace_name = df.tablespace_name
  AND df.tablespace_name = fs.tablespace_name
GROUP BY ts.tablespace_name
UNION ALL
SELECT ts.tablespace_name, 
       ROUND(SUM(df.bytes)/1024/1024, 2) total_mb, 
       ROUND(SUM(fs.bytes)/1024/1024, 2) free_mb, 
       ROUND((SUM(df.bytes) - SUM(fs.bytes))/1024/1024, 2) used_mb, 
       ROUND(((SUM(df.bytes) - SUM(fs.bytes))/SUM(df.bytes))*100, 2) used_pct
FROM dba_tablespaces ts, 
     dba_temp_files df, 
     (SELECT tablespace_name, SUM(bytes) bytes FROM v$temp_extent_pool GROUP BY tablespace_name) fs
WHERE ts.tablespace_name = df.tablespace_name
  AND df.tablespace_name = fs.tablespace_name(+)
GROUP BY ts.tablespace_name;

最佳实践

  1. 建立监控体系:建立全面的Oracle数据库监控体系,包括系统级、数据库级和应用级监控。

  2. 设置合理阈值:根据业务需求和系统特点,设置合理的监控阈值,避免误告警。

  3. 关注关键指标:重点关注CPU使用率、内存使用率、I/O性能、活跃会话数、SQL执行效率等关键指标。

  4. 结合多种工具:结合使用Oracle自带的动态性能视图、AWR报告、ASH报告以及第三方监控工具,全面了解数据库性能状况。

  5. 定期分析趋势:定期分析监控数据的趋势,及时发现潜在问题,进行预防性维护。

  6. 自动化监控:实现监控的自动化,包括数据采集、告警通知和报表生成,提高监控效率。

  7. 建立告警机制:建立完善的告警机制,包括告警级别、通知方式和处理流程,确保及时响应和处理问题。

  8. 持续优化:根据监控数据,持续优化数据库参数、SQL语句和系统配置,提高数据库性能和稳定性。