監控帳號僅需「看」,不需「改」。透過封裝視圖暴露特定指標,徹底隔離底層字典表。
SQLPLUS / AS SYSDBA
CREATE USER db_monitor IDENTIFIED BY "MonPass#2024"
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp
ACCOUNT UNLOCK;
GRANT CREATE SESSION TO db_monitor; -- 僅連線權限,無 RESOURCE/CONNECT 角色
-- 表空間使用率視圖
CREATE OR REPLACE VIEW v_tablespace_usage AS
SELECT
a.tablespace_name,
ROUND(SUM(a.bytes)/1024/1024,2) AS total_mb,
ROUND(SUM(b.bytes)/1024/1024,2) AS free_mb,
ROUND(SUM(b.bytes)/SUM(a.bytes)*100,2) AS pct_free
FROM dba_data_files a
JOIN dba_free_space b ON a.file_id = b.file_id
GROUP BY a.tablespace_name;
-- 長時間運行 SQL 視圖
CREATE OR REPLACE VIEW v_longops AS
SELECT sid, serial#, opname, target, sofar, totalwork,
ROUND(sofar/totalwork*100,2) AS pct_done,
elapsed_seconds, time_remaining
FROM v$session_longops
WHERE totalwork > 0 AND sofar < totalwork;
-- 等待事件視圖
CREATE OR REPLACE VIEW v_wait_events AS
SELECT event, total_waits, time_waited_micro/1000000 AS time_waited_sec
FROM v$system_event
WHERE wait_class != 'Idle'
ORDER BY time_waited_micro DESC;
GRANT SELECT ON v_tablespace_usage TO db_monitor;
GRANT SELECT ON v_longops TO db_monitor;
GRANT SELECT ON v_wait_events TO db_monitor;
-- 持續新增視圖,權限同步授予
CONN db_monitor/MonPass#2024
SELECT * FROM USER_TAB_PRIVS; -- 僅顯示上述視圖權限
SELECT * FROM V_TABLESPACE_USAGE; -- 正常查詢
SELECT * FROM DBA_TABLES; -- ORA-00942: table or view does not exist
| 視圖名稱 | 監控指標 | 來源表/視圖 |
|---|---|---|
| V_TBS_USAGE | 表空間總量/剩餘/使用率 | DBA_DATA_FILES, DBA_FREE_SPACE |
| V_SESS_WAIT | 會話級等待事件 | V$SESSION_WAIT, V$SESSION |
| V_SQL_STATS | Top SQL (Buffer Gets/Elapsed/Executions) | V$SQL, V$SQLAREA |
| V_UNDO_USAGE | Undo 表空間使用/保留時間 | V$UNDOSTAT, DBA_TABLESPACES |
| V_ARCHIVE_GAP | Data Guard 歸檔差距 | V$ARCHIVE_GAP, V$DATABASE |
| V_ASM_DISK | ASM 磁碟組使用率/狀態 | V$ASM_DISKGROUP, V$ASM_DISK |
#!/bin/bash
# deploy_monitor_views.sh
sqlplus -s / as sysdba <
「視圖即介面,權限即契約」。監控帳號零物件、零 DML 權限、零字典直訪,視圖層統一管理邏輯變更,實現安全、穩定、可擴展的生產庫監控體系。