當前位置:首頁 » 數據倉庫 » oracle資料庫session
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

oracle資料庫session

發布時間: 2022-04-04 16:23:32

㈠ oracle資料庫session_roles表

session_roles 是指當前用戶被激活的角色
自定義的角色在dba_roles裡面查

㈡ 如何查看oracle資料庫中哪些session異常阻塞了系統

這時候需要找出造成異常阻塞的session並清除。 oracle session通常具有三個特徵: (1)一個session可能阻塞多個session; (2)一個session最多被一個session阻塞; (3)session阻塞關系不會形成環路。(環路即死鎖,oracle能自動解除) 因此session的阻塞關系為一棵樹,進而DB系統所有session的BLOCK阻塞關系是一個由若干session阻塞關系樹構成的森林,而異常session一定會在故障爆發時成為根(root)。因此,找尋異常鎖表session的過程就是找出異常的root。 一般認為異常root有兩個特徵:(1)block樹的規模過大,阻塞樹規模即被root層層阻塞的session總數;(2)阻塞的平均等待時間過長。 查找異常session的方法一: OEM—> performance—> Blocking Sessions 查找異常session的方法二: select r.root_sid, s.serial#, r.blocked_num, r.avg_wait_seconds, s.username,s.status,s.event,s.MACHINE, s.PROGRAM,s.sql_id,s.prev_sql_id from (select root_sid, avg(seconds_in_wait) as avg_wait_seconds, count(*) - 1 as blocked_num from (select CONNECT_BY_ROOT sid as root_sid, seconds_in_wait from v$session start with blocking_session is null connect by prior sid = blocking_session) group by root_sid having count(*) > 1) r, v$session s where r.root_sid = s.sid order by r.blocked_num desc, r.avg_wait_seconds desc; 該SQL語句即是根據v$session的欄位blocking_session統計阻塞樹根阻塞session的計數以及平均阻塞時間、並進行排序,排名最前的往往是異常session。

㈢ 怎麼用session向oracle資料庫添加

1 audit
用審記來記錄用戶的操作信息
2 trigger
用系統觸發器來記錄用戶登錄
3 logmnr
從log文件中挖出用戶登錄信息

推薦使用第3種,不佔用系統資源,而且很方便。

===============================
Oracle 中記錄用戶登錄信息
我們可以使用 Oracle Audit 函數來記錄用戶登錄信息,但是如果開放了 Audit 函數將會使Oracle 性能下降,甚至導致 Oracle 崩潰。那我們如何才能記錄用戶登錄信息呢?其實我們可以通過建立觸發器的方式來實現。方法如下:
1. 用 sys 用戶登錄 Oracle
2. 創建記錄用戶登錄信息的表
CREATE TABLE LOG$INFORMATION
(
ID NUMBER(10),
USERNAME VARCHAR2(30),
LOGINTIME DATE,
TERMINAL VARCHAR2(50),
IPADRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
PROGRAM VARCHAR2(64),
SID NUMBER,
SERIAL# NUMBER,
AUSID NUMBER
)
/

3. 創建一個 Sequence,作為登錄信息的主鍵
CREATE SEQUENCE LOGIN_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
cache 20
/

4. 創建觸發器,記錄用戶登錄信息
CREATE OR REPLACE TRIGGER LOGIN_RECORD_TR
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
SELECT * FROM v$session
WHERE audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
FETCH cSession INTO mtSession;
IF cSession%FOUND AND SYS_CONTEXT ('USERENV','IP_ADDRESS') IS NOT NULL THEN
INSERT INTO log$information(
id,
username,
logintime,
terminal,
ipadress,
osuser,
machine,
program,
sid,
serial#,
ausid
) VALUES(
login_seq.nextval,
USER,
SYSDATE,
mtSession.Terminal,
SYS_CONTEXT ('USERENV','IP_ADDRESS'),
mtSession.Osuser,
mtSession.Machine,
mtSession.Program,
mtSession.Sid,
mtSession.Serial#,
userenv('SESSIONID')
);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/

5. 將 SYS.LOG$INFORMATION 授權給需要查看登錄記錄的用戶
Grant select on SYS.LOG$INFORMATION to XXX
/

=======================================
審計用戶登錄和登出
記錄每個用戶每次登錄資料庫和退出資料庫的日期和事件。設置步驟如下:
1. 設置系統審計相關的參數
2. 重新啟動資料庫
3.以SYSTEM帳號登錄資料庫執行下列語句,設置CONNECT審計並檢查是否設置成功:
SQL> connect system/password
SQL> audit connect
SQL> col user_name format a11
SQL> col audit_option format a14
SQL> select user_name, audit_option, success, failure
from sys.dba_stmt_audit_opts;
USER_NAME AUDIT_OPTION SUCCESS FAILURE
----------- -------------- ---------- ----------
CREATE SESSION BY ACCESS BY ACCESS

4.查詢 AUD$表就可以查看到審計結果了

SQL> col userid format a8
SQL> select sessionid, to_char(timestamp#,'DD-MON-YY:HH24:MI:SS') login,
userid, to_char(logoff$time,'DD-MON-YY:HH24:MI:SS') logoff
from sys.aud$ where userid='SCOTT';

SESSIONID LOGIN USERID LOGOFF
---------- ------------------ -------- ------------------
132 22-FEB-00:13:55:06 SCOTT 22-FEB-00:14:04:05
注意:不同的版本的ORACLE資料庫AUD$字典會有所不同,實際情況請參照你當前版本的資料庫的AUD$表。
1.4.11 審計SYS用戶的操作(ORACLE 9i Release 2)
在ORACLE 9.2之前,SYS帳戶是系統中的一個唯一不受審計的帳戶。在ORACLE 9I Release 2和以後的版本中,通過一些設置就可以對SYS帳號進行審計。
在ORACLE 9.2以後的版本中,可以通過設置AUDIT_SYS_OPERATIONS可以實現對具有SYS/SYSDBA/SYSOPER許可權的用戶的審計。
1.4.12 使用WINDOWS 事件管理器來記錄審計信息
和UNIX系統不同,WINDOWS的審計結果不是存儲在操作系統文件中,而是直接存儲在WINDOWS 事件日誌中。本節介紹如何配置資料庫審計,並用事件管理器來查看審計記錄。
在WINDOWS下設置資料庫審計,需要按照如下的步驟:
1、配置審計
首先要確認WINDOWS的事件日誌(EVENTLOG)服務是否啟動。可以通過「控制面板/管理工具/服務」工具來查看。
然後通過修改ORACLE的參數(參數修改方法參見前面的關於ORACLE參數文件的描述)AUDIT_TRAIL:
AUDIT_TRAIL=0S
在WINDFOWS平台下要注意的是:
不管AUDIT_TRAIL設置為什麼值,有部分ORACLE的操作會記錄在事件日誌中
在WINDOWS下不支持AUDIT_FILE_DEST參數,如果設置了該參數,資料庫會報錯
LRM-00101: UNKNOWN PARAMETER NAME 'AUDIT_FILE_DEST'
ORA-01078: FAILURE IN PROCESSING SYSTEM PARAMETERS
在使用審計前,要確保事件日誌有足夠大的空間來存儲審計信息

2、檢查是否安裝好AUDIT相關的對象
最簡單的檢查方法是看看AUD$是否存在。如果AUDIT相關對象安裝不正確,可以通過%ORACLE_HOME%\rdbms\admin\cataudit.sql腳本來安裝AUDIT相關對象。如果要刪除審計,可以執行%ORACLE_HOME%\rdbms\admin\catnoaud.sql。

3、配置審計

在配置審計之前,首先要說明的是,審計是一種會帶來額外開銷的操作。因此在可能的情況下,盡量減少審計操作。另外,如果打開審計操作,那麼對一些資料庫事件的審計是預設的,這些審計事件包括:
實例關閉
通過SYSOPER和SYSDBA連接資料庫
在WINDOWS下配置審計的步驟和在UNIX下配置審計類似,這里就不再描述了。審計信息會自動寫入WINDOWS的事件日誌種,通過事件管理器可以查看日誌。

㈣ oracle資料庫 用戶session Kill不掉

用alert system kill session的方式殺會話,會話會被標注為killed狀態,但不一定會立即釋放。
所以對於確信可以殺掉的會話,
建議在操作系統級別使用kill -9的方式,簡單粗暴又高效
windows呢,可以使用orakill sid spid的方式

㈤ oracle資料庫的session參數值設置對系統運行效率有影響嗎

session設多少和你的應用環境有關系,說一下你的應用部署情況
Sessions = (IIS process number) X (min pool size)
按照這個公式算,如iis進程數為30,連接池min pool size為10,那麼安全的Oracle Sessions的數量應該為300。如果不按照這個數量進行設置,那麼系統運行的過程中IIS會經常報告一些莫名奇妙的錯誤,如認證失敗。很多人可能會認為IIS已經Crash了,實際上是由於Session的數量超過了Oracle允許的數量。

當然我們還必須將由於程序異常處理不當等造成的壞死的Session的可能數量計算在內。為了保證系統的運行問題,應該在上文所說的計算方法上加一個保險值,如350。

㈥ oracle alter system,database,session區別

alter
system修改的是參數文件,所有用戶都會生效
alter
session只是對當前session生效
alter
database
一般修改的是控制文件信息

㈦ oracle資料庫sessionid什麼意思

資料庫的每一個連接就是一個session(會話)
sessionid就是資料庫對於每一個會話的編號。

㈧ Oracle的session和process的區別與分析

session 和 process的區別:
連接connects,會話sessions和進程pocesses的關系
每個sql login稱為一個連接(connection),而每個連接,可以產生一個或多個會話,如果資料庫運行在專用伺服器方式,
一個會話對應一個伺服器進程(process),如果資料庫運行在共享伺服器方式,一個伺服器進程可以為多個會話服務。
session 和 process的關系,tom在他的書里寫的很清楚了

一個process可以有0個,1個或者多個session

一個session也可以存在這個或者那個process中

oracle中session跟process的研究

使用方法:
首先看看v$session跟v$process中主要的欄位屬性:
v$session(sid,serial#,paddr,username,status,machine,terminal,sql_hash_value,sql_address,,,)
v$process(addr,spid,,,)
可看到v$session中的paddr跟v$process中的addr對應,也即會話session在資料庫主機上對應進程的進程地址.
這里我們要先定位該session正在執行的sql語句,此時我們可以查詢如下的語句:
select sql_text
from v$sqltext_with_newlines
where (hash_value,address) in (select sql_hash_value,sql_address from v$session where sid=&sid) order by address,piece;
若需手工kill一個session,可採用"alter system kill session 'sid,serial#' immediate",此時session的狀態會標記為killed,該session對應進程地址指向相同的虛擬地址,見如下的查詢:
SQL> select sid,serial#,paddr,status from v$session where username='SHIYIHAI';
SID SERIAL# PADDR STATUS
---------- ---------- ---------------- --------
234 14409 C0000000B2BADB28 INACTIVE
245 14374 C0000000B2BAB748 INACTIVE
SQL> alter system kill session '234,14409' immediate;
System altered
SQL> select sid,serial#,paddr,status from v$session where username='SHIYIHAI';
SID SERIAL# PADDR STATUS
---------- ---------- ---------------- --------
234 14409 C0000000B2C750B8 KILLED
245 14374 C0000000B2BAB748 INACTIVE
SQL> alter system kill session '245,14374' immediate;
System altered
SQL> select sid,serial#,paddr,status from v$session where username='SHIYIHAI';
SID SERIAL# PADDR STATUS
---------- ---------- ---------------- --------
234 14409 C0000000B2C750B8 KILLED
245 14374 C0000000B2C750B8 KILLED
SQL>
我們知道很多時候被kill掉的session並不能馬上釋放資源,我們需要從os上kill掉對應的進程,但由於session的paddr被修改為虛擬地址了,導致無法關聯v$process,找不到進程的spid進程號.此時我們可以執行如下查詢:
SQL> SELECT s.username,s.status,
2 x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
3 decode(bitand (x.ksuprflg,2),0,null,1)
4 FROM x$ksupr x,v$session s
5 WHERE s.paddr(+)=x.addr
6 and bitand(ksspaflg,1)!=0
7 and s.status is null;
USERNAME STATUS ADDR KSLLAPSC KSLLAPSN KSLLASPO KSLLID1R KSLLRTYP DECODE(BITAND(X.KSUPRFLG,2),0,
------------------------------ -------- ---------------- ---------- ---------- ------------ ---------- -------- ------------------------------
C0000000B2B58D08 0 0 0
C0000000B2BA4688 298 9 4669 0
C0000000B2BAB748 1 16 4675 197 EV
C0000000B2BADB28 1 16 4675 197 EV
SQL>
或查詢如下的語句:
SQL> select p.addr from v$process p where pid <> 1
2 minus
3 select s.paddr from v$session s;
ADDR
----------------
C0000000B2BA4688
C0000000B2BAB748
C0000000B2BADB28
SQL>
從查詢結果中可發現被kill掉的session對應的進程地址.然後通過進程地址來查詢對應的進程號,見如下的查詢:
SQL> select spid from v$process where addr in ('C0000000B2BAB748','C0000000B2BADB28');
SPID
------------
13013
13015
最後在操作系統上執行"kill -9 13013"和"kill -9 13015"即可

㈨ 在Oracle中session和process的區別

session,會話,比如聯到資料庫,就建立了一個會話。
一個會話進行處理的時候,可能有很多process在運行進行支持。
一個系統級的process,也可能同時支持很多的session。

㈩ oracle 什麼是 session

session,會話。
簡單一點,每一個連接資料庫的動作都會產生一個會話。
比如有一個人通過網路客戶端連接了資料庫,那麼這就是一個會話。
一個計劃任務的運行,因為是計劃任務的內容在操作資料庫,也就相當於資料庫啟動了一個東西連接並操作資料庫,所以這也是一個session.
網頁通過jdbc的方式連接資料庫,其實也是一個會話。
對於會話資料庫會分配給一定的內存,讓他能完成一些操作,當會話斷開,這部分內存則釋放。