v$session/v$process檢視涉及的相關會話資訊的查詢
本文根據效能分析的一般思路來進行:
先看OS資源,確定CPU/記憶體消耗最多的程序,從程序找到會話,再檢視會話詳細資訊:包括會話型別、執行的SQL等等。
各種查詢
1.查當前會話SID
[email protected] bys3>select sid from v$mystat where rownum=1;SID
----------
44
查詢當前資料庫有哪些會話,有哪些使用者,從哪些終端連線的
select username,machine,program from v$session where type='USER';
查詢當前資料庫內會話的SPID,PID,使用者名稱,客戶端主機名,客戶端程式
select b.spid,a.sid,a.username,a.program,a.machine from v$session a,v$process b where a.paddr=b.addr and a.type='USER';
查詢當前資料庫內會話的SPID,PID,使用者名稱,客戶端主機名,客戶端程式以及使用者會話是活動的--正在執行SQL或被阻塞
select b.spid,a.sid,a.username,a.program,a.machine from v$session a,v$process b where a.paddr=b.addr and a.type='USER' and a.status='ACTIVE';
############################################################################
2.作業系統上查程序PID,以及伺服器程序所佔用CPU 內在資源。LOCAL=NO表示是通過網路連線。
ps -ef顯示的列依次是:1.UID 使用者ID 2.PID 程序ID 3.PPID 父程序ID 4.C CPU佔用率 5.STIME 開始時間 6.TTY 開始此程序的TTY 7.TIME 此程序執行的總時間 8.CMD 命令名UID PID PPID C STIME TTY TIME CMD
[
oracle 25868 1 0 14:24 ? 00:00:04 oraclebys3 (LOCAL=NO)
oracle 29048 29045 0 18:52 ? 00:00:00 oraclebys3 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
ps aux顯示的列依次是:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[[email protected] dbs]$ ps aux|grep LOCAL |grep -v grep
oracle 29313 0.0 2.0 326852 42996 ? Ss 19:14 0:00 oraclebys3 (LOCAL=NO)
oracle 29392 0.1 1.9 326796 40992 ? Ss 19:19 0:01 oraclebys3 (LOCAL=NO)
oracle 29550 0.0 1.7 326984 35148 ? Ss 19:28 0:00 oraclebys3 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
############################################################################
3.通過程序PID查詢會話SID及通過會話SID找程序PID語句:
通過程序SPID找會話SID[email protected] bys3>select s.sid from v$session s,v$process p where s.paddr=p.addr and p.spid=29550;
SID
----------
44
通過當前會話SID找程序PID:
[email protected] bys3>select p.spid from v$session s,v$process p where s.paddr=p.addr and s.sid=(select sid from v$mystat where rownum=1); 如果查其它會話SID,直接輸入相應SID即可
SPID
------------------------
29550
使用OSPID或者SID之一來查詢:
[email protected] bys3> select p.spid as ospid,s.sid from v$session s,v$process p where s.paddr=p.addr and (s.sid=&sid or p.spid=&ospid);
Enter value for sid: 888
Enter value for ospid: 29887
old 1: select p.spid as ospid,s.sid from v$session s,v$process p where s.paddr=p.addr and (s.sid=&sid or p.spid=&ospid)
new 1: select p.spid as ospid,s.sid from v$session s,v$process p where s.paddr=p.addr and (s.sid=888 or p.spid=29887)
OSPID SID
------------------------ ----------
29887 42
select p.spid,p.PGA_USED_MEM/1024/1024 MB,p.PGA_ALLOC_MEM/1024/1024 MB,p.PGA_MAX_MEM/1024/1024 MB from v$session s,v$process p where s.paddr=p.addr and s.sid=(select sid from v$mystat where rownum=1);
############################################################################
4.通過會話SID檢視會話詳細的資訊
示例1:查會話使用的ORACEL資料庫使用者名稱、此會話最近一次執行的SQL命令(需要通過COMMAND欄位的數字查詢相應表選出,如這裡3是select),當前會話狀態是ACTIVE活動的,表示有SQL語句正在執行(SQL正執行或補阻塞),以及當前伺服器連線模式(專有還是共享)
[email protected] bys3>col username for a10[email protected] bys3>select sid,user#,username,command,ownerid,status,server from v$session where sid=44;
SID USER# USERNAME COMMAND OWNERID STATUS SERVER
---------- ---------- ---------- ---------- ---------- -------- ---------
44 32 BYS 3 2147483644 ACTIVE DEDICATED
############################################################################
示例2:檢視44號使用者程序的客戶端相關資訊:客戶端的OS使用者名稱、客戶端程序號、客戶端主機名、客戶端程式、登陸時間等。
col sid for 99999col osuser for a10
col machine for a10
col program for a20
col service_name for a10
col logon_time for a10
col process for a10
set linesize 200
[email protected] bys3>select sid,osuser,process,machine,program,type,service_name,sql_trace,logon_time,resource_consumer_group from v$session where sid=44;
SID OSUSER PROCESS MACHINE PROGRAM TYPE SERVICE_NA SQL_TRAC LOGON_TIME RESOURCE_CONSUMER_GROUP
---- ---------- ---------- ---------- -------------------- ---------- ---------- -------- ---------- --------------------------------
44 oracle 29547 bys3.bys.c [email protected] USER SYS$USERS DISABLED 2013/11/24 OTHER_GROUPS
om (TNS V1-V3) 19:28:22
############################################################################
示例3:查詢會話當前執行的SQL語句及上一條SQL語句的sql_id從而查出SQL_TEXT--注意要關閉serveroutput:set serveroutput off
會話47:刪除不提交[email protected] bys3>delete a;
1 row deleted.
會話34:先刪除一行新插入的值8,可以刪除。刪除整張表,則發生等待-
21:19:11 [email protected] bys3>select sid from v$mystat where rownum=1;
SID
----------
34
21:19:18 [email protected] bys3>insert into a values(8);
1 row created.
21:19:23 [email protected] bys3>select * from a;
B
----------
8
55
7
3
21:19:27 [email protected] bys3>delete a where b=8;
1 row deleted.
21:19:32 [email protected] bys3>delete a; ----此時會話一直在等待執行
會話32:查詢會話34的SQL語句資訊
[email protected] bys3>col sql_text for a30
[email protected] bys3>select sql_id,sql_text from v$sql where sql_id in('96vz122hk9mtq','dmmj3tuc9ynbj');
SQL_ID SQL_TEXT
------------- ------------------------------
96vz122hk9mtq delete a ----可以查出當前SQL語句是delete a
dmmj3tuc9ynbj delete a where b=8 --可以查出上一條SQL語句是delete a where b=8
注意事項:要關閉serveroutput:set serveroutput off ,如果set serveroutput on,則查出的上一條SQL語句就成了:BEGIN DBMS_OUTPUT.GET_LINES(:LINES, :NUMLINES); END; 關於 DBMS_OUTPUT官方文件介紹如下:http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_output.htm 其中有一節是關閉DBMS_OUTPUT的描述: DISABLE Procedure:
This procedure disables calls to PUT, PUT_LINE, NEW_LINE, GET_LINE, and GET_LINES, and purges the buffer of any remaining information.
As with the ENABLE Procedure, you do not need to call this procedure if you are using the SERVEROUTPUT option of SQL*Plus. 如果開啟SQLPLUS中的SERVEROUTPUT選項,不需要呼叫這個程序。即開啟SERVEROUTPUT選項呼叫此過程。故set serveroutput off即可。
############################################################################
示例4:檢視某個會話的鎖/阻塞等情況及簡單解決思路--查當前系統中存在'TM','TX')等待的SQL語句:
同時開啟兩個會話,在會話SID 38,刪除表B不提交;在會話SID為43,同時刪除B表,此時會話43處於等待狀態。從會話38查詢會話43的會話的阻塞資訊:[email protected] bys3>col event for a20
[email protected] bys3>select sid,row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row#,blocking_session_status,blocking_session,event#,event from v$session where sid=43;
SID ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# BLOCKING_SE BLOCKING_SESSION EVENT# EVENT
---------- ------------- -------------- --------------- ------------- ----------- ---------------- ---------- --------------------
43 21428 4 167 0 VALID 38 241enq: TX - row lock contention
可以看到ROW_WAIT_OBJ#為21428,可以通過DBA_OBJECTS檢視的OBJECT_ID查出。blocking_session_status欄位值為VALID 表明有阻塞,BLOCKING_SESSION欄位可以看到43會話是被38號會話阻塞,EVENT事件是:行鎖爭用。
[email protected] bys3>select object_name from dba_objects where object_id=21428;
OBJECT_NAME
-----------------------------
B
可以從v$lock中查詢38及43會話的相關的鎖狀態:38號會話阻塞了43號-BLOCK列,關於鎖,詳見:http://blog.csdn.net/q947817003/article/details/13274845
[email protected] bys3>select * from v$lock where sid in(38,43);
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
28635B24 28635B50 38 AE 100 0 4 0 818 0
28635E88 28635EB4 43 AE 100 0 4 0 1232 0
28636550 2863657C 43 TX 655393 1107 0 6 810 0
B69AC7D8 B69AC808 43 TM 21428 0 3 0 810 0
B69AC7D8 B69AC808 38 TM 21428 0 3 0 815 0
276BBFB8 276BBFF8 38 TX 655393 1107 6 0 815 1
查當前系統中存在'TM','TX')等待的SQL語句:
[email protected] bys3>select a.*,b.sid,b.username from v$sqltext a,v$session b,v$lock c where a.sql_id=b.sql_id and b.sid=c.sid and c.type in('TM','TX');
ADDRESS HASH_VALUE SQL_ID COMMAND_TYPE PIECE SQL_TEXT SID USERNAME
-------- ---------- ------------- ------------ ---------- ------------------------------ ---------- ----------
2461AC9C 2848502917 gbxry2ynwjd45 6 0 update test set status=99 44 BYS
如果查詢到有阻塞並遲遲不能釋放進而影響了業務正常執行,可以手工KILL掉。方法如下:
[email protected] bys3>alter system kill session '38,1521'; --不能KILL掉當前會話38--38,1521對應SID/serial#
alter system kill session '38,1521'
*
ERROR at line 1:
ORA-00027: cannot kill current session
新開啟一會話:
[email protected] bys3>alter system kill session '38,1521';
System altered.
此時返回原會話38:執行查詢返回錯誤:ORA-00028: your session has been killed
[email protected] bys3>select sid,serial# from v$session where sid=38;
select sid,serial# from v$session where sid=38
*
ERROR at line 1:
ORA-00028: your session has been killed
此時檢視43號會話,原來被阻塞的SQL語句得以執行:
[email protected] bys3>delete b; ---因為阻塞,所以語句執行時間顯示是17分鐘
1 row deleted.
Elapsed: 00:17:24.84
能解決物件被鎖定問題
1、select * from v$locked_object 查出被鎖定的物件,其中object_id是物件的ID,session_id是被鎖定物件有session ID;2、select object_name, object_type from dba_objects where object_id = 剛才查出來的object_id;(根據v$locked_object裡的object_id提出來的)
這樣來查被鎖定這個物件的名字,如果能確定是哪個TABLE被鎖並且要解鎖,則再執行
3、select sid, serial#, machine, program from v$session where sid =第1步中查出來的session_id;(是根據v$locked_object對應鎖定記錄的session_id找出來的) 然後
4、alter system kill session ‘sid,serial#’;用來殺死這個會話;
--找出互相阻塞的會話:
select a.sid blocker_sid,a.serial#,a.username as blocker,b.type,decode(b.lmode,0,'None',1,'Null',2,'Row share',
3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,
b.ctime as time_held,c.sid as waiter_sid,
decode(c.request,0,'None',1,'Null',2,'Row share',
3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,
c.ctime time_waited
from v$lock b, v$enqueue_lock c, v$session a
where a.sid = b.sid
and b.id1 = c.id1(+)
and b.id2 = c.id2(+)
and c.type(+) = 'TX'
and b.type = 'TX'
and b.block = 1
order by time_held, time_waited desc;
相關推薦
v$session/v$process檢視涉及的相關會話資訊的查詢
關於伺服器程序與使用者程序概念及v$session/V$PROCESS檢視簡介 ,詳見:http://blog.csdn.net/q947817003/article/details/16922457 本文根據效能分析的一般思路來進行: 先看OS資源,確定CPU/記憶體消耗
Oracle 動態效能表 v$session & v$process各個欄位的說明
v$session 參照: v$session描述的物件是一個會話。 v$session描述的物件是一個當前存在的會話(該會話不是包括當前連線到資料庫的會話,這只是資料庫前臺伺服器程序的會話,還有資料庫後臺程序的會話,它是沒有連線的)。 下面對v$session裡
v$session & v$process各欄位的說明【轉載】
整理自google出來的網路資源。google是個好東東。沒有google我會心神不寧。 v$session SADDR: session address SID: session identifier,常用於連線其它列。 SERIAL#: sid 會重用,但是同一個sid被重用時,serial#會
Oracle v$session/v$sql 表
aps sql語言 成本 text 物理 ets val nbsp prev 在本視圖中,每一個連接到數據庫實例中的 session都擁有一條記錄。包括用戶 session及後臺進程如 DBWR, LGWR, arcchiver等等。 V$SESSION中的常用列 V$SE
v$session v$lock v$locked_object
讀蓋老師的書,看到了一個例子.自己動手做了一下 開啟一個session執行以下語句 [email protected]>select * from emp for update; EMPNO ENAME JOB
關於v$session 和v$process 如何殺掉session(會話),以及如何找到會話對應的系統程序ID
v$session 主要存放一些客戶端資訊詳情請看官方文件 v$process 主要存放一些服務端程序相關的資訊請看官方文件 獲取當前系統session數和process數 select count(*) from v$session select count(*)
轉--v$session & v$process各字段的說明【轉載】
lte 個數 是個 join 系統進程 com to_char sel info Oracle 動態性能表 v$session & v$process 整理自google出來的網絡資源。google是個好東東。沒有google我會心神不寧。 v$sessi
PL/SQL 報錯:動態執行表不可訪問,本會話的自動統計被禁止。 在執行選單裡你可以禁止統計,或在v$session,v$sesstat 和vSstatname表裡獲得選擇許可權。
現象: 第一次用PL/SQL Developer連線資料庫,若用sys使用者登入並操作則正常,若用普通使用者比如haishu登入並建立一個表則報錯“動態執行表不可訪問,本會話的自動統計被禁止。在執行選單裡你可以禁止統計,或在v$session,v$sesstat和v$statname表裡獲得選擇許可權。
oracle sql資源消耗相關檢視:v$sql,v$sqlarea,v$sqltext
今天要驗證一個Full table scan問題的patch,需要分析一下sql執行情況,用到了v$sqlarea檢視,感覺這篇文章講得挺明白,摘抄一部分做個讀書筆記。 1 常用檢視說明 Oracle sql語句資源消耗監控,最常用的系統檢視有: v$sql
動態執行表不可訪問, 本會話的自動統計被禁止。在執行選單裡你可以禁止統計, 或在v$session, ...
1. 問題描述 使用oracle圖形管理工具PLSQL Developer執行sql語句時彈出以下資訊: "動態執行表不可訪問, 本會話的自動統計被禁止。在執行選單裡你可以禁止統計, 或在v$session,v$sesstat和v$statname表裡獲得選擇許可權。" 如
怎麽給普通用戶付給權限,讓它能讀取v$session表
ref sysdba dba develop devel clas href spl .com http://blog.itpub.net/1482/viewspace-835835/ 步驟 SQL> select * from v$s
動態執行表不可訪問,或在v$session
SQ 原因分析 相關 public 創建 center 操作方法 plsql 數據 PLSQL Developer報“動態執行表不可訪問,本會話的自動統計被禁止”的解決方案 PLSQL Developer報“動態執行表不可訪問,本會話的自動統計被禁止”的解決方案 現
oracle 學習-V$SESSION
欄位祥解: V$SESSION 顯示每個當前會話的會話資訊。 柱 資料型別 描述 SADDR RAW(4 | 8) 會話地址 SID
Oracle中V$SESSION等各表的欄位解釋,Oracle官方解釋
一、常用的檢視 1.會話相關檢視 View Description V$PROCESS Contains information about the currently active processes
oracle系統表v$session、v$sql欄位說明
在本檢視中,每一個連線到資料庫例項中的 session都擁有一條記錄。包括使用者 session及後臺程序如 DBWR, LGWR, arcchiver等等。 V$SESSION中的常用列 V$SESSION是基礎資訊檢視,用於找尋使用者 SID或 SADDR。不過,它也有一些列會動態的變化,可用於檢查使用
檢視 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的差異
檢視v$sql,v$sqlarea,v$sqltext,v$sqltext_with_newlines 是幾個經常容易混淆的檢視,主要是提供library cache中當前快取的sql語句的資訊。這幾個檢視都可以提供當前有關sql語句的具體資訊,但稍有差異。本文主
在v$session表中記錄客戶端IP
我們在查詢v$session表時,只能看到客戶端的機器名,而無法看到客戶機的IP地址。要想檢視IP地址可以建立一個數據庫級別的觸發器,在成功使用者登陸資料庫後將客戶的IP地址寫入v$session的client_info欄位中。 按如下方法建立這個觸發器(trigger):
Oracle V$SESSION詳解
select * from v$open_cursor where sid = :sid; d. 查詢使用者當前的等待資訊. 以檢視當前的語句為什麼這麼慢/在等待什麼資源. select * from v$session_wait where sid = :sid ; e.
【Oracle】詳解v$session
ilove error datafile ase 實例 ted lba terminal 內存 首先查看一下v$session都存在哪些列 SYS@ORCL>desc v$session Name
oracle系統表v$session、v$sql欄位說明(轉)
在本檢視中,每一個連線到資料庫例項中的 session都擁有一條記錄。包括使用者 session及後臺程序如 DBWR, LGWR, arcchiver等等。 V$SESSION中的常用列 V$SESSION是基礎資訊檢視,用於找尋使用者 SID或 SADDR。不過,它也有一些列會動態的變化,可用於檢查