今天朋友遭遇了如下的问题,远程联系我解决 SQL> select * from xxx ; select * from xxx ERROR at line 1: ORA-00018: maximum number of sessions exceeded 相信只要是干过一两年DBA的对与这个错误ORA-00018是比较熟悉的,也知道问题的解决办法,那就是增加processes的参数设置,由于sessions是依据processes推导出来的,因此processes的增大,会导致sessions也会增大,也就解决了这个问题。具体推导的公式,可能9I,10G版本基本遵循的是sessions=(1.1*processes)+5,11G以后(可能是11GR2之后,抱歉我没11GR1的版本来做测试),不是这样了,在我11GR2的环境下,3000 processes的设置,已经有4560个sessions,大大的增加了session的数量。 这个错大部分情况下,都是发生在建立连接的时候,由于超出了sessions的设置值,导致连接抛错。但是。。。 但是我朋友的这个案例是,他已经连接了!!!! 其实这个问题不难回答,因为只要看过TOM书的同学都知道,一个连接,可能会导致多个session。 举个例子: 你计划统计下xxx表的总记录数 当时你的数据库满足了以下几个条件中的一个 在数据库刚启动的时候、或者flush shared pool之后,或者查询的表的数据字典信息已经不在共享池里 你建立了一个连接后,ORACLE分配给你一个session,我们称之为session1 然后你select count(*) from xxx的时候 Oracle会独立新开一个session,我们称之为session2 ,这个session2会去递归的查询数据字典(硬解析的需要),比如tab$,col$,seg$以及一些统计信息的数据字典基表。 等它做完这些工作后,就立即消失了 当然除了查询,还会很多操作会产生这种行为,比如create,drop,alter等等,由于这些操作都修改了数据字典基表,因此他们也会产生一个递归的session的来去帮他们完成这些数据字典的操作,而且你还会“惊奇”的发现,这些递归session的用户竟然不是你当时连接的用户。 比如你用test/test做的连接,但是递归语句的session的用户是sys!!!! 说到这里,你可能觉得,你大概知道了这里面的奥秘,那就是,我朋友当时发出这个查询的时候,连接session的数量刚好等于了允许存在session的最大数量,因此导致递归的session无法创建而报错。 在确认这个问题前,还有些问题要解决。
|
ORA-00018: maximum number of sessions exceeded
最新推荐文章于 2021-04-04 19:50:41 发布