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增加它。但如果我们谈论的是数千人,那就有一个应用程序设计问题。任何应用程序都不应该需要数千个打开的游标。
1条答案
按热度按时间xzlaal3s1#
是的,如果你是一个DBA,你可以在服务器错误时创建一个系统触发器,并捕获你需要的东西:
或者,您可以使用监控软件或编写自己的监控脚本,以每隔一段时间进行捕获。
如果你不是DBA,他们不会为你做上面的事情,如果你有
SELECT ANY DICTIONARY
priv,你可以在应用程序运行的不同时间简单地查询v$open_cursor
的SID,你可能不需要使用触发器就可以看到发生了什么。确保应用程序关闭它打开的游标。如果
open_cursors
非常低,让DBA增加它。但如果我们谈论的是数千人,那就有一个应用程序设计问题。任何应用程序都不应该需要数千个打开的游标。