(一)session相關視圖
(1)視圖
- v$session
- v$active_session_history
- dba_hist_active_session_history
如果是多節點數據庫,v$session和v$active_hist_session_history僅獲得單節點的信息,可以使用gv$sessiongv$active_session_history來獲取所有節點的信息。
(2)三個視圖介紹
(2.1)v$session
v$session視圖記錄了當前連接到數據庫的session信息,記錄的是實時的數據,當有新的會話連接到數據庫時,v$session就會產生一條新的session記錄,一旦會話斷開,記錄消除,所以v$session的信息是實時動態變化的。
視圖結構如下:
鏈接: v$session視圖介紹 ,其它2個視圖與其類似,不再介紹。
(2.2)v$active_session_history
v$active_session_history是記錄了數據庫活躍會話的采樣,如果是多節點,則用gv$active_session_history來查看所有節點的信息。每隔1秒鍾,數據庫會進行一次采樣,將活躍會話記錄到該視圖,每個活躍會話記錄一行。該視圖是ASH的核心,用以記錄活動SESSION的歷史等待信息,這部分內容記錄在內存中,期望值是記錄一個小時的內容。
關於活躍會話的定義,大致如下:會話在CPU進行運算或者是非空閑等待的會話都屬於活躍會話。官方解釋:A database session is considered active if it was on the CPU or was waiting for an event that didn't belong to the Idle
wait class. Refer to the V$EVENT_NAME
view for more information on wait classes.
圖1. v$active_session_history是ash報告的數據來源
(2.3)dba_hist_active_sess_history
視圖gv$active_session_history會每秒鍾將數據庫所有節點的活躍會話采樣一次,但是數據是存放在內存中的,無法長久保存。而dba_hist_active_sess_history則會將gv$active_session_history里的數據每10秒采樣一次並持久化保存。
(3)視圖數據流向
圖2.視圖數據流向
注意:這里需要非常注意,假如一個sql語句運行了100秒,那么會在v$active_session_history里面采集到100~101次,而v$dba_hist_active_session_history每隔10秒從v$active_session_history里面采集一次樣本,那么會采集到10~11次樣本,計算時間時需要x10.
(二)session相關視圖的用途
(1)使用v$session來查看實時阻塞會話
以前處理異常鎖的方式如下:
1.查詢blocking session
select se.machine,se.sid,se.serial#,se.seconds_in_wait,se.paddr,lo.block from v$lock lo, v$session se where lo.sid = se.sid and lo.block > 0; --bloc>0代表這個會話阻塞了其他會話
2.根據1的sid,serial#殺死會話
alter system kill session 'sid,serial#';
后來在EM里面的Blocking session里面看到下圖,以折疊圖的形式展現,最上面的代表正在阻塞其它session的會話,研究了一下,可以使用v$session來得到類似的效果。
圖1.blocking session樹形圖
我們來做一次測試,對表test01和test02進行DML操作,觀察運行情況,操作如下
(1)創建測試表test01,test02。並在2個表的id列添加主鍵約束
test01表 test02表
(2)對2個表進行操作,執行順序如下
----------------------------------------test01操作-------------------------------------------------------
[sessid:27 ] delete from test01; --刪除test01整個表的數據,未提交,阻塞源頭
[sessid:28 ] update test01 set name = 'aaa' where id = 1; --更新test01表id=1的行,會話產生等待
[sessid:142] insert into test01 values(1,'abc'); --插入test01表id=1的行,會話產生等待
[sessid:25 ] delete from test01 where id = 2; --刪除test01表id=2的行,會話產生等待
[sessid:29 ] update test01 set name = 'bbb' where id = 2; --更新test01表id=2的行,會話產生等待
-----------------------------------------test02操作--------------------------------------------------------
[sessid:30 ] insert into test02 values(3,'augly',3000); --插入test02表id=3的行,未提交,阻塞源頭
[sessid:23 ] insert into test02 values(3,'augly',3300); --插入test02表id=3的行,會話產生等待
此時我們到EM里面觀察,就會發現圖1的blocking session樹形圖。
在實際環境中,大部分系統是沒有安裝EM的,在沒有EM的情況下,我們依然可以通過v$session得到類似的圖形
--使用v$session來查看阻塞session信息 SELECT LPAD(' ',5*LEVEL-1)||S."USERNAME" AS user_name , LPAD(' ',5*LEVEL-1)||S."SID" AS session_id, S."SERIAL#", S."SQL_ID",
S."ROW_WAIT_OBJ#", S."WAIT_CLASS", S."EVENT", S."P1", S."P2", S."P3", S."SECONDS_IN_WAIT" FROM V$SESSION S WHERE S."BLOCKING_SESSION" IS NOT NULL OR S.SID IN(SELECT DISTINCT BLOCKING_SESSION FROM V$SESSION) START WITH S."BLOCKING_SESSION" IS NULL CONNECT BY PRIOR S."SID" = S."BLOCKING_SESSION";
結果如下,紅色的為阻塞源頭:
(2)使用v$active_session_history、dba_hist_active_sess_history來查看歷史阻塞會話信息
有時數據庫出現問題,而我們不在現場,事后需要分析當時的業務異常情況,可以使用v$active_session_history和dba_hist_active_sess_history來分析當時的情況。
使用dba_hist_active_sess_history的例子:https://www.cnblogs.com/lijiaman/p/10423272.html
【完】