db link与read only
上一篇:淘宝2009校园招聘 下一篇:弹指红颜老,笑看风云淡

db link与read only

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

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

在一个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://www.ningoo.net/html/2008/ora-16000_on_read_only_database_using_dblink.html

订阅到Google | 收藏到Del.icio.us | 推荐到鲜果

相关文章 随机文章

本文Tags: ,

没有评论


(Required)
(Required, will not be published)