"超出最大打开游标":如何知道某些数据库对象打开了多少游标?

时间:2014-08-15 07:38:54

标签: sql oracle

Finacle中,有时候用户正面临着#34;资源很忙"由于在后端生成的oracle错误导致的错误为"超出最大打开游标"。并不是说这个错误经常发生,但是我们想采取预防措施,这就是为什么我们试图为Finacle工程师生成警报,即我们自己,以便每当游标的最大数量超过某些数据库对象时,我们就可以获得警报。为此,我们需要知道什么是命令,以了解在给定时间为DB对象打开多少游标。有人可以就此事指导我们。

清除我的概念的另一件事是,Oracle是否使用任何默认游标来查询表?因为,我的猜测是这个错误正在产生,因为这个软件的用户数量增加了,并且有很多会话被选择和更新查询打开了同一个数据库对象,这就是开放游标数量增加的原因。

1 个答案:

答案 0 :(得分:2)

我猜你在使用之后不会关闭你的游标,例如,我自定义open_cursor参数以允许用户只有一个打开的游标(oracle使用3个游标来满足自己的需要) :

SQL> conn / as sysdba
Connected.
SQL> alter system set open_cursors=4 scope=memory
  2  /

System altered.

SQL> conn hr/hr
Connected.
SQL> var l_cursor refcursor;
SQL> ed
Wrote file afiedt.buf

  1  begin
  2    open :l_cursor for select 1 from dual;
  3* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> var l_cursor1 refcursor;
SQL> ed
Wrote file afiedt.buf

  1  begin
  2    open :l_cursor1 for select 1 from dual;
  3* end;
SQL> /
begin
*
ERROR at line 1:
ORA-01000: maximum open cursors exceeded

如你所见,我面临同样的错误。让我们关闭l_cursor光标(打印命令显示光标的内容并关闭它),然后再次打开l_cursor1

SQL> print l_cursor

         1
----------
         1

SQL> ed
Wrote file afiedt.buf

  1  begin
  2    open :l_cursor1 for select 1 from dual;
  3* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> print l_cursor1

         1
----------
         1

正如您所见,Oracle可以成功打开l_cursor1游标。

作为问题的快速解决方案,您可以使用命令增加open_cursor参数(系统可能需要其他资源来保持当前性能):

alter system set open_cursors=800 scope=both 

我使用scope=memory,因为我希望这个演示在重新启动数据库服务器后不会影响我的系统。您必须指定scope = both才能在spfile中保留此参数。但我想你必须检查你的系统,看看你是否已经打开了不再使用的游标。

您猜测" Oracle是否使用任何默认光标来查询表?"确实如此,Oracle使用游标来查询表,您可以确保:

SQL> var l_cursor refcursor;
SQL> ed
Wrote file afiedt.buf

  1  begin
  2      open :l_cursor for select 1 from dual;
  3* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> select * from employees;
select * from employees
              *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded

SQL> print l_cursor

         1
----------
         1
SQL> select * from employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------
EMAIL                     PHONE_NUMBER         HIRE_DAT JOB_ID         SALARY
------------------------- -------------------- -------- ---------- ----------
COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
-------------- ---------- -------------
        205 Shelley              Higgins
...

要获取所有打开的游标,请检查此answer