使用DBLINK跨库查询遇到ORA-16000 database open for read-only access错误
Jul272016
开发人员在备库使用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,备库则不可以。
【上一篇】使用DBLINK跨库查询遇到ORA-01861,ORA-02063错误
【下一篇】ORA-02019 connection description for remote database not found错误
【下一篇】ORA-02019 connection description for remote database not found错误