Oracle session相關數據字典(一)


(一)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.

ash

               圖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)視圖數據流向

image

                               圖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來得到類似的效果。

image

                                                                  圖1.blocking session樹形圖

我們來做一次測試,對表test01和test02進行DML操作,觀察運行情況,操作如下

(1)創建測試表test01,test02。並在2個表的id列添加主鍵約束

image image

         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";

結果如下,紅色的為阻塞源頭:

image

(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

 

【完】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM