• 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时间,就可以避免这一情况的发生。

  • 相关阅读:
    3-1
    3-2
    习题二 8
    习题二 3
    习题二 5
    习题二 4
    习题二 6
    实验三-2未完成
    实验三
    心得
  • 原文地址:https://www.cnblogs.com/createyuan/p/11228004.html
Copyright © 2020-2023  润新知