【问题标题】:oracle multiple database link read only access errororacle多数据库链接只读访问错误
【发布时间】:2015-09-14 15:25:43
【问题描述】:

查询是这样的

select 1 from dual@link1
union 
select 1 from dual@link2

然后我得到了只读访问错误。

我在所有这 3 个数据库中都有用户,他们都是只读用户,所以当我执行查询“select 1 from dual@link1”时,我得到了只读错误,然后我尝试将查询更改为

set transaction read only;
select 1 from dual@link1;

然后就解决了。

然后我尝试了如下查询:

select 1 from dual@link1
union 
select 1 from dual@link2

又出错了,我不知道为什么 1 个链接有效,但 2 个链接无效。

有人知道吗?

【问题讨论】:

  • 你到底得到了什么错误(包括ORA错误代码和完整的txt,如果有的话还有堆栈)?数据库链接和用户是如何定义的 - 你可以添加他们的创建 DDL 和任何用户授予的问题(当然是屏蔽密码)?
  • 如果你 set transaction read only 并单独运行第二部分 select 1 from dual@link2 会发生什么;这也有效吗?如果您在没有 set transaction 的情况下单独运行 select 怎么办 - 看起来第一部分仍然错误?目前尚不清楚您看到的问题是否与第二个查询/链接有关,或者仅当您将两个查询结合在一起时才会发生。 Link2 的 DB 上可能有一个登录触发器试图写一些东西吗?
  • 这是在java jdbc调用中,我记得oracle错误代码是ora-16000。
  • 当我运行其中任何一个时,两者都可以工作,只有当我在一个查询中运行它们时,它才会工作。奇怪的是,当在 pl/sql 或 sql plus 中运行它们时,它可以工作,用户是 DBA 创建的只读用户,我不能授予它任何权限,DBA 也不会。
  • 我们有许多不同名称的 oracle 实例,如果我不运行 set transaction 只读,它们都不会在某些数据库上工作,但有些会工作,它们都是相同的,我们的用户都是只读用户,现在有些oracle,我可以运行带有多个链接的联合,有些不能,但是然后使用pl / sql或sqlplus,一切正常,不知道我应该在java中做什么解决这个问题。

标签: database oracle dblink


【解决方案1】:

让数据库处于只读模式并涉及多个 dblink,这是一个相当令人惊讶的限制。

当您从第一个 dblink 读取数据后,您应该关闭当前事务 (!),然后才从第二个 dblink 读取数据。这显然会阻止您使用 SELECT 来连接来自两个 dblink 的表。

它已记录在案,但很难找到。在Starting Up and Shutting Down你可以看到:

在只读数据库上执行时,您必须先提交或回滚任何正在进行的涉及一个数据库链接的事务,然后才能使用另一个数据库链接。即使您在第一个数据库链接上执行通用 SELECT 语句并且事务当前是只读的,也是如此。

重申这个概念,如果您可以访问 metalink,有一个回复客户的 Oracle 说明,其中显示了一个示例 (Document 1296288.1),说明了限制

SQL> select * from emp@link_emp_chicago;
select * from emp@link_emp_chicago
*
ERROR at line 1:
ORA-16000: database open for read-only access
Solution

SQL> select open_mode,database_role from v$database;

OPEN_MODE DATABASE_ROLE
---------- ----------------
READ ONLY PHYSICAL STANDBY

SQL> select owner,db_link from all_db_links;

OWNER
------------------------------
DB_LINK

PUBLIC
LINK_EMP_CHICAGO

SQL> select * from emp@link_emp_chicago;
select * from emp@link_emp_chicago
*
ERROR at line 1:
ORA-16000: database open for read-only access

SQL> set transaction read only;


Transaction set.

SQL> select * from emp@link_emp_chicago;

EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800 20

7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30

7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30

只是推测,原因可能与words of Tom Kyte中的事实有关

分布式的东西“以防万一”开始交易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多