问题描述
关于设置的一些一般信息:
-我们有一台用于所有报告的数据库服务器。该服务器具有从不同应用程序到adg的所有数据库链接。
在这种特殊情况下,我有一个由2个查询组成的查询,这些查询组合在一个UNION ALL中
查询1在远程a上执行,查询2在远程b上执行;
分别执行,他们工作得很好,结合在一个联盟中,这给了我一个错误:
“快照太旧: 名称为“ % s ”的回滚段编号 % s太小”
当我查找错误时,它总是会返回到,尝试在没有执行DML等的不同时间运行,但这与我的情况无关。
我可以完美地与统一的单独执行它们,并在联合所有立即失败的情况下获得结果。这个词在这里也很重要,它不是查询运行数小时的情况;
Qry 1 = 120s; Qry 2 = 90s;
Qry union = <1s错误;
结果每天每分钟都可以重现。
-我们有一台用于所有报告的数据库服务器。该服务器具有从不同应用程序到adg的所有数据库链接。
在这种特殊情况下,我有一个由2个查询组成的查询,这些查询组合在一个UNION ALL中
查询1在远程a上执行,查询2在远程b上执行;
分别执行,他们工作得很好,结合在一个联盟中,这给了我一个错误:
“快照太旧: 名称为“ % s ”的回滚段编号 % s太小”
当我查找错误时,它总是会返回到,尝试在没有执行DML等的不同时间运行,但这与我的情况无关。
我可以完美地与统一的单独执行它们,并在联合所有立即失败的情况下获得结果。这个词在这里也很重要,它不是查询运行数小时的情况;
Qry 1 = 120s; Qry 2 = 90s;
Qry union = <1s错误;
结果每天每分钟都可以重现。
专家解答
这个地区有一些已知的虫子
已知的ORA-01555问题在活动的Dataguard (ADG) (Doc ID 1951318.1)
ORA-1555从查询RAC ADG物理备用数据库 (Doc ID 19614585.8)
活动数据保护 (ADG) 中错误结果的已知问题 (Doc ID 2490469.1)
所以我认为这将是你需要在支持下接受的。
一些解决方法的想法 (我知道这并不理想)
1) 尝试将查询中的数据具体化
2) 如果这不起作用,可以将此逻辑包装在管道函数中,例如
已知的ORA-01555问题在活动的Dataguard (ADG) (Doc ID 1951318.1)
ORA-1555从查询RAC ADG物理备用数据库 (Doc ID 19614585.8)
活动数据保护 (ADG) 中错误结果的已知问题 (Doc ID 2490469.1)
所以我认为这将是你需要在支持下接受的。
一些解决方法的想法 (我知道这并不理想)
1) 尝试将查询中的数据具体化
Current query: select [query1] union all select [query2] Rewrite as with local_data as ( select /*+ materialize */ [query1] ) select ... from local_data union all select [query2]
2) 如果这不起作用,可以将此逻辑包装在管道函数中,例如
SQL> select empno, ename from scott.emp
2 union all
3 select deptno, dname from scott.dept;
EMPNO ENAME
---------- --------------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
18 rows selected.
SQL>
SQL>
SQL> create global temporary table local_copy
2 ( empno number, ename varchar2(30))
3 on commit preserve rows
4 /
Table created.
SQL>
SQL> create or replace
2 type each_row as object ( empno number, ename varchar2(30))
3 /
Type created.
SQL>
SQL> create or replace
2 type row_list as table of each_row
3 /
Type created.
SQL>
SQL> create or replace
2 procedure get_the_remote_data is
3 pragma autonomous_transaction;
4 begin
5 delete local_copy;
6 insert into local_copy
7 select empno, ename from scott.emp;
8 commit;
9 end;
10 /
Procedure created.
SQL>
SQL>
SQL> create or replace
2 function workaround_issue return row_list pipelined is
3
4 begin
5 get_the_remote_data;
6
7 for i in
8 ( select empno, ename from local_copy
9 union all
10 select deptno, dname from scott.dept
11 )
12 loop
13 pipe row ( each_row(i.empno, i.ename));
14 end loop;
15 return;
16 end;
17 /
Function created.
SQL>
SQL> select * from workaround_issue();
EMPNO ENAME
---------- ------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
18 rows selected.
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




