debian

如何监控Debian上的Oracle性能

小樊
38
2025-12-26 23:54:27
栏目: 云计算

监控体系与工具选型

数据库层关键SQL与检查

SELECT s.inst_id||':'||s.sid AS inst_sid,
       s.username,
       (SYSDATE - s.sql_exec_start) DAY TO SECOND AS exec_dur,
       s.sql_id,
       SUBSTR(q.sql_text,1,60) AS sql_text,
       CASE WHEN s.wait_time_micro = 0 THEN
              CASE s.wait_class WHEN 'Idle' THEN 'IDLE: '||s.event ELSE s.event END
            ELSE 'ON CPU' END AS state,
       ROUND(CASE WHEN s.wait_time_micro = 0 THEN s.time_since_last_wait_micro
                 ELSE s.wait_time_micro END / 1e6, 2) AS wait_sec
FROM gv$session s
LEFT JOIN gv$sql q ON q.sql_id = s.sql_id AND q.inst_id = s.inst_id
WHERE s.status = 'ACTIVE'
  AND s.username IS NOT NULL
ORDER BY wait_sec DESC NULLS LAST
FETCH FIRST 20 ROWS ONLY;
SELECT sql_id, sql_text,
       ROUND(elapsed_time/1e6, 2) AS elapsed_sec,
       executions
FROM v$sql
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
SELECT a.tablespace_name,
       ROUND(a.bytes/1024/1024, 2) AS total_mb,
       ROUND((a.bytes - b.bytes)/1024/1024, 2) AS used_mb,
       ROUND((a.bytes - b.bytes)/a.bytes*100, 2) AS used_pct
FROM (SELECT tablespace_name, SUM(bytes) AS bytes
      FROM dba_data_files GROUP BY tablespace_name) a,
     (SELECT tablespace_name, SUM(bytes) AS bytes
      FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY used_pct DESC;
-- 查看快照范围
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot ORDER BY snap_id DESC;

-- 生成AWR报告(在SQL*Plus中执行,按提示选择开始/结束快照ID)
@?/rdbms/admin/awrrpt.sql

系统层与监听器的监控

自动化与告警落地

#!/usr/bin/env bash
ORACLE_SID=your_sid
ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID ORACLE_HOME PATH

THRESHOLD=80
ALERT_EMAIL=dba@example.com

sqlplus -S / as sysdba <<'EOF'
SET HEADING OFF FEEDBACK OFF
SELECT tablespace_name || ':' || ROUND(used_pct, 1)
FROM (
  SELECT a.tablespace_name,
         ROUND((a.bytes - b.bytes)/a.bytes*100, 1) AS used_pct
  FROM (SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_data_files GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_free_space GROUP BY tablespace_name) b
  WHERE a.tablespace_name = b.tablespace_name
)
WHERE used_pct > $THRESHOLD
/
EXIT
EOF

日常巡检清单与阈值建议

0
看了该问题的人还看了