如果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
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