天萃荷净

创建表时报session超过最大值 证明递归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:\APP\XIFENFEI\diag\rdbms\cdb\cdb\trace\cdb_ora_6596.trc

分析trace文件

CDB_PDB@CHF> host tkprof E:\APP\XIFENFEI\diag\rdbms\cdb\cdb\trace\cdb_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视图显示.

-----------------温馨提示--------------------

操作有风险,动手需谨慎

Oracle研究中心

http://www.oracleplus.net

本文由大师惜分飞原创分享,转载请尽量保留本站网址

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses

oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...相关推荐

  1. C语言经典例69-有n个人围成一圈报数问题

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 2 分析 假设全部人 ...

  2. 助教c/c++:n个人围成一圈报数问题

    以下三个问题都属于同类型的问题,其中两道题目是助教时的实验题,还有一道是华为在成都招聘时的机试题目. 在这三个问题中,问题1考虑的最简单,用指针实现:问题2考虑最全面,用结构体实现:问题3用到了函数. ...

  3. 多人围成一圈报数问题!

    题目(摘自谭浩强的C语言):有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那个人. 解法思路:首先不要将思维局限在一圈人,可以先将n个 ...

  4. oracle 10g rac 包root.sh报错,案例:Oracle Rac root.sh报错 Failed to create keys in the OLR

    天萃荷净 [root@web1 grid]# /u01/app/11.2.0/grid/root.sh Performing root user operation for Oracle 11g Th ...

  5. 一群人围成一圈报数,3倍数的就退出,面试题

    这个题目指的是一群人,围成一个圈,然后一个接一个的报数,当数到3或者3的倍数时候就退出,知道最后一个人. 距离当人数为30的时候: public class CycleTest {          ...

  6. n个人围成一圈 报数java_n个人围成一圈报数,报到3的人退出,依次直到剩下一人,这人是第几个人?用java,不知道哪里错...

    importjava.util.Scanner;publicclasscjj{publicstaticvoidmain(String[]args){Scannerinput=newScanner(Sy ...

  7. n个人围成一圈 报数3 python

    n=int(input()) count=0 a=list(range(1,n+1)) while len(a)>1:b=a[:]for i in range(len(a)):count+=1i ...

  8. oracle如何不让表自动建分区,怎么自动创建表空间和表分区

    --1.查看表在那个表空间 select tablespace_name,table_name from user_talbes where table_name='test'; --2.获取用户的默 ...

  9. oracle报27040错误,【oracle案例】创建表空间时遇到 ORA-01119,0RA-27040,0SD-04002

    代码如下 CREATE TEMPORARY TABLESPACE oracle89_temp TEMPFILE 'D:/oracle/prodect/10.2.0/oradata/oracle8/pr ...

最新文章

  1. 工程设计+算法规模化真的是AI突破吗?DeepMind唇读系统ICLR遭拒
  2. python知识点:上下文管理器[__enter__ 和 __exit__ ]
  3. 【AI呀,我去】科技圈顶流——元宇宙上线,快来揭开它的神秘面纱
  4. SQL触发器demo
  5. php 字母数字混合排序,JavaScript_基于JS实现数字+字母+中文的混合排序方法,在上篇文章给大家介绍了JavaScr - phpStudy...
  6. 【Linux】SecureCRT中按退格键出现^H
  7. pytorch安装换源ubuntu_PyTorch入门之PyTorch的安装
  8. 多币种钱包开发:什么是工作量证明(POW)?
  9. hdu 3642 Get The Treasury(扫描线)
  10. 剧情介绍:“遗愿清单”
  11. PS批量处理图片之批量转换dds格式
  12. 量子退火算法入门(6):初识量子退火算法的发明过程
  13. 华为HCSE培训教材
  14. 德勤 oracle par面,经验 | 德勤19par面合集+楼主新鲜audit par面经验
  15. 负载均衡器/LB - 学习/实践
  16. 产品经理的职业规划及绩效评估
  17. 使用php的GD库拼接图片
  18. 非线性回归分析及其Matlab实现
  19. CPU运行功耗和什么相关?消耗的电能都去哪了?
  20. FIFO先进先出,FILO先进后出

热门文章

  1. Softmax和Cross-entropy是什么关系?
  2. 推荐一位玩自动化的 Python 爱好者
  3. 人为何会发烧,超过42°C会怎样?
  4. 最常用 150 个Linux命令汇总(建议收藏)
  5. python模块学习---mechanize(模拟浏览器)
  6. 下面算法中,不属于公开密钥加密算法的是()。D
  7. 刚刚!中国高校毕业生薪酬排名Top100出炉!
  8. Django+Bootstrap+Mysql 搭建个人博客(五)
  9. 安装包制作工具 SetupFactory使用1 详解
  10. Visual Studio中断NPM套件库服务