当前位置: 首页 > Oracle, oracle 11g > 正文

使用DBLINK跨库查询遇到ORA-16000 database open for read-only access错误

开发人员在备库使用DB LINK跨库查询时遇到ORA-16000: database open for read-only access错误。

SQL> SELECT A.ERP单号 AS REP_NO, 
  2  A.SKU AS SKU, 
  3  A.在途数量 AS QTY, 
  4  LOTATT08 AS GB_LVL 
  5  FROM VIEW_EDI_ERP_INVONLINE@WMS A 
  6  LEFT JOIN DOC_ASN_DETAILS@WMS B 
  7  ON A.WMS单号 = B.ASNNO 
  8  AND A.WMS行号 = B.ASNLINENO 
  9  WHERE TO_DATE(A.日期) = DATE '2016-06-27' 
 10  UNION ALL 
 11  SELECT A.ERP单号 AS REP_NO, 
 12  A.SKU AS SKU, 
 13  A.在途数量 AS QTY, 
 14  LOTATT08 AS GB_LVL 
 15  FROM WMS_HM_USER.VIEW_EDI_ERP_INVONLINE@WMS_WX A 
 16  LEFT JOIN WMS_HM_USER.DOC_ASN_DETAILS@WMS_WX B 
 17  ON A.WMS单号 = B.ASNNO 
 18  AND A.WMS行号 = B.ASNLINENO 
 19  WHERE TO_DATE(A.日期) = DATE '2016-06-27' ;
LEFT JOIN WMS_HM_USER.DOC_ASN_DETAILS@WMS_WX B
                                      *
ERROR at line 16:
ORA-16000: database open for read-only access

查看SQL可以发现,这个SQL使用了两个DB LINK,使用DB LINK查询会创建一个事务,同时使用两个DB LINK就需要创建两个事务,这就需要支持分布式事务,可这个数据库是ADG的一个备库,并不支持分布式事务,就遇到了上面的错误,可以通过以下实验来验证。

打开一个会话,先使用WMS这个DB LINK查询,然后在使用WMS_WX这个DB LINK查询,这样第二个DB LINK的查询就会遇到ORA-16000错误。

SQL> select 1 from dual@WMS;

         1
----------
         1

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

有人可能会怀疑是不是WMS_WX这个DB LINK本身存在问题,下面重新打开一个会话,先使用WMS_WX这个DB LINK查询,然后再使用WMS这个DB LINK查询,依然会在第二次使用DB LINK时遇到ORA-16000错误,这也证明了两个DB LINK本身都是没有问题的。

SQL> select 1 from dual@WMS_WX;

         1
----------
         1

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

在第一个DB LINK打开的事务结束后,第二个DB LINK可以创建事务,也就可以使用了。

SQL> select 1 from dual@WMS;

         1
----------
         1

SQL> commit;

Commit complete.

SQL> select 1 from dual@WMS_WX;

         1
----------
         1

SQL> commit;

Commit complete.

SQL>  select 1 from dual@WMS;

         1
----------
         1

ORACLE数据库也支持分布式事务,在主库可以运行这个SQL,备库则不可以。

本文固定链接: http://www.dbdream.com.cn/2016/07/%e4%bd%bf%e7%94%a8dblink%e8%b7%a8%e5%ba%93%e6%9f%a5%e8%af%a2%e9%81%87%e5%88%b0ora-16000-database-open-for-read-only-access%e9%94%99%e8%af%af/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2016年07月27日发表在 Oracle, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 使用DBLINK跨库查询遇到ORA-16000 database open for read-only access错误 | 信春哥,系统稳,闭眼上线不回滚!
关键字: ,

使用DBLINK跨库查询遇到ORA-16000 database open for read-only access错误:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter