外观
Oracle 常用监控指标详解
CPU 指标
系统级 CPU 指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
CPU Usage Per Sec | 每秒CPU使用率(百分比) | (CPU_USER_TIME + CPU_SYSTEM_TIME) / (ELAPSED_TIME * CPU_COUNT) * 100 | 0-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)) * 100 | 0-70% | >85% | OS 命令(如 top, vmstat) |
数据库级 CPU 指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
User Calls Per Sec | 每秒用户调用次数 | 直接采集 | 依赖系统负载 | 异常波动 | v$sysmetric |
SQL Service Response Time | SQL服务响应时间(毫秒) | (CPU_TIME + WAIT_TIME) / EXECUTIONS | <50ms | >200ms | v$servicemetric |
Database Time Per Sec | 每秒数据库时间 | 直接采集 | 依赖系统负载 | 异常波动 | v$sysmetric |
内存指标
SGA 指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
SGA Size | SGA总大小 | 直接采集 | 系统内存的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 Target | PGA聚合目标大小 | 直接采集 | 系统内存的20-30% | 超过系统内存50% | v$pgastat |
PGA Used | 当前PGA使用大小 | 直接采集 | <PGA_TARGET的80% | >PGA_TARGET的95% | v$pgastat |
PGA Cache Hit Percentage | PGA缓存命中率 | 直接采集 | >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) * 100 | 0% | >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等待时间(毫秒) | 直接采集 | 依赖系统负载 | 持续高于500ms | v$sysstat |
Average Read Time | 平均读时间(毫秒) | read_time / phyrds | <10ms | >20ms | v$filestat |
Average Write Time | 平均写时间(毫秒) | writetime / phywrts | <10ms | >20ms | v$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 | >20ms | v$sysstat |
Log File Sync Wait Time | 日志文件同步等待时间(毫秒) | 直接采集 | <5ms | >20ms | v$system_event |
Log File Parallel Write Wait Time | 日志文件并行写等待时间(毫秒) | 直接采集 | <5ms | >20ms | v$system_event |
Log Switch Per Hour | 每小时日志切换次数 | 直接采集 | <20次 | >60次 | v$log_history |
会话与连接指标
会话指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
Total Sessions | 总会话数 | 直接采集 | <processes参数的80% | >processes参数的90% | v$session |
Active Sessions | 活跃会话数 | 直接采集 | <CPU核心数*2 | 持续高于CPU核心数*4 | v$session |
Inactive Sessions | 非活跃会话数 | 直接采集 | 依赖应用设计 | 非活跃会话占比>80% | v$session |
Blocked Sessions | 被阻塞会话数 | 直接采集 | 0 | >0 | v$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 Time | SQL执行时间(毫秒) | 直接采集 | <50ms | >200ms | v$sql |
SQL CPU Time Per Exec | 每次执行的CPU时间(毫秒) | cpu_time / executions | <20ms | >100ms | v$sql |
SQL Elapsed Time Per Exec | 每次执行的 elapsed 时间(毫秒) | elapsed_time / executions | <50ms | >200ms | v$sql |
SQL Buffer Gets Per Exec | 每次执行的逻辑读次数 | buffer_gets / executions | <1000 | >10000 | v$sql |
SQL Disk Reads Per Exec | 每次执行的物理读次数 | disk_reads / executions | <100 | >1000 | v$sql |
SQL Rows Per Exec | 每次执行返回的行数 | rows_processed / executions | 依赖查询逻辑 | 异常波动 | v$sql |
SQL 效率指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
SQL Efficiency | SQL效率(行/逻辑读) | rows_processed / NULLIF(buffer_gets, 0) | >1 | <0.1 | v$sql |
Parse Calls Per Exec | 每次执行的解析调用次数 | parse_calls / executions | <1.1 | >2 | v$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 | >0 | v$system_event |
Average Lock Wait Time | 平均锁等待时间(毫秒) | 直接采集 | 0 | >50ms | v$system_event |
Deadlocks Per Hour | 每小时死锁次数 | 直接采集 | 0 | >0 | v$sysstat |
Enqueue Waits | 队列等待次数 | 直接采集 | 依赖系统负载 | 异常波动 | v$enqueue_statistics |
Long Running Locks | 长时间运行的锁数量 | 直接采集 | 0 | >0 | v$lock |
等待事件指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
Top Wait Events | 主要等待事件 | 按等待时间排序 | 依赖系统类型 | 等待时间占比>50% | v$system_event |
Wait Time Per Sec | 每秒等待时间(毫秒) | 直接采集 | 依赖系统负载 | 异常波动 | v$sysmetric |
DB Time Ratio | 数据库时间比率 | db_time / (elapsed_time * cpu_count) | 依赖系统负载 | >1.5 | v$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% | <500MB | dba_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 | >0 | dba_data_files |
备份与恢复指标
备份指标
| 指标名称 | 说明 | 计算公式 | 正常范围 | 告警阈值 | 数据来源 |
|---|---|---|---|---|---|
Last Backup Age | 上次备份时间(小时) | (SYSDATE - last_backup_time) * 24 | <24小时 | >48小时 | v$rman_backup_job_details |
Backup Success Rate | 备份成功率 | success_count / total_count * 100 | 100% | <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 | >0 | v$archive_gap |
Flash Recovery Area Usage % | 闪回恢复区使用率 | space_used / space_limit * 100 | <80% | >90% | v$recovery_file_dest |
常见问题(FAQ)
Q1: 如何监控Oracle数据库的CPU使用率?
A: 可以使用以下方法监控Oracle数据库的CPU使用率:
使用动态性能视图:
sqlSELECT metric_name, value FROM v$sysmetric WHERE metric_name IN ('CPU Usage Per Sec', 'CPU User Time Per Sec', 'CPU System Time Per Sec');使用AWR报告:查看AWR报告中的"Top 5 Timed Foreground Events"和"CPU Usage"部分。
使用操作系统命令:如
top,vmstat,iostat等。
Q2: 如何监控Oracle数据库的内存使用率?
A: 可以使用以下方法监控Oracle数据库的内存使用率:
监控SGA使用情况:
sqlSELECT component, current_size/1024/1024 current_mb FROM v$sga_dynamic_components;监控PGA使用情况:
sqlSELECT name, value/1024/1024 value_mb FROM v$pgastat;监控内存命中率:
sqlSELECT '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性能:
监控数据文件I/O:
sqlSELECT 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;监控重做日志I/O:
sqlSELECT metric_name, value FROM v$sysmetric WHERE metric_name IN ('Redo Generated Per Sec', 'Redo Writes Per Sec');监控等待事件:
sqlSELECT 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数据库的会话状态:
查看会话总数和活跃会话数:
sqlSELECT 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';查看被阻塞的会话:
sqlSELECT 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;查看长时间运行的会话:
sqlSELECT 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;最佳实践
建立监控体系:建立全面的Oracle数据库监控体系,包括系统级、数据库级和应用级监控。
设置合理阈值:根据业务需求和系统特点,设置合理的监控阈值,避免误告警。
关注关键指标:重点关注CPU使用率、内存使用率、I/O性能、活跃会话数、SQL执行效率等关键指标。
结合多种工具:结合使用Oracle自带的动态性能视图、AWR报告、ASH报告以及第三方监控工具,全面了解数据库性能状况。
定期分析趋势:定期分析监控数据的趋势,及时发现潜在问题,进行预防性维护。
自动化监控:实现监控的自动化,包括数据采集、告警通知和报表生成,提高监控效率。
建立告警机制:建立完善的告警机制,包括告警级别、通知方式和处理流程,确保及时响应和处理问题。
持续优化:根据监控数据,持续优化数据库参数、SQL语句和系统配置,提高数据库性能和稳定性。
