整理 18 類高頻維護查詢,涵蓋 Session 識別、OS 進程關聯、SQL 文本提取、物件鎖定、資源消耗、阻塞鏈、等待事件、跟蹤文件定位等核心場景。所有查詢經實戰驗證,可直接收藏作為巡檢腳本庫。
SELECT SID, SERIAL#
FROM V$SESSION
WHERE AUDSID = SYS_CONTEXT('USERENV','SESSIONID');
SELECT p.SPID "OS Thread", b.NAME "Name-User", s.PROGRAM, s.SID, s.SERIAL#,
s.OSUSER, s.MACHINE
FROM V$PROCESS p, V$SESSION s, V$BGPROCESS b
WHERE p.ADDR = s.PADDR
AND p.ADDR = b.PADDR
AND (s.SID = &1 OR p.SPID = &1)
UNION ALL
SELECT p.SPID, s.USERNAME, s.PROGRAM, s.SID, s.SERIAL#,
s.OSUSER, s.MACHINE
FROM V$PROCESS p, V$SESSION s
WHERE p.ADDR = s.PADDR
AND (s.SID = &1 OR p.SPID = &1)
AND s.USERNAME IS NOT NULL;
SELECT /*+ PUSH_SUBQ */
COMMAND_TYPE, SQL_TEXT, SHARABLE_MEM, PERSISTENT_MEM, RUNTIME_MEM, SORTS,
VERSION_COUNT, LOADED_VERSIONS, OPEN_VERSIONS, USERS_OPENING, EXECUTIONS,
USERS_EXECUTING, LOADS, FIRST_LOAD_TIME, INVALIDATIONS, PARSE_CALLS,
DISK_READS, BUFFER_GETS, ROWS_PROCESSED, SYSDATE START_TIME,
SYSDATE FINISH_TIME, '>' || ADDRESS SQL_ADDRESS, 'N' STATUS
FROM V$SQLAREA
WHERE ADDRESS = (SELECT SQL_ADDRESS FROM V$SESSION WHERE SID = &SID);
SELECT p.SPID, s.SID, s.SERIAL# SERIAL_NUM, s.USERNAME USER_NAME,
a.TYPE OBJECT_TYPE, s.OSUSER OS_USER_NAME, a.OWNER,
a.OBJECT OBJECT_NAME,
DECODE(SIGN(48 - COMMAND), 1, TO_CHAR(COMMAND), 'Action Code #' || TO_CHAR(COMMAND)) ACTION,
p.PROGRAM ORACLE_PROCESS, s.TERMINAL TERMINAL, s.PROGRAM PROGRAM,
s.STATUS SESSION_STATUS
FROM V$SESSION s, V$ACCESS a, V$PROCESS p
WHERE s.PADDR = p.ADDR
AND s.TYPE = 'USER'
AND a.SID = s.SID
AND a.OBJECT = '&OBJ'
ORDER BY s.USERNAME, s.OSUSER;
SELECT s.OSUSER OS_USER_NAME,
DECODE(SIGN(48 - COMMAND), 1, TO_CHAR(COMMAND), 'Action Code #' || TO_CHAR(COMMAND)) ACTION,
p.PROGRAM ORACLE_PROGRAM, s.STATUS SESSION_STATUS, s.TERMINAL TERMINAL,
s.PROGRAM PROGRAM, s.USERNAME USER_NAME,
s.FIXED_TABLE_SEQUENCE ACTIVITY_METER, '' QUERY, 0 MEMORY,
0 MAX_MEMORY, 0 CPU_USAGE, s.SID, s.SERIAL# SERIAL_NUM
FROM V$SESSION s, V$PROCESS p
WHERE s.PADDR = p.ADDR
AND s.TYPE = 'USER'
ORDER BY s.USERNAME, s.OSUSER;
SELECT n.NAME, v.VALUE, n.CLASS, n.STATISTIC#
FROM V$STATNAME n, V$SESSTAT v
WHERE v.SID = &SID
AND v.STATISTIC# = n.STATISTIC#
ORDER BY n.CLASS, n.STATISTIC#;
SELECT s.SCHEMANAME SCHEMA_NAME,
DECODE(SIGN(48 - COMMAND), 1, TO_CHAR(COMMAND), 'Action Code #' || TO_CHAR(COMMAND)) ACTION,
s.STATUS SESSION_STATUS, s.OSUSER OS_USER_NAME, s.SID, p.SPID,
s.SERIAL# SERIAL_NUM, NVL(s.USERNAME,'[Oracle process]') USER_NAME,
s.TERMINAL TERMINAL, s.PROGRAM PROGRAM, st.VALUE CRITERIA_VALUE
FROM V$SESSTAT st, V$SESSION s, V$PROCESS p
WHERE st.SID = s.SID
AND st.STATISTIC# = 38 -- 38 = session logical reads (可改 12=cpu, 11=physical reads)
AND ('ALL' = 'ALL' OR s.STATUS = 'ALL')
AND p.ADDR = s.PADDR
ORDER BY st.VALUE DESC, p.SPID ASC, s.USERNAME ASC, s.OSUSER ASC;
SELECT /*+ RULE */
ls.OSUSER OS_USER_NAME, ls.USERNAME USER_NAME,
DECODE(ls.TYPE, 'RW','Row wait enqueue lock','TM','DML enqueue lock',
'TX','Transaction enqueue lock','UL','User supplied lock') LOCK_TYPE,
o.OBJECT_NAME OBJECT,
DECODE(ls.LMODE, 1,NULL,2,'Row Share',3,'Row Exclusive',
4,'Share',5,'Share Row Exclusive',6,'Exclusive',NULL) LOCK_MODE,
o.OWNER, ls.SID, ls.SERIAL# SERIAL_NUM, ls.ID1, ls.ID2
FROM SYS.DBA_OBJECTS o,
(SELECT s.OSUSER, s.USERNAME, l.TYPE, l.LMODE, s.SID, s.SERIAL#, l.ID1, l.ID2
FROM V$SESSION s, V$LOCK l WHERE s.SID = l.SID) ls
WHERE o.OBJECT_ID = ls.ID1
AND o.OWNER <> 'SYS'
ORDER BY o.OWNER, o.OBJECT_NAME;
SELECT ws.CLASS, ws.COUNT "COUNT", SUM(ss.VALUE) SUM_VALUE
FROM V$WAITSTAT ws, V$SYSSTAT ss
WHERE ss.NAME IN ('db block gets','consistent gets')
GROUP BY ws.CLASS, ws.COUNT;
SELECT p.PID, p.SPID, s.PROGRAM, s.SID, s.SERIAL#
FROM V$PROCESS p, V$SESSION s
WHERE s.PADDR = p.ADDR;
SELECT SID, USERNAME, EVENT, BLOCKING_SESSION, SECONDS_IN_WAIT, WAIT_TIME
FROM V$SESSION
WHERE STATE = 'WAITING'
AND WAIT_CLASS != 'Idle';
COL USER_NAME FOR A32
SELECT /*+ RULE */
LPAD(' ', DECODE(l.XIDUSN,0,3,0)) || l.ORACLE_USERNAME USER_NAME,
o.OWNER, o.OBJECT_NAME, s.SID, s.SERIAL#
FROM V$LOCKED_OBJECT l, DBA_OBJECTS o, V$SESSION s
WHERE l.OBJECT_ID = o.OBJECT_ID
AND l.SESSION_ID = s.SID
ORDER BY o.OBJECT_ID, l.XIDUSN DESC;
COL USERNAME FOR A15
COL LOCK_LEVEL FOR A8
COL OWNER FOR A18
COL OBJECT_NAME FOR A32
SELECT /*+ RULE */
s.USERNAME,
DECODE(l.TYPE,'tm','table lock','tx','row lock',NULL) LOCK_LEVEL,
o.OWNER, o.OBJECT_NAME, s.SID, s.SERIAL#
FROM V$SESSION s, V$LOCK l, DBA_OBJECTS o
WHERE l.SID = s.SID
AND l.ID1 = o.OBJECT_ID(+)
AND s.USERNAME IS NOT NULL;
-- 歷史等待事件統計
SELECT se.SID, s.USERNAME, se.EVENT, se.TOTAL_WAITS, se.TIME_WAITED, se.AVERAGE_WAIT
FROM V$SESSION s, V$SESSION_EVENT se
WHERE s.USERNAME IS NOT NULL
AND se.SID = s.SID
AND s.STATUS = 'ACTIVE'
AND se.EVENT NOT LIKE '%SQL*Net%'
ORDER BY s.USERNAME;
-- 當前等待
SELECT s.SID, s.USERNAME, sw.EVENT, sw.WAIT_TIME, sw.STATE, sw.SECONDS_IN_WAIT
FROM V$SESSION s, V$SESSION_WAIT sw
WHERE s.USERNAME IS NOT NULL
AND sw.SID = s.SID
AND sw.EVENT NOT LIKE '%SQL*Net%'
ORDER BY s.USERNAME;
COL EVENT FOR A24
COL P1TEXT FOR A12
COL P2TEXT FOR A12
COL P3TEXT FOR A12
SELECT SID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3
FROM V$SESSION_WAIT
WHERE EVENT NOT LIKE '%SQL%'
AND EVENT NOT LIKE '%rdbms%'
AND EVENT NOT LIKE '%mon%'
ORDER BY EVENT;
-- Latch 等待對應
SELECT NAME, WAIT_TIME
FROM V$LATCH l
WHERE EXISTS (
SELECT 1 FROM (
SELECT SID, EVENT, P1TEXT, P1, P2TEXT, P2, P3TEXT, P3
FROM V$SESSION_WAIT
WHERE EVENT NOT LIKE '%SQL%' AND EVENT NOT LIKE '%rdbms%' AND EVENT NOT LIKE '%mon%'
) x WHERE x.P1 = l.LATCH#);
COL OWNER FOR A18
COL SEGMENT_NAME FOR A32
COL SEGMENT_TYPE FOR A32
SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE
FROM DBA_EXTENTS
WHERE FILE_ID = &FILE_ID
AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
-- 1. 找 SID, SERIAL#
SELECT s.SID, s.SERIAL#
FROM V$SESSION s, V$PROCESS p
WHERE s.PADDR = p.ADDR
AND p.SPID = &1;
-- 2. 開啟 Trace
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(&SID, &SERIAL#, TRUE);
-- 3. 關閉 Trace
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(&SID, &SERIAL#, FALSE);
SELECT p1.VALUE || '/' || p2.VALUE || '_ora_' || p.SPID || '.ora' FILENAME
FROM V$PROCESS p, V$SESSION s, V$PARAMETER p1, V$PARAMETER p2
WHERE p1.NAME = 'user_dump_dest'
AND p2.NAME = 'instance_name'
AND p.ADDR = s.PADDR
AND s.AUDSID = USERENV('SESSIONID')
AND p.BACKGROUND IS NULL
AND INSTR(p.PROGRAM, 'CJQ') = 0;
SELECT DO.OBJECT_NAME, LO.SESSION_ID, LO.PROCESS, LO.LOCKED_MODE
FROM V$LOCKED_OBJECT LO, DBA_OBJECTS DO
WHERE LO.OBJECT_ID = DO.OBJECT_ID;
alias lockchk='sqlplus -s / as sysdba @/scripts/lock_check.sql'SELECT_CATALOG_ROLE、EXECUTE ON DBMS_SYSTEM這 18 類查詢覆蓋了 DBA 90% 的日常排查場景。**熟練掌握 V$SESSION、V$PROCESS、V$LOCK、V$SQLAREA、V$SESSTAT、DBA_OBJECTS、DBA_EXTENTS 的關聯關係**,能在故障發生第一時間定位根因。建議每位 DBA 將常用查詢整理為個人「工具箱」,定期演練模擬故障排查,肌肉記憶勝過文檔查閱。