Oracle Session&Process
一. v$session
每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。
- SADDR: session address
- SID: session identifier,常用于连接其它列。
- SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
- AUDSID: audit session id。可以通过audsid查询当前session的sid。
select sid from v$session where audsid=userenv('sessionid');
- PADDR: process address,关联v$process的addr字段,可以通过这个字段查处当前session对应操作系统的那个进程的id。
- USER#: session's user id。等于dba_users中的user_id。Oracle内部进程的user#为0。
- USERNAME: session's username。等于dba_users中的username。Oracle内部进程的username为空。
- COMMAND: session正在执行的SQL Id。1代表create table,3代表select。
- TADDR: 当前的transaction address。可以用来关联v$transaction的addr字段。
- LOCKWAIT: 可以通过这个字段查询出当前正在等待的锁的相关信息。sid & lockwait与v$lock中的sid & kaddr相对应。
- STATUS: 用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
- PROCESS: 客户端process id。
- MACHINE: 客户端machine name。
- TERMINAL: 客户端执行的terminal name。
- PROGRAM: 客户端应用程序。比如ORACLE.EXE (PMON)或者sqlplus.exe
- SQL_ADDRESS, SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER: session正在执行的sql statement,和v$sql中的address, hash_value, sql_id, child_number相对应。
二. v$process
- ADDR: process address。可以和v$session的paddr字段关联。
- PID: Oracle进程identifier。
SPID
: 操作系统进程identifier。- PNAME:进程名字,如PMON,SMON。
- USERNAME: 操作系统进程的用户名。并非Oracle用户名。
- SERIAL#:: process serial number。
- TERMINAL: 操作系统terminal identifier(e.g., computer name)。
- PROGRAM: 进程正在执行的程序(e.g., ORACLE.EXE (ARC0)),和v$session中的program类似。
- TRACEFILE: trace文件路径。
BACKGROUND: 1代表oracle background process,null代表normal process。
三. 常用脚本
--windows 下kill会话
cmd>orakill 实例 spid
--查看阻塞
select sid ,
SERIAL#,
final_blocking_session as blocking_session,
SECONDS_IN_WAIT,
(select sql_text from gv$sqltext where sql_id = A.sql_id) as exec_sql,
(select sql_text from gv$sqltext where sql_id = A.prev_sql_id) as prev_sql,
inst_id,
username,
TERMINAL,
program
from gv$session A
where sid in (select session_id from gv$locked_object)
--top 20 SQL
SELECT round(100 * a.pct, 2) pct
,round(a.elapsed_time / 1000000, 2) elapsed_time
,round(a.elapsed_time / a.executions / 1000000) second_by_exec
,round(a.cpu_time / 1000000, 2) cpu_time
,round(a.buffer_gets / a.executions) avg_gets
,round(a.DISK_READS / a.executions) avg_reads
,a.executions as executions
,s.sql_text
FROM (
SELECT *
FROM (
SELECT elapsed_time
,ratio_to_report(elapsed_time) OVER () pct
,cpu_time
,buffer_gets
,disk_reads
,executions
,address
,hash_value
FROM v$sql
ORDER BY elapsed_time DESC
)
WHERE rownum < 20
) a
,v$sqlarea s
WHERE a.address = s.address
AND a.hash_value = s.hash_value
AND a.executions <> 0
ORDER BY pct DESC
,cpu_time DESC