证明递归session存在并解释为什么不在v$session中显示

我们在数据库的使用过程中,有时候会遇到类似情况,我会话是登录的,但是我进行某种操作,缺报session不足.这种情况证明该sql后台还产生了其他会话,这里通过试验分析证明了递归session的存在
会话创建表报session超
CDB_PDB@CHF>  create table t_xifenfei(id number) ;
create table t_xifenfei(id number)
                 
ERROR at line 1:
ORA-00018: maximum number of sessions exceeded

这里有个问题:当前会话已经登录成功了,证明当前session是足够的,但是为什么在执行创建表操作之时依然会报ORA-00018呢?通过10046继续分析
CDB_PDB@CHF> alter session set events '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
 
会话已更改。
 
CDB_PDB@CHF> create table t_xifenfei as select * from dual;
 
表已创建。
 
CDB_PDB@CHF> select value from v$diag_info where name='Default Trace File';
 
VALUE
--------------------------------------------------------------------------------
E:APPXIFENFEIdiagrdbmscdbcdbtracecdb_ora_6596.trc

分析trace文件
CDB_PDB@CHF> host tkprof  E:APPXIFENFEIdiagrdbmscdbcdbtracecdb_ora_6596.trc d:/1.txt
 
--查看trace文件,发现里面有很多基表操作,拿其中的一个tab$表分析,创建表过程有如下insert操作
insert into tab$(obj#,ts#,file#,block#,bobj#,tab#,intcols,kernelcols,clucols,
  audit$,flags,pctfree$,pctused$,initrans,maxtrans,rowcnt,blkcnt,empcnt,
  avgspc,chncnt,avgrln,analyzetime,samplesize,cols,property,degree,instances,
  dataobj#,avgspc_flb,flbcnt,trigflag,spare1,spare6)
values
(:1,:2,:3,:4,decode(:5,0,null,:5),decode(:6,0,null,:6),:7,:8,decode(:9,0,null,
  :9),:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,
  decode(:26,1,null,:26),decode(:27,1,null,:27),:28,:29,:30,:31,:32,:33)

尝试人工插入
CDB_PDB@CHF> insert into sys.tab$ select * from sys.tab$ where rownum=1;
insert into sys.tab$ select * from sys.tab$ where rownum=1
                *
第 1 行出现错误:
ORA-01031: 权限不足

证明当前执行创建表的session无权限直接操作tab$表,证明应该有其他表操作它

v$session视图基表
通过查询V$FIXED_VIEW_DEFINITION视图获得相关sql语句,不同版本可能有出入,但是大体一致
/* Formatted on 2013/11/8 23:09:30 (QP5 v5.227.12220.39754) */
SELECT inst_id,
       addr,
       indx,
       ksuseser,
       ksuudses,
       ksusepro,
       ksuudlui,
       ksuudlna,
       ksuudoct,
       ksusesow,
       DECODE (ksusetrn, HEXTORAW ('00'), NULL, ksusetrn),
       DECODE (ksqpswat, HEXTORAW ('00'), NULL, ksqpswat),
       DECODE (BITAND (ksuseidl, 11),
               1, 'ACTIVE',
               0, DECODE (BITAND (ksuseflg, 4096), 0, 'INACTIVE', 'CACHED'),
               2, 'SNIPED',
               3, 'SNIPED',
               'KILLED'),
       DECODE (ksspatyp,
               1, 'DEDICATED',
               2, 'SHARED',
               3, 'PSEUDO',
               'NONE'),
       ksuudsid,
       ksuudsna,
       ksuseunm,
       ksusepid,
       ksusemnm,
       ksusetid,
       ksusepnm,
       DECODE (BITAND (ksuseflg, 19),
               17, 'BACKGROUND',
               1, 'USER',
               2, 'RECURSIVE',
               '?'),
       ksusesql,
       ksusesqh,
       ksusepsq,
       ksusepha,
       ksuseapp,
       ksuseaph,
       ksuseact,
       ksuseach,
       ksusecli,
       ksusefix,
       ksuseobj,
       ksusefil,
       ksuseblk,
       ksuseslt,
       ksuseltm,
       ksusectm,
       DECODE (BITAND (ksusepfl, 16), 0, 'NO', 'YES'),
       DECODE (ksuseft,
               2, 'SESSION',
               4, 'SELECT',
               8, 'TRANSACTIONAL',
               'NONE'),
       DECODE (ksusefm,
               1, 'BASIC',
               2, 'PRECONNECT',
               4, 'PREPARSE',
               'NONE'),
       DECODE (ksusefs, 1, 'YES', 'NO'),
       ksusegrp,
       DECODE (BITAND (ksusepfl, 16),
               16, 'ENABLED',
               DECODE (BITAND (ksusepfl, 32), 32, 'FORCED', 'DISABLED')),
       DECODE (BITAND (ksusepfl, 64),
               64, 'FORCED',
               DECODE (BITAND (ksusepfl, 128), 128, 'DISABLED', 'ENABLED')),
       DECODE (BITAND (ksusepfl, 512),
               512, 'FORCED',
               DECODE (BITAND (ksusepfl, 256), 256, 'DISABLED', 'ENABLED')),
       ksusecqd,
       ksuseclid
  FROM x$ksuse
 WHERE BITAND (ksspaflg, 1) != 0 AND BITAND (ksuseflg, 1) != 0

注意:v$session查询的肯定是BITAND (ksuseflg, 1)!=0的记录

通过锁住表测试
CDB_PDB@SYS表示sys用户,CDB_PDB@CHF表示chf用户,使用两个session,不同用户测试
CDB_PDB@SYS> show user;
USER 为 "SYS"
 
--SYS用户锁住表
CDB_PDB@SYS> lock table tab$ IN exclusive MODE;
 
表已锁定。
 
CDB_PDB@CHF> show user;
USER 为 "CHF"
CDB_PDB@CHF>  select sid from v$mystat where rownum=1;
 
       SID
----------
        57
 
CDB_PDB@CHF> select paddr from v$session where sid=57;
 
PADDR
----------------
000007FF1E10F228
 
--CHF用户创建表
CDB_PDB@CHF>  create table t_xifenfei_new as select * from dual;
 
--SYS用户查询
CDB_PDB@SYS> SELECT s.addr,
  2         s.indx sid,
  3         s.ksuseser SERIAL#,
  4         ksuudsna username,
  5         DECODE (BITAND (ksuseflg, 19),
  6                 17, 'BACKGROUND',
  7                 1, 'USER',
  8                 2, 'RECURSIVE',
  9                 '?')
 10            TYPE
 11    FROM x$ksuse s
 12   WHERE ksusepro = '000007FF1E10F228';
 
ADDR                    SID    SERIAL# USERNAME                       TYPE
---------------- ---------- ---------- ------------------------------ ----------
000007FF1E1EBEA0         57         23 CHF                            USER
000007FF1E1D7F90         67        183 SYS                            RECURSIVE
 
CDB_PDB@SYS> SELECT ksuudsna username,
  2         ksuseflg
  3    FROM x$ksuse s
  4   WHERE ksusepro = '000007FF1E10F228';
 
USERNAME                         KSUSEFLG
------------------------------ ----------
CHF                             135266369
SYS                                     2
 
--这里我们发现递归sys调用的sql,在v$session视图中被排除了,因此递归sql的session不能在v$session显示
CDB_PDB@SYS> select bitand(2,1) from dual;
 
BITAND(2,1)
-----------
          0

至此,我们可以验证,我们当前的会话,在创建表的过程中有一个sys的递归session执行了关于基表的操作,但是由于v$session视图对于x$ksuse表中的部分记录进行了过滤因此我们不能在v$session查看到这些递归session

继续分析bitand函数
通过观察v$session的创建语句,我们可以发现如下规律,如果某个session是递归session,那么BITAND (ksuseflg, 19)=2,那当这个值为2的时候,是不是BITAND (ksuseflg, 1)一定为0呢?bitand函数实际上就是把里面的两个参数转换为二进制然后进行and运算,也就是两个对应位都为1的情况才会结果得带1(bitand(3,1)=1,bitand(2,1)=0),这里可以发现19转换为二进制为10011,要使得BITAND (ksuseflg, 19)=2成立,那就是说ksuseflg转换为二进制后,最后一位必须是0;而BITAND (ksuseflg, 1)在这样的情况下,一定为0,因此递归session的一定不会在v$session视图显示.

时间: 2024-09-20 12:38:05

证明递归session存在并解释为什么不在v$session中显示的相关文章

缓存-hibernate中session的作用解释,求教~~

问题描述 hibernate中session的作用解释,求教~~ <精通hibernate:java对象持久化技术详解>中提到session缓存的三种作用:减少DB的访问次数.保证同步.**当缓存中持久化对象存在循环关联关系时,保证不出现访问对象图的死循环,以及死循环引起的JVM堆栈溢出**.请问"**当缓存中持久化对象存在循环关联关系时,保证不出现访问对象图的死循环,以及死循环引起的JVM堆栈溢出**"的原因以及hibernate是怎么实现的呢?谢谢~~ 解决方案 ses

asp.net-关于不同页面间将session的值传到另一个页面的GridView中

问题描述 关于不同页面间将session的值传到另一个页面的GridView中 搜索按钮在这个页面production.aspx protected void searchbtn_Click(object sender, EventArgs e) { if (searchtb.Text == "") { Response.Write("alert('请输入查找的内容!');location.href='production.aspx'"); } else { Ses

Label中显示Session的值

问题描述 我在登陆页面的后台(cs)代码中用session保留了数据库表中一个字段的值(teacher表中的字段tea_name),现在我想在top.html中用label控件显示这个session的值,如何做呢? 解决方案 解决方案二:cs:session["tea_name"]=dr[tea_name].toString();top.htmlLabel.Text=session("tea_name");//解决方案三:top.html换成top.aspx然后在p

怎么让不同浏览器之间的session彻底不互通或者所有浏览器互通session值?

问题描述 怎么让不同浏览器之间的session彻底不互通或者所有浏览器互通session值? 使用IE和Google浏览器之间的session不互通,但有时候也会出现互通情况,不同浏览器之间的session是什么原理,有什么办法彻底不互通或者直接不同浏览器互通session值 吗 解决方案 一些浏览器会读取IE的cookie以及历史记录等各种信息. 如果你使用永久cookie的话,那么就会互通session 解决方案二: 我的目的是在登录后,用户不用登录直接进入系统.我使用Google登录后,C

单点登陆系统里保存有session值,模块怎样通过接口访问session值?

问题描述 单点登陆系统里保存有session值,模块怎样通过接口访问session值?项目有这样的需求,用户通过一个登陆框登陆后,可以实现模块间的跳转,那么就需要用session记录登陆状态,但是我发现调用web服务时(返回session值),获取session值时出现堆栈出错,访问不到这个session值,我刚接触webservice,不是怎么了解,希望高手们赐教.... 解决方案 解决方案二:既然是系統,那肯定有開發的接口.解决方案三:webservice能接收session?解决方案四:可

能模仿韩寒小四写作的神奇递归神经网络(附代码)

引言 在离人工智能越来越近的今天,研究界和工业界对神经网络和深度学习的兴趣也越来越浓,期待也越来越高.  我们在深度学习与计算机视觉专栏中看过计算机通过卷积神经网络学会了识别图片的内容--模仿人类的看,而工业界大量的应用也证明了神经网络能让计算机学会听(比如百度的语音识别),于是大量的精力开始投向NLP领域,让计算机学会写也一定是非常有意思的事情,试想一下,如果计算机通过读韩寒和小四的小说,就能写出有一样的调调的文字,这是多带劲的一件事啊.  你还别说,还真有这么一类神经网络,能够在NLP上发挥

怎么在html中,用js判断session是否存在

问题描述 我做了一个新闻发布系统,所有的新闻都生成了静态页!现在碰到个问题:如果会员登陆了,在进入新闻页时,显示"欢迎xx",我怎么在html中,用js判断session是否存在!谢谢@! 解决方案 解决方案二:欢迎xx是在标题中的?还是在网页中的?应该是这个写JS中的吧,JS中包含一个.aspx的文件.解决方案三:欢迎xx在网页中解决方案四:functionchecsessoin(){varstrSession="<%=Session["uid"]

基于php使用memcache存储session的详解

web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内 增加一条语句就可以了,不过前提你需要装好memcache模块 1.设置session用memcache来存储方法I: 在 php.ini 中全局设置 session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" 方法II: 某个目录下

php.ini中文解释

中文 php.ini中文解释 发布时间:02-11-26 作者或来源: leftstar [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化, ; 在使用新的PHP版本前,研究一下php.ini会有好处的 ;;;;;;;;;;;;;;;;;;; ; 关于这个文件 ; ;;;;;;;;;;;;;;;;;;; ; 这个文件控制了PHP许多方面的观点.为了让PHP读取这个文件,它必须被命名为   ; 'php.ini'.PHP 将在这