ORA-16000: Oracle数据库:db link与read only

如果Oracle数据库是以read only模式打开的,则无法通过db link访问远程数据库。因为只要通过db link,即使只执行select,oracle也是要开启分布式事务支持的,事务需要分配回滚段,而read only模式下是没有online的回滚段的:

SQL>select id from auction_auctions@lnk_db1 where rownum=1;
select id from auction_auctions@lnk_db1 where rownum=1
               *
ERROR at line 1:
ORA-16000: database open for read-only access
在一个read write的库上做个测试,可以看到通过db link的查询确实开启了事务,并且分配了回滚段。

SQL>select sid from v$mystat where rownum=1;

       SID
----------
      1270

SQL>select 1 from dual@lnk_db1;

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

SQL>select s.sid,s.serial#,s.sql_hash_value,
  2   r.segment_name,
  3   t.xidusn,
  4   t.xidslot,
  5   t.xidsqn
  6   from v$session s,
  7   v$transaction t,
  8   dba_rollback_segs r
  9   where s.taddr = t.addr
10   and t.xidusn = r.segment_id(+);                                          

       SID    SERIAL# SQL_HASH_VALUE SEGMENT_NA     XIDUSN    XIDSLOT     XIDSQN
---------- ---------- -------------- ---------- ---------- ---------- ----------
      1270      37655              0 _SYSSMU10$         10         45    2042124
可以看到session 1270虽然只执行了一条select语句,但是由于使用了db link,确实开启了一个活动事务,并且分配了一个回滚段_SYSSMU10$。

Update:实际上还是有办法绕过这个问题的。Oracle提供了read only的事务,是无须用到回滚段的。

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

SQL>set transaction read only;

Transaction set.

SQL>select 1 from dual@lnk_db1;

         1
----------
         1
参考:Note:437254.1 Ora-16000 Generated Selecting DB Link On Read Only Database.

本文来自:http://rdc.taobao.com/blog/dba/html/206_ora-16000_on_read_only_database_using_dblink.html

你可能感兴趣的:(oracle数据库)