当前位置:首页 » 数据仓库 » 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的方式连接数据库,其实也是一个会话。
对于会话数据库会分配给一定的内存,让他能完成一些操作,当会话断开,这部分内存则释放。