oracle连接-会话-进程
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;
CREATE PROFILE kyc_pro LIMIT IDLE_TIME 2;
alter user kyc_acc profile kyc_pro;
select * from dba_users where profile='KYC_PRO';
show parameter resource;
select * from dba_profiles where profile like 'K%';
[oracle@cu-dbs-152 admin]$ cat sqlnet.ora
SQLNET.EXPIRE_TIME = 3
==================================
一个session可以反应很多东西
同一个连接,如果打开非共享sql工作表,在会话表中就会出现一条。如果连接断开,并很快连接上,会重用sid,但serial#会增加,不会减少
SADDR, SID, SERIAL#
000000069E7C75F8 1886 231
0000000682B2FDC8 2828 191
0000000686EEB1E8 4243 189
select * from v$session
where schemaname like 'KYC%';
where osuser='ag1';
where paddr='0000000BC94696B8';
根据session的paddr就是process的addr,查找pid
select * from v$process
where addr='0000000685BC4730';
根据session的obj#就是dba_objects的object_id,查找是哪一张表(对象)
select * from dba_objects
where object_id='74120';
根据session的
select * from dba_extents
where block_id='382042';
select * from dba_extents
where file_id=5 and segment_name like '%TRA%';
根据session的port就是系统的端口号,查询进程的端口号
根据session的row_wait_file#查询是哪个数据文件
select * from v$datafile where file#=5;
process的spid就是系统的pid
ps -ef|grep spid
lsof -i -P -n | grep "20721 oracle"
=========================================
查看当前会话的session ID 有如下三种方法:
desc v$mystat
select * from v$mystat where rownum=1;
select userenv('sid') from dual;
userenv('sessionid') 返回的是session audit id.其对应v$session 的audsid字段。
在session 连接到数据库的时候,会从SYS.AUDSES$序列中获取一个audid 分配给session。
select sid from v$session where audsid=userenv('sessionid');
这里返回了3个值,我们直接查看userenv('sessionid') 值:
select userenv('sessionid') from dual;
对于internal用户(’/as sysoper’ 和 ‘/as sysdba’)和后台进程,其对应的AUDID 为0.
在Oracle 10g中,如果AUDID的值为0,表明是internal 用户,如果AUDID 值是4294967295,那么就表明是用SYS 用户直接连接的。
我们这里返回三个结果是把所有SYS 用户的session都返回了,所以这种方法有时的准确性并不高。
sid与serial#的关系
sid 会重用,但是同一个SID被重用时,serial#会增加,不会重复。
比如说你在10:00时发现有一个SID 为10 ,serial#为100的session 不正常,想杀掉他,要是直接用kill sid 10 ,而同时这个session 主动退出,新session近来 而又正好用了 10这个SID (这时新session的serial#不会=100,只会比100高),就会发生误杀的情况。所以Oracle要求我们在杀session时,必须同时指定sid和serial#.
从另外一个角度上说,sid 在同一个instance的当前session中是一个unique key, 而sid ,serial#则是在整个instance生命期内的所有session中是unique key。(不考虑serial#超过最大值,重用的情况)
例如之前我需要执行alter system kill session '147, 33306';
执行之后,我还在同一个PL/SQL DEV的SQL WINDOW中重新做一个查询,就会又产生一个SID=147的SESSION,但是此时的SERIAL#变为33308了。
################################
sessions=(1.1*process+5)
show parameter processes
show parameter sessions
alter system set processes=1000 scope=spfile;
shutdown immediate;
startup;
查询数据库当前进程的连接数:
select count(*) from v$process;
查看数据库当前会话的连接数:
select count(*) from v$session;
查看数据库的并发连接数:
select count(*) from v$session where status='ACTIVE';
查看当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status from v$session;
查询数据库允许的最大连接数:
select value from v$parameter where name = 'processes';
==============================
以上这个RMAN报错例子就是由于防火墙设置timeout原因,当client和server在timeout时间内没有数据传输的时候,会话就会被防火墙断开。而设置SQLNET.EXPIRE_TIME参数,使其小于防火墙的timeout时间,就可以避免这一情况的发生。