温馨提示×

Ubuntu系统如何监控Oracle运行状态

小樊
45
2025-09-29 19:58:55
栏目: 云计算

Ubuntu系统监控Oracle运行状态的方法

1. 命令行工具监控(基础且实时)

  • SQL*Plus:通过sqlplus / as sysdba登录数据库,执行SELECT status FROM v$instance;确认实例状态(返回OPEN表示运行中);还可查询v$session(当前会话)、v$sql(执行SQL)、v$waitstat(等待事件)等视图获取详细性能信息。
  • 操作系统工具
    • top/htop:实时查看Oracle进程的CPU、内存占用(按Shift+P按CPU排序,Shift+M按内存排序);
    • vmstat 2:每2秒输出系统虚拟内存、进程、CPU使用情况(关注si/so列判断磁盘I/O瓶颈);
    • iostat -x 2:监控磁盘I/O负载(关注%util列,接近100%表示磁盘繁忙);
    • sar -u 2 3:查看CPU使用率历史趋势(-u表示CPU,2为间隔,3为次数)。
  • 日志分析
    • tail -f $ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_<instance_name>.log:实时查看数据库错误、警告信息;
    • tail -f $ORACLE_HOME/network/log/listener.log:监控监听器状态(如连接请求、错误)。

2. 第三方开源监控工具(可视化与自动化)

  • Prometheus + Grafana + Oracle Exporter
    • 安装Oracle Instant Client(sudo apt install libaio1,下载并解压Oracle Instant Client Basic Lite包,设置LD_LIBRARY_PATH环境变量);
    • 下载并编译oracledb_exportergit clone https://github.com/iamseth/oracledb_exporter.git && cd oracledb_exporter && go build);
    • 配置config.yml(添加Oracle数据库的用户名、密码、服务名等信息);
    • 运行oracledb_exporter./oracledb_exporter),默认监听9161端口;
    • 配置Prometheus(在prometheus.yml中添加scrape_configs,指向oracledb_exporter的地址);
    • 在Grafana导入Oracle监控仪表板(如社区提供的模板ID:12345),实现CPU、内存、SGA/PGA命中率、慢SQL等指标的可视化。
  • Zabbix
    • 安装Zabbix Server和Agent(参考官方文档);
    • 导入Oracle监控模板(社区模板如“Oracle Database Monitoring”);
    • 配置Zabbix Agent的zabbix_agentd.conf文件(添加Oracle监控的自定义参数,如UserParameter=oracle.status[*],sqlplus -s / as sysdba @$1);
    • 通过模板自动发现Oracle表空间使用率、连接数、DML语句变化趋势等指标,并设置告警规则(如表空间剩余空间低于10%时发送邮件)。

3. Oracle专用监控工具(全面且专业)

  • Oracle Enterprise Manager (OEM)
    • 安装OEM(Oracle Database安装介质中包含,或通过opatch auto部署);
    • 配置OEM与Oracle数据库的连接(通过emca命令创建管理仓库);
    • 登录OEM Web界面(默认端口7803),实现数据库实例的实时监控(性能指标、空间使用、资源分配)、自动修复(如重启失败的进程)、备份恢复管理及性能优化建议。
  • OSWatcher
    • 下载Oracle提供的oswatcher工具包(oswatcher.tar.gz);
    • 解压后执行./oswatcher.sh -o /tmp/osw -t 60 -d 1-o指定输出目录,-t为采集间隔秒数,-d为采集持续时间天);
    • 收集系统性能数据(CPU、内存、磁盘I/O、网络流量),用于离线分析Oracle性能问题(如CPU瓶颈是否由系统进程引起)。

4. SQL脚本监控(针对性强)

  • 编写SQL脚本监控活跃SQL
    SET LINESIZE 200; COL inst_sid HEADING "INST_ID|:SID" FORMAT A7; COL username FORMAT A10; COL machine FORMAT A12; COL sql_exec_start HEADING "SQL START TIME" FORMAT A20; COL sql_id FORMAT A13; COL sql_text FORMAT A40; COL event FORMAT A33; COL wait_sec HEADING "WAIT (SEC)" FORMAT 99999; SELECT ses.inst_id || ':' || ses.sid AS inst_sid, ses.username, ses.machine, TO_CHAR(ses.sql_exec_start, 'YYYY-MM-DD HH24:MI:SS') AS sql_exec_start, ses.sql_id, SUBSTR(sql.sql_text, 1, 40) AS sql_text, SUBSTR( CASE WHEN ses.time_since_last_wait_micro = 0 THEN CASE ses.wait_class WHEN 'Idle' THEN 'IDLE: ' || ses.event ELSE ses.event END ELSE 'ON CPU' END, 1, 33 ) AS event, CASE WHEN ses.time_since_last_wait_micro = 0 THEN ses.wait_time_micro / 1000000 ELSE ses.time_since_last_wait_micro / 1000000 END AS wait_sec FROM gv$session ses LEFT JOIN gv$sql sql ON ses.sql_id = sql.sql_id WHERE ses.status = 'ACTIVE' AND ses.username IS NOT NULL AND ses.inst_id = SYS_CONTEXT('USERENV', 'INSTANCE') ORDER BY ses.sql_exec_start, ses.username, ses.sid; 
    该脚本可监控当前活跃SQL的执行时间、等待事件(如I/O等待、锁等待),帮助定位性能瓶颈。

0