Oracle 12c ADG备库执行sql报错ORA-22303、ORA-16000、ORA-06508、ORA-06512

简介:

一、背景介绍

        某客户数据库备库执行sql失败,数据库环境:主库(12.2.0.1 RAC),备库(12.2.0.1 单机)RAC到单机搭建了ADG,数据是从12.1.0.2通过erp导入的,报错信息:ORA-22303、ORA-16000、ORA-06508、ORA-06512,具体报错内容见下文。

二、问题描述

1、执行SQL&报错

2020-03-03 15:34:32.830 [job-81740957] INFO  SingleTableSplitUtil - split pk [sql=SELECT * FROM ( SELECT xxx FROM xxx.xxx SAMPLE (0.1)  WHERE (xxx IS NOT NULL)  ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 15 ORDER by xxx ASC] is running...
2020-03-03 15:34:32.969 [job-81740957] ERROR JobContainer - Exception when job run
com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的配置的 column/table/where/querySql或者向 DBA 寻求帮助.].  - 执行的SQL为:SELECT * FROM ( SELECT xxx FROM xxx.xxx SAMPLE (0.1)  WHERE (xxx IS NOT NULL)  ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 15 ORDER by xxx ASC 具体错误信息为:ORA-22303: 未找到类型 "SYS"."WRR$_REPLAY_DEP_GRAPH"
ORA-16000: 数据库或可插入数据库是以只读访问方式打开的
ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_WORKLOAD_REPLAY" 的程序单元
ORA-06512: 在 "SYS.DBMS_WRR_STATE", line 4
ORA-06512: 在 "SYS.DBMS_RANDOM", line 91
 - java.sql.SQLException: ORA-22303: 未找到类型 "SYS"."WRR$_REPLAY_DEP_GRAPH"
ORA-16000: 数据库或可插入数据库是以只读访问方式打开的
ORA-06508: PL/SQL: 无法找到正在调用 : "SYS.DBMS_WORKLOAD_REPLAY" 的程序单元
ORA-06512: 在 "SYS.DBMS_WRR_STATE", line 4
ORA-06512: 在 "SYS.DBMS_RANDOM", line 91

三、问题排查

        观察上面报错信息,通过了解背景信息,这个SQL在主库RAC环境PDB通过业务用户是可以查询的,但是在备库(单机)PDB环境执行却报错,通过下面几个方面排查解决问题。

1、备库查询其他SQL

        ①备库PDB业务业务用户查询其他sql能正常执行
        ②备库执行上面SQL,不带DBMS_RANDOM.VALUE可以正常执行
        ③主库均能正常执行

2、备库单独调用DBMS_RANDOM.VALUE

        通过上面一步,可以发现SQL执行报错主要是在调用DBMS_RANDOM问题上,那么接下来对备库调用DBMS_RANDOM报错进行分析。

2.1、sys连接到CDB、PDB

①sys用户连接CDB,可以正常执行
image
②sys切换到对应PDB,执行报错

sqlplus / as sysdba
alter session set container=pdb_name;

SQL> select DBMS_RANDOM.VALUE(1,8) from dual;
select DBMS_RANDOM.VALUE(1,8) from dual
       *
ERROR at line 1:
ORA-22303: type "SYS"."WRR$_REPLAY_DEP_GRAPH" not found
ORA-16000: database or pluggable database open for read-only access
ORA-06508: PL/SQL: could not find program unit being called:"SYS.DBMS_WORKLOAD_REPLAY"
ORA-06512: at "SYS.DBMS_WRR_STATE", line 4
ORA-06512: at "SYS.DBMS_RANDOM", line 91
ORA-06512: at "SYS.DBMS_RANDOM", line 137

2.2、业务用户连接到PDB模式

SQL执行报错,报错信息和如下:

sqlplus user/pwd@ip:1521/pwd-server-name

SQL> select DBMS_RANDOM.VALUE(1,8) from dual;
select DBMS_RANDOM.VALUE(1,8) from dual
       *
ERROR at line 1:
ORA-22303: type "SYS"."WRR$_REPLAY_DEP_GRAPH" not found
ORA-16000: database or pluggable database open for read-only access
ORA-06508: PL/SQL: could not find program unit being called:"SYS.DBMS_WORKLOAD_REPLAY"
ORA-06512: at "SYS.DBMS_WRR_STATE", line 4
ORA-06512: at "SYS.DBMS_RANDOM", line 91
ORA-06512: at "SYS.DBMS_RANDOM", line 137

3、查看数据库INVALID对象

①主库
        SYS的Object对象全部valid,业务用户有部分object invalid,对这次执行的SQL不影响。
②备库
        SYS的Object对象全部valid,业务用户有部分object invalid,对这次执行的SQL不影响。

4、查看用户权限

在主、备库查询完用户权限,主备是一致的,信息如下:
image

image

5、重新编译DBMS_RANDOM包

主库执行:
Execute the following script to recreate DBMS_RANDOM package:
@?/rdbms/admin/dbmsrand.sql

        主库执行完,这个动作会同步到从库,执行完从库在调用上述DBMS_RANDOM包,问题仍没有解决

6、赋予业务用户系统表权限

        上面信息观察完仍没有找到出错原因,去查相关资料,发现类似报错几乎没有,与报错号相同的但是报错内容是不一致的,再次观察报错内容,尝试赋予业务用户系统表权限,如下:

主库
sqlplus / as sysdba
alter session set container=pdb_name;
grant select on "SYS"."WRR$_REPLAY_DEP_GRAPH" to username;

权限赋予完,之后在备库执行查询命令,发现可以正常执行:
image

四、问题总结

        遇到这个问题,查询相关资料很少,最后根据sql执行报错内容通过业务用户查询表 "SYS"."WRR$_REPLAY_DEP_GRAPH",发现没有权限(主备库查询结果一致),尝试赋予这个用户查询这个系统表的权限,之后在执行上述查询就可以了。

        奇怪的一点,主库业务用户也是没有这个系统表查询权限的,但是执行sql可以正常执行,这也有可能触发了oracle bug。

相关文章
|
10天前
|
Oracle 关系型数据库 数据库
【YashanDB知识库】oracle dblink varchar类型查询报错记录
在使用Oracle DBLink查询VARCHAR类型数据时,可能会遇到多种报错。通过了解常见错误原因,采取合适的解决方法,可以有效避免和处理这些错误。希望本文提供的分析和示例能帮助你在实际工作中更好地处理DBLink查询问题。
37 10
|
5天前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
4月前
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
|
4月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
116 3
|
4月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
115 1
|
7月前
|
SQL Oracle 关系型数据库
|
7月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
512 3
|
7月前
|
SQL 存储 Oracle
TDengine 3.3.2.0 发布:新增 UDT 及 Oracle、SQL Server 数据接入
**TDengine 3.3.2.0 发布摘要** - 开源与企业版均强化性能,提升WebSocket、stmt模式写入与查询效率,解决死锁,增强列显示。 - taos-explorer支持geometry和varbinary类型。 - 企业版引入UDT,允许自定义数据转换。 - 新增Oracle和SQL Server数据接入。 - 数据同步优化,支持压缩,提升元数据同步速度,错误信息细化,支持表名修改。 - 扩展跨平台支持,包括麒麟、Euler、Anolis OS等。
154 0
|
8月前
|
资源调度 Oracle 关系型数据库
实时计算 Flink版产品使用问题之同步oracle表时,任务不报错,但是读不到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
4879 0

推荐镜像

更多