Oracle XA permission



我在IBM WebSphere上部署的一个应用程序使用Oracle 12c数据库。该应用程序确实要求在oracle上启用XA事务,并且用户(通过websphere的数据源连接到oracle)应该具有授予的XA权限。如何查找用户是否已被授予XA权限?我尝试运行以下查询以查找权限,但没有成功。

select * from dba_profiles where resource_name='IDLE_TIME';
select * from dba_profiles where resource_name='CONNECT_TIME';
select * from dba_2pc_pending;
select * from session_privs;
SELECT * FROM DBA_TAB_PRIVS;
SELECT * FROM DBA_TAB_PRIVS where owner='<schema_user>';
SELECT * FROM USER_ROLE_PRIVS;

我知道在Oracle12中,XA是默认启用的。但是,我们是否需要向模式所有者授予参与事务的任何权限?

在与我的DBA团队进行了几次电子邮件交流后,他们最终通过执行以下命令授予了用户权限,从而解决了问题。希望这能有所帮助。

GRANT EXECUTE ON SYS.DBMS_XA TO <user>;
Prompt Privs on TABLE SYS.PENDING_TRANS$ to <user>;
GRANT SELECT ON SYS.PENDING_TRANS$ TO <user>;

有点晚了,但根据您的内部解决方案或外部库需求,您可能需要2个以上的GRANT。总结:

grant execute on dbms_xa                  to <user>;
grant select  on pending_trans$           to <user>; 
grant select  on dba_2pc_pending          to <user>;
grant select  on dba_pending_transactions to <user>;

最后,要了解您是否具有正确的权限,只需尝试访问需要授予的表/包中的(SELECT/EXECUTE)即可。例如:

-- Running those in your <user> should not error.
SELECT * FROM sys.dba_pending_transactions;
SELECT * FROM sys.pending_trans$;
SELECT * FROM sys.dba_2pc_pending;

或者,如果您可以访问SYSDBA:

select * from USER_TAB_PRIVS where Grantee = <user>;

根据Oracle XA分布式事务白皮书:

第11页,

类似地,对于PL/SQL(来自Oracle数据库11gR1),DBMS_XA包中的XA_SETTIMEOUT函数可用于设置事务超时,默认值为60秒。

第12页,

如果事务超时并变得"有疑问",它将出现在DBA_2PC_PENDING和DBA_PENDING_TRANSACTIONS视图中。

第14页,

Oracle数据库允许访问数据库内分布式事务的以下信息:

  • 关于未解决的分布式事务(例如,准备和等待提交/回滚)的信息可通过DBA_PENDING_transactions系统视图获得
  • 有关等待恢复的分布式事务(例如"有疑问"事务)的信息可通过DBA_2PC_PENDING系统视图获得
  • 有关当前活动的分布式事务的信息可通过V$GLOBAL_TRANSACTION系统视图获得

第19页:

任何执行分布式事务的数据库帐户都必须具有以下权限:

  • 具有读取DBA_PENDING_TRANSACTIONS系统视图的权限(GRANT)
  • 对于需要操作其他数据库用户创建的分布式事务的数据库用户,具有"强制任何事务"权限(GRANT)

此外,使用RAC时,用户帐户必须具有以下权限:

  • 拥有执行DBMS_SYSTEM系统包的权限(GRANT)(9.2.0.8或10.2.0.3及以下版本,5945463的补丁除外
  • 服务器,5965349–OCI/C库,5892995 JDBC已应用)或DBMS_XA系统包(10.2.0.4或更高版本,适用于数据库服务器、客户端OCI库或JDBC驱动程序)
  • 使用相同补丁集的客户端和服务器版本,或应用适当的补丁,以避免在同一部署中混合使用DBMS_SYSTEM包和DBMS_XA包

第20页,

XA接口中可用的功能,用于支持涉及多个资源管理器(如数据库和队列)的事务。PL/SQL现在能够使用DBMS_XA包中包含的XA/Open接口库在SQL*Plus会话或进程之间切换或共享事务(例如,XA_START用于加入事务,XA_END用于离开事务)。

第24页,

尽管本文描述了配置具有执行权限的XA数据库用户(GRANT)10.2.0.3的DBMS_SYSTEM系统包,这可能需要对DBMS_XA的权限数据库的更高版本的系统包。

因此,我们需要对DBA_2PC_PENDINGDBA_PENDING_TRANSACTIONS执行SELECT GRANT。如果我们想处理";有疑问";事务,Atomikos许多功能所需的东西(即,由可疑分布式事务、过期可疑事务等持有的解锁)

除此之外,我们还需要DBA_PENDING_TRANSACTIONS上的SELECT GRANT。关于DBMS_SYSTEM,我们使用的是Oracle 11g(高于10.2.0.4),因此我们应该对DBMS_XA表执行GRANT。

如果我们想了解为什么使用DBMS_XA而不是DBMS_SYSTEM,请参阅第18页,其中解释了原因:

以前的XA客户端需要在DBMS_SYSTEM上执行特权才能调用DIST_TXN_SYNC。此安全增强需要更改服务器和客户端软件(例如客户端OCI库和JDBC),以便调用包DBMS_XA而不是DBMS_SYSTEM。这意味着,为了避免数据库故障转移时出现用户权限错误,所有XA客户端用户现在都需要对DBMS_XA而不是DBMS_SYSTEM执行权限。

关于pending_trans$,像Atomikos团队(和IBM团队)这样的XA工具可能正在使用这个值,因此它通常被记录为必需的授权。

也许他们是通过一份遗留文档得出这个价值的,该文档中写道:

对于Oracle,XA数据源的数据库用户需要必要的权限才能在应用程序服务器崩溃并重新启动后恢复任何事务。事务恢复所需的各种表上的Oracle权限包括:

  • SELECT对DBA_PENDING_TRANSACTIONS、PENDING_TRANS$、DBA_2PC_PENDING和DBA_2PC_NEIGHBORS表的权限
  • 对DBMS_SYSTEM表的EXECUTE权限

如果您查看ORA-01500到ORA-02098的错误范围,您将看到正在使用/描述PENDING_TRANS$

最新更新