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

本文记录了一次在Oracle备库执行SQL时遇到的ORA-22303等错误,并详细介绍了问题排查过程及解决方案,包括分析错误信息、检查数据库对象状态、验证用户权限等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景介绍

某客户数据库备库执行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,可以正常执行

31da5cd1a7b562c63a623f366bb72afa.png

②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、查看用户权限

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

aeddb78ca53c92ea67cc0a7b853d7a9b.png

92fcc0534d6f4369dbe8affe3e54e77d.png

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;

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

c8d9de120b0474e6934f530caee28560.png

四、问题总结

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

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

来源:oschina

链接:https://my.oschina.net/u/4254929/blog/3209878

Oracle 12c ADG(Active Data Guard)是基于Oracle Data Guard技术的一个功能,它能够提供实时的数据份和灾难恢复解决方案。下面是Oracle 12c ADG搭建的视频演示。 在搭建Oracle 12c ADG之前,我们需要确保已经配置好了主数据用数据,并且它们能够通过网络互相通信。接下来,我们按照以下步骤来完成ADG的搭建。 1. 在主数据上,使用SQL Plus连接到数据实例,执行以下命令创建一个用数据初始化参数文件 pfile: ``` SQL> CREATE PFILE='/u01/app/oracle/admin/primary/pfile/initprimary.ora' FROM SPFILE; ``` 2. 在用数据上,使用SQL Plus连接到数据实例,执行以下命令创建一个用数据初始化参数文件 pfile: ``` SQL> CREATE PFILE='/u01/app/oracle/admin/standby/pfile/initstandby.ora' FROM SPFILE; ``` 3. 在主数据上,使用RMAN份主数据并将份传输到用数据: ``` RMAN> BACKUP AS COPY DATABASE FORMAT '/u01/app/oracle/backup/%U'; RMAN> RECOVER COPY OF DATABASE WITH TAG 'ADG_COPY'; RMAN> CATALOG START WITH '/u01/app/oracle/backup'; ``` 4. 在主数据上,修改用数据初始化参数文件 pfile,使其指向主数据份所在的目录: ``` SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'; ``` 5. 在用数据上,修改用数据初始化参数文件 pfile,使其指向主数据的控制文件和redo日志文件: ``` SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'; SQL> ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/primary/','/u01/app/oracle/oradata/standby/'; SQL> ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/u01/app/oracle/flash_recovery_area/primary/','/u01/app/oracle/flash_recovery_area/standby/'; ``` 6. 在主数据上,使用SQL Plus连接到主数据实例,启动主数据的日志传输服务: ``` SQL> ALTER SYSTEM ARCHIVE LOG CURRENT; ``` 7. 在用数据上,使用SQL Plus连接到用数据实例,执行以下命令启动数据实例: ``` SQL> STARTUP MOUNT; SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; ``` 8. 在用数据上,使用SQL Plus连接到用数据实例,检查ADG的状态: ``` SQL> SELECT DATABASE_ROLE FROM V$DATABASE; ``` 以上就是Oracle 12c ADG的搭建过程。通过配置ADG,我们可以实现实时的数据份和灾难恢复,提高数据的可用性和数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值