使用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错误