暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle “快照太旧: 名称为“ % s ”的回滚段编号 % s太小”

ASKTOM 2020-11-13
895

问题描述

关于设置的一些一般信息:
-我们有一台用于所有报告的数据库服务器。该服务器具有从不同应用程序到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) 尝试将查询中的数据具体化

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论