编辑/前言: 此问题已从 SO 迁移,因为我对有关数据库链接查询超时的问题特别感兴趣。SO提供的解决方法有点OK,但我对问题本身很感兴趣。
动机:
我有一个使用数据库链接的查询“永远”运行(超过 2 天,直到我终止会话)。问题似乎是远程数据库变得不可用,并且由于某些未知的原因没有ORA-02068
提出(这里不讨论)并且查询只是等待和等待。
(该查询由 dbms_scheduler 作业发出,该作业执行 PL/SQL 包中的一个过程。因此,该作业也被卡住了。但这对于这个问题的核心并不是特别感兴趣)
我通过将我的一个测试数据库置于静默模式并通过数据库链接对其进行查询来模拟这种情况。正如预期的那样,查询一直在等待,直到手动取消或远程数据库取消停顿。
问题:
我无法控制远程数据库的行为和正常运行时间,因此我正在寻找某种可能性来为使用数据库链接的查询设置超时。
我已经研究了配置文件(CPU_PER_CALL
等),sqlnet.ora
参数,将本地命名参数直接添加到连接字符串中(例如添加(connect_timeout=10)
到数据库链接定义),使用 运行命令... for update wait 1
,但它们适用于繁忙或空闲会话,但不适用于对于等待中的会话。
所以我在数据库链接的“本地”端寻找一些选项,它为数据库链接的查询设置超时。
一些解决方案喜欢alter session set xyz
或select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)
将不胜感激,因为我对这些特定的数据库没有 DBA 权限。
我目前在 10gR2 上,但几周后升级到 11gR2,因此对这些版本中的任何一个的想法都会很有用。
如何在服务器上找到SQLNET.ORA 参数的活动值?
我知道如何找到 SQLNET.ORA 文件,但不能保证该文件中的值被积极使用。参数更改可能需要重新启动侦听器,有时甚至需要重新启动数据库。对于调试,我想要一种 100% 确定如何设置参数的方法,而无需重新启动任何东西。
这类似于这个问题,但我正在寻找任何方法来查找当前值。它不必是 SQL 查询。
这是我迄今为止尝试过的,让我相信这是不可能的:
ASSEMBLY
在 Oracle SQL 的上下文中,什么是Oracle?
它列在GV$SQLCOMMAND
. 虽然GV$SQLCOMMAND
不是“真实”SQL 语句的完美指南——例如,它有UPSERT
代替MERGE
.
INST_ID COMMAND_TYPE COMMAND_NAME CON_ID
---------- ------------ -------------------- ----------
1 215 DROP ASSEMBLY 0
1 216 CREATE ASSEMBLY 0
1 217 ALTER ASSEMBLY 0
Run Code Online (Sandbox Code Playgroud)
这些命令有效,尽管我不确定它们在做什么。奇怪的是,语法需要/
,这意味着这些对象可能包含 PL/SQL。
SQL> create or replace assembly some_assembly is 'some string';
2 /
Assembly created.
SQL> select * from all_assemblies;
OWNER ASSEMBLY_NAME FILE_SPEC SECURITY_L IDENTITY STATUS
--------------- --------------- --------------- ---------- --------------- -------
JHELLER SOME_ASSEMBLY some string SAFE VALID
Run Code Online (Sandbox Code Playgroud)
数据字典视图工作并记录在案: …
根据文档,“使用常量 DBMS_STATS.AUTO_CASCADE 让 Oracle 确定是否要收集索引统计信息。”
但看起来 AUTO_CASCADE 总是会收集索引统计信息,即使它显然不需要。
这个测试用例演示了这个问题:
SQL> --Create table
SQL> create table statistics_test(a number, b number, c number, d number, e number);
Table created.
SQL> --Add 10 million rows (about 320 MB)
SQL> begin
2 for i in 1 .. 100 loop
3 insert into statistics_test
4 select level, level, level, level, level from dual
5 connect by level <= 100000;
6 end loop;
7 commit;
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> …
Run Code Online (Sandbox Code Playgroud)