[20130701]db link与事务.txt

[20130701]db link与事务.txt

昨天帮别人修复数据库,安全起见,我先启动read only模式,叫他们检查一些相关数据是否正常,但是在程序界面上出现:
ORA-16000: database open for read-only access。

我跟踪发现执行的实际上通过db_link访问远程数据库的语句,不是dml语句(注:实际上执行dml,发生的事务也在远端,不在本地)。按
照这个道理如果数据库在只读的情况下,是不能访问远端的数据库的。

google 发现如下链接:

我回来后在我的机器做一次测试,发现在11g与10g下存在不同。这也解开了我在生产系统看到的一些奇怪情况。

1.建立测试环境:

SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
--建立db_link,并验证是否正确。
CREATE PUBLIC DATABASE LINK "TESTB.COM"
 CONNECT TO SCOTT
 IDENTIFIED BY 
 USING '192.168.XXX.YYY:1521/orcl';
--启动数据库到read only模式:
SQL> select open_mode from v$database ;
OPEN_MODE
--------------------
READ ONLY
2.开始测试:
$ cat viewredo.sql
SELECT b.NAME, a.statistic#, a.VALUE
  FROM v$mystat a, v$statname b
 WHERE b.NAME IN ('redo size', 'redo wastage','user commits') AND a.statistic# = b.statistic#;
SQL> @viewredo
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  6          0
redo size                   178          0
redo wastage                183          0

SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
no rows selected
SQL> select sysdate from dual@testb.com;
SYSDATE
-------------------
2013-07-01 09:42:28
--奇怪,居然成功!
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
no rows selected
SQL> @viewredo
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  6          0
redo size                   178          0
redo wastage                183          0
--在11G下没有回滚段产生,没有redo产生。
SQL> select dbms_transaction.local_transaction_id()  x from dual ;
X
------------------------------
65535.0.599562215
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBAREC STATUS           XID
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------------
        -1          0  599562215          0          0          0 IDLE             FFFF0000E797BC23
SQL> select * from FLASHBACK_TRANSACTION_QUERY where xid=hextoraw('FFFF0000E923393B');
no rows selected
SQL> @viewredo
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  6          0
redo size                   178          0
redo wastage                183          0

--奇怪,执行select dbms_transaction.local_transaction_id()  x from dual ;为什么会有事务回滚段。
--但是注意看xid*的信息很奇怪,XIDUSN=-1,UBAFIL,UBABLK,UBAREC都是0,按照这个信息,是不应该分配回滚段的。
-- 也就是并没有分配使用回滚段。这样应该也没有产生redo日志。

SQL> select * from dba_rollback_segs where segment_id=-1 ;
no rows selected
SQL> rollback ;
Rollback complete.
SQL> select dbms_transaction.local_transaction_id()  x from dual ;
X
------------------------------

--可以发现在11G(只读模式下)下通过db_link访问远端,没有redo size产生,不会报错。

3.在10G下测试,由于各种原因,我无法设置数据库在read only模式,不过还是能看出问题:

SQL> ver.sql
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
SQL> column name format a30
SQL> @viewredo.sql
NAME                           STATISTIC#      VALUE
------------------------------ ---------- ----------
user commits                            4          0
redo size                             134          0
redo wastage                          136          0
SQL> select sysdate from dual@mid ;
SYSDATE
-------------------
2013-07-01 11:27:58
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBAREC STATUS           XID
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------------
         5         67     414045          0          0          0 ACTIVE           050043005D510600
SQL> @viewredo.sql
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  4          0
redo size                   134        340
redo wastage                136          0

--很明显在10g下,要通过db_link访问远端数据库,要使用回滚段并且会产生redo。但是注意看UBAFIL,UBABLK,UBAREC都是0.

SQL> select * from FLASHBACK_TRANSACTION_QUERY where xid=hextoraw('050043005D510600');
XID               START_SCN START_TIMESTAMP     COMMIT_SCN COMMIT_TIMESTAMP    LOGON_USER UNDO_CHANGE# OPERATION  TABLE_NAME TABLE_OWNER ROW_ID UNDO_SQL
---------------- ---------- ------------------- ---------- ------------------- ---------- ------------ ---------- ---------- ----------- ---------------
050043005D510600 9672478702 2013-07-01 11:27:58                                XXXX                  1 BEGIN

--这个也是我们生产系统看到的情况。

4.在10G下如何实现不产生日志呢?可以设置回话事务的read only,来避免这个情况。不过估计没人会这么做!

SQL> @ver.sql
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
SQL> set transaction read only;
Transaction set.
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
no rows selected
SQL> @viewredo.sql
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  4          0
redo size                   134          0
redo wastage                136          0
SQL> select sysdate from dual@mid ;
SYSDATE
-------------------
2013-07-01 11:42:00
SQL> @viewredo.sql
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  4          0
redo size                   134          0
redo wastage                136          0
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
no rows selected
SQL> select dbms_transaction.local_transaction_id()  c20 from dual ;
C20
--------------------
5.25.414049
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBAREC STATUS           XID
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------------
         5         25     414049          0          0          0 ACTIVE           0500190061510600

5.回到11G,打开到read write模式:

SQL> select open_mode from v$database ;
OPEN_MODE
--------------------
READ WRITE
SQL> @viewredo
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  6          0
redo size                   178        724
redo wastage                183          0
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
no rows selected
SQL> select sysdate from dual@testb.com;
SYSDATE
-------------------
2013-07-01 12:04:05
SQL> select XIDUSN,XIDSLOT,XIDSQN,UBAFIL,UBABLK,UBAREC,STATUS,xid from v$transaction;
    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBAREC STATUS           XID
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ----------------
         9         13      15788          0          0          0 ACTIVE           09000D00AC3D0000
SQL> @viewredo
NAME                 STATISTIC#      VALUE
-------------------- ---------- ----------
user commits                  6          0
redo size                   178        980
redo wastage                183          0
SQL> select dbms_transaction.local_transaction_id()  x from dual ;
X
------------------------------
9.13.15788
SQL> select * from FLASHBACK_TRANSACTION_QUERY where xid=hextoraw('09000D00AC3D0000');
XID               START_SCN START_TIMESTAMP     COMMIT_SCN COMMIT_TIMESTAMP  LOGON_USER UNDO_CHANGE# OPERATION  TABLE_NAME TABLE_OWNER ROW_ID UNDO_SQL
---------------- ---------- ------------------- ---------- ----------------- ---------- ------------ ---------- ---------- ----------- ------ --------
09000D00AC3D0000 3237659553 2013-07-01 12:04:04                              SCOTT                 1 BEGIN

--可以发现一样产生日志!

总结:

    DBLINK是远程连接到其他数据库进行访问,这个会涉及到一个事务的关系。但是在11g在read only模式下使用dblink是没有问题的。

    

时间: 2024-09-20 20:29:55

[20130701]db link与事务.txt的相关文章

[20140408]db link 口令安全问题.txt

[20140408]db link 口令安全问题.txt 测试在11GR2 ,如果以sys用户登录,查询sys.link$基表,通过简单的函数很容易知道db link的口令. 例子: SYS@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3

[20150907]关于db link.txt

[20150907]关于db link.txt --有时候学习的需要,要测试db link的sql语句,需要使用到db link,而实际的情况仅仅1台机器,1个数据库. --即使你什么都不建立.也可以使用global_name作为db link. SCOTT@test> select global_name c10 from global_name; C10 ---------- TEST.COM --另外说明以下实际上访问的是sys.props$ 表.现在执行计划就可以知道. SCOTT@te

[20130415]数据泵与db link.txt

[20130415]数据泵与db link.txt 数据泵是10g以后采用的新特性,按照一些介绍速度比exp/imp快.以前我总是成对的使用它,也就是先expdp导出数据,然后再传输到新的服务器,然后在impdp导入数据,这样的过程明显不是很快,特别是导出文件很大的情况下,速度并没有感觉快到哪里,如果数据泵加上db link,这样仅仅使用impdp导入就可以,省去了前面的步骤. 自己做一个测试: 测试数据从10g服务器到11g的测试机的导入情况: 1.测试环境与配置如下: --测试机器A(11g

Oracle的DB Link

数据库之间的链接建立在DATABASE LINK上.要创建一个DB LINK,必须先在每个数据库服务器上设置链接字符串. 1. 配置TNS , $ORACLE_HOME/NETWORK/ADMIN/tnsname.ora 10gstandby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = HFCC-KF-3068)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NA

Oracle global database name与db link的纠缠关系

  ORACLE数据库中Global Database Name与DB LINKS的关系还真是有点纠缠不清,在说清楚这个关系前,我们先来了解一下Global Database Name的概念   Global DataBase Name 概念 1. What is a global database name? ------------------------------------------------------------------------------- The global da

关于db link权限分配的苦旅(二)

在几天前说过关于db link分配权限的问题,当时也折磨了我好一会儿 http://blog.itpub.net/23718752/viewspace-1869425/ 大体的情况还是在118的服务器中去访问128中的某个表的时候存在一些访问的问题,最后是重建了一个public的db link得以修复,当时对于这个问题的临时处理也是一波三折,还触发了一个oracle的bug,也算是有惊无险. 但是对于之前操作中的疑问在解释之后统一进行解答. 第二天的时候,开发的同事反馈说线上进行测试提dblin

关于db link权限分配的苦旅(一)

昨天接到一个开发的需求,内容看起来非常简单. 申请数据库192.168.1.118:1522:TEST下用户APP_TE_FLOW_128赋予对表testore_log的查询权限... 貌似这个语句也就几秒钟就可以搞定,直接赋予对象权限,或者角色都可以, 类似grant select on test.testore_log to APP_TE_FLOW_128; 但是这个看似简单的案例,我想用两篇日志来总结,因为里面有许多的内容量,中间的过程也是异常曲折,而且最开始的推论很可能是错误的,然后还可

link下如何实现11位的流水码转换为8位的,思路还是有点模糊?

问题描述 link下如何实现11位的流水码转换为8位的,思路还是有点模糊? link下如何实现11位的流水码转换为8位的,思路还是有点模糊? 解决方案 思路告诉你了,如果要代码,请先采纳,谢谢

[20170210]关于dblink.txt

[20170210]关于dblink.txt --昨天朋友要求建立的数据库关闭全部dblink.实际上很简单设置open_links,open_links_per_instance为0就ok了. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -----------------------