oracle 出现ORA-01000最大打开游标错误时转储当前打开游标

oxalkeyp  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我们的后台偶尔会出现ORA-01000最大打开光标错误(少数时候是周末,没有人工作)。
当发生这样的错误时,是否可以将打开游标的详细信息转储到表中,以便我们有时间分析是什么原因导致的?
不幸的是,这必须直接在Oracle端完成,因为我们的应用程序不能访问管理模式。

xzlaal3s

xzlaal3s1#

是的,如果你是一个DBA,你可以在服务器错误时创建一个系统触发器,并捕获你需要的东西:

CREATE TABLE mylogtable AS SELECT * FROM v_open_cursor WHERE 1=2;

CREATE TRIGGER TR_SERVERERROR AFTER SERVERERROR ON DATABASE
DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF server_error(1) = 1000
  THEN
    INSERT INTO mylogtable
    SELECT *
      FROM v$open_cursor
     WHERE sid = SYS_CONTEXT('USERENV','SID');

    COMMIT;
  END IF;
END;

或者,您可以使用监控软件或编写自己的监控脚本,以每隔一段时间进行捕获。
如果你不是DBA,他们不会为你做上面的事情,如果你有SELECT ANY DICTIONARY priv,你可以在应用程序运行的不同时间简单地查询v$open_cursor的SID,你可能不需要使用触发器就可以看到发生了什么。
确保应用程序关闭它打开的游标。如果open_cursors非常低,让DBA增加它。但如果我们谈论的是数千人,那就有一个应用程序设计问题。任何应用程序都不应该需要数千个打开的游标。

相关问题