数据库管理-第284期 奇怪的sys.user$授权(20250116)

来源:这里教程网 时间:2026-03-03 21:15:11 作者:

数据库管理-第284期 奇怪的sys.user$授权(20250116)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
10年数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著 名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸
CSDN:胖头鱼的鱼缸(尹海文)
墨天轮:胖头鱼的鱼缸
ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

胖头鱼的鱼缸_01.png 昨天凌晨割接,做一个Oracle向某国产库的实时同步前置配置,主要包含开启数据库最小附加日志、开启表级附加日志以及创建用于同步的用户并授权。但是中间出了点,在启动同步工具的时候报了ORA-01031: insufficient privileges,但是由于授权命令已确认完整执行,因此进行了深度排查。

1 问题

首先还是说明一下环境,这是一套Exadata X8M的环境,两个计算节点,数据库版本为19.21。 经过同步工具日志的排查,是程序在PDB中获取sys.user$信息的时候出现了报错,用户的部分创建语句如下:

create user c##test identified by "Test#!123";
grant connect to c##test container=all;
grant select any dictionary to c##test container=all;
grant select on sys.user$ to c##test container=all;

这就很奇怪了,按照常理来说,授权增加了container=all子句,是不应该出现这一现象。后面我们统一使用以下语句进行测试,并尝试在测试库(19.22,四节点RAC)中复现:

select count(*) from sys.user$;

2 CDB与PDB

在解决问题的过程中发现,测试语句在CDB中可以正常获得结果,但是在PDB中会显示ORA-01031,常使用下面的命令处理:

alter session set container=pdb_test;
grant select on sys.user$ to c##test container=current;

完成后是再连接到PDB中则可以正常执行测试SQL,但该现象在测试库中未复现,由于测试库是19.22,无法排出是否为版本差异,因此回到出问题的库再测试一次,但是在新建用户上也未复现,这就不放出测试过程了,姑且算是触发了一个特定的异常。

3 跨实例

在解决完第一个问题后,发下ORA-01031报错依旧,在进一步的测试过程中发现,授权是在实例1执行的,但是在实例2执行测试SQL的时候会报错,下面是在测试环境中的复现:

3.1 通过scanip访问数据库

sqlplus c##test@scanip/wgbak

image.png 发现报错。

3.2 通过节点1的VIP访问数据库

sqlplus c##test@host1-vip/wgbak

image.png 可以正常执行。

3.3 通过节点3的VIP访问数据库

sqlplus c##test@host3-vip/wgbak

image.png 发现报错。

3.4 在节点3赋权后测试

sqlplus sys@host3-vip/wgbak as sysdba
grant select on sys.user$ to c##test container=all;

image.png image.png 正常执行。

3.5 小结

这里就不贴出其他实例的测试了,和实例3现象和处理一致。 同时同生产环境处理一致,其余的系统视图同样未出现该问题(比如sys.obj$, sys.col$等),进出现在sys.user$上,这里也不贴出测试结果。 尝试在12.2,19.17的RAC多租户环境中执行也未复现,其他版本未测试。

总结

这是一个发生19c(19.21、19.22)RAC多租户环境授权sys.user$出现的ORA-01031的问题。目前已开SR进行反馈,后续将持续更新。 老规矩,知道写了些啥。

相关推荐