ITPub博客

首页 > 数据库 > Oracle > [20241128]如何知道事务是包含dblink的情况(11g).txt

[20241128]如何知道事务是包含dblink的情况(11g).txt

原创 Oracle 作者:lfree 时间:2024-11-30 19:31:53 0 删除 编辑

[20241128]如何知道事务是包含dblink的情况(11g).txt

--//工作需要,我需要知道某个事务里面是否涉及dblink,当简单的sql语句包含dblink时,会同步scn,导致产生小量日志。
--//我需要知道某个事务是否涉及dblink,昨天的测试在21c,今天在11g测试看看。

1.环境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create public database link loopback
connect to scott
identified by "book"
using '127.0.0.1/book0';
--//没有其他主机,使用loopback地址。

2.测试:
--//session 1:
SCOTT@book> create table deptx as select * from dept;
Table created.

SCOTT@book> select * from deptx@loopback where deptno=20;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS

--//session 2:
SYS@book>  @ trans
SYS@book> @pr
==============================
SID                           : 77
SERIAL#                       : 579
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000833DE7F0
SES_ADDR                      : 0000000085D2F2B8
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    421603
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 09:05:23
XIDUSN                        : 12
XIDSLOT                       : 19
XIDSQN                        : 42
XID                           : 0C0013002A000000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//0xFLAG =  421603,感觉从这个标识确定是否包含dblink。

--//session 1:
SCOTT@book> commit;
Commit complete.

SCOTT@book> update deptx set LOC=lower(loc) where deptno=20;
1 row updated.

--//session 2:
SYS@book>  @ trans
SYS@book> @pr
==============================
SID                           : 77
SERIAL#                       : 579
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000833DE7F0
SES_ADDR                      : 0000000085D2F2B8
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :       E03
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 09:07:11
XIDUSN                        : 8
XIDSLOT                       : 27
XIDSQN                        : 5476
XID                           : 08001B0064150000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//0xFLAG = E03, 是否前面的42可以作为dblink事务标识。

--//session 1,继续:
SCOTT@book> select * from deptx@loopback where deptno=20;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       dallas

--//session 2:
SYS@book> @pr
==============================
SID                           : 77
SERIAL#                       : 579
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000833DE7F0
SES_ADDR                      : 0000000085D2F2B8
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    420E03
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 09:07:11
XIDUSN                        : 8
XIDSLOT                       : 27
XIDSQN                        : 5476
XID                           : 08001B0064150000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//视乎前面42表示dblink事务。
--//简单测试一下,感觉情况就是这样,0xFLAG的前面42标识就是dblink相关事务。
--//不过我在生产系统看到的是0x40开头.

3.继续测试看看:
--//找一台测试机器,建立到它的dblink连接。
CREATE PUBLIC DATABASE LINK TEST033
 CONNECT TO SCOTT
 IDENTIFIED BY "btbtms"
 USING '192.168.100.33:1521/test';
--//发现1个小问题,口令要使用双引号,以前没注意.

--//session 1:
SCOTT@book> update dept@test033 set LOC=lower(loc) where deptno=20;
1 row updated.

--//session 2:
SYS@book> @ trans
SYS@book> @ pr
==============================
SID                           : 117
SERIAL#                       : 145
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 0000000081872780
SES_ADDR                      : 0000000085D84B38
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    401603
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 10:11:23
XIDUSN                        : 19
XIDSLOT                       : 23
XIDSQN                        : 48
XID                           : 1300170030000000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//这样看到确实是0x40开头.

--//在另外的服务器观察:
SYS@test> @ trans
SYS@test> @ tpt/pr
Pivoting output using Tom Kyte's printtab....
==============================
SID                           : 137
SERIAL#                       : 52177
USERNAME                      : SCOTT
TADDR                         : 00000000BC84CAD8
SES_ADDR                      : 00000000BF3FE5E0
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    401E03
STATUS                        : ACTIVE
START_DATE                    : 20241129 10:11:22
XIDUSN                        : 9
XIDSLOT                       : 4
XIDSQN                        : 1920
XID                           : 0900040080070000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//看到的是0x401E03.
--//是否可以猜测,本机看到的是0x401603,而dblink那边看到的是0x401E03.

--//session 1:
SCOTT@book> commit;
Commit complete.

--//session 2:
SYS@book> @ pr
PL/SQL procedure successfully completed.

--//在另外的服务器观察:
SYS@test> @ tpt/pr
Pivoting output using Tom Kyte's printtab....
PL/SQL procedure successfully completed.

4.继续:
--//我仔细看了flag,如果是dblink前面一定是0x40.而如果发起的dml修改的涉及dblink,后面4位是1603.如果有本地业务后4位变成1E03.
--//session 1:
SCOTT@book> update dept@test033 set LOC=upper(loc) where deptno=20;
1 row updated.

--//session 2:
SYS@book> @ pr
==============================
SID                           : 55
SERIAL#                       : 2931
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000818961A0
SES_ADDR                      : 0000000085D0A838
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    401603
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 10:34:27
XIDUSN                        : 9
XIDSLOT                       : 30
XIDSQN                        : 7386
XID                           : 09001E00DA1C0000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.

SYS@book> @ ftq 09001E00DA1C0000
XID                  START_SCN START_TIMESTAMP        COMMIT_SCN COMMIT_TIMESTAMP    LOGON_USER UNDO_CHANGE# OPERATION  TABLE_NAME           TABLE_OWNE ROW_ID              UNDO_SQL
---------------- ------------- ------------------- ------------- ------------------- ---------- ------------ ---------- -------------------- ---------- ------------------- --------
09001E00DA1C0000   13317115962 2024-11-29 10:34:26                                   SCOTT                 1 BEGIN

--//dnlink:
SYS@test> @ tpt/pr
Pivoting output using Tom Kyte's printtab....
==============================
SID                           : 137
SERIAL#                       : 52184
USERNAME                      : SCOTT
TADDR                         : 00000000BC84CAD8
SES_ADDR                      : 00000000BF3FE5E0
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :    401E03
STATUS                        : ACTIVE
START_DATE                    : 20241129 10:34:26
XIDUSN                        : 10
XIDSLOT                       : 6
XIDSQN                        : 29005
XID                           : 0A0006004D710000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.
--//早期的tpt脚本竟然使用Tom Kyte's printtab。

SYS@test> @ ftq 0A0006004D710000
XID                  START_SCN START_TIMESTAMP      COMMIT_SCN COMMIT_TIMESTAMP  LOGON_USER UNDO_CHANGE# OPERATION  TABLE_NAME           TABLE_OWNE ROW_ID              UNDO_SQL
---------------- ------------- ----------------- ------------- ----------------- ---------- ------------ ---------- -------------------- ---------- ------------------- ------------------------------------------------------------------------------------------
0A0006004D710000   13317115962 20241129 10:34:26                                 SCOTT                 1 UPDATE     DEPT                 SCOTT      AAAMlqAAEAAAAAQAAB  update "SCOTT"."DEPT" set "LOC" = 'dallas' where ROWID = 'AAAMlqAAEAAAAAQAAB';
0A0006004D710000   13317115962 20241129 10:34:26                                 SCOTT                 2 BEGIN

--//session 1:
SCOTT@book> update dept set LOC=upper(loc) where deptno=20;
1 row updated.

--//session 2:
SYS@book> @ trans
SYS@book> @ pr
==============================
SID                           : 55
SERIAL#                       : 2931
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000818961A0
SES_ADDR                      : 0000000085D0A838
USED_UBLK                     : 2
USED_UREC                     : 2
0xFLAG                        :    401E03
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 10:34:27
XIDUSN                        : 9
XIDSLOT                       : 30
XIDSQN                        : 7386
XID                           : 09001E00DA1C0000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.

--//如果有事务在本机,看到的后4位变成1E03.
--//提交后,dblink事务也一起提交.

--//session 1:
SCOTT@book> update dept set LOC=upper(loc) where deptno=20;
1 row updated.

--//session 2:
SYS@book> @ pr
==============================
SID                           : 55
SERIAL#                       : 2931
TRANS_USERNAME                : SCOTT
PROGRAM                       : SQLPLUS@GXQYYDG4 (TNS V1-V3)
TADDR                         : 00000000818961A0
SES_ADDR                      : 0000000085D0A838
USED_UBLK                     : 1
USED_UREC                     : 1
0xFLAG                        :       E03
STATUS                        : ACTIVE
STATUS2                       : ACTIVE
START_DATE                    : 2024-11-29 10:43:09
XIDUSN                        : 13
XIDSLOT                       : 5
XIDSQN                        : 49
XID                           : 0D00050031000000
PRV_XID                       : 0000000000000000
PTX_XID                       : 0000000000000000
PL/SQL procedure successfully completed.

--//测试有点乱。

5.附上ftq.sql脚本:

$ cat ftq.sql
column UNDO_SQL format a90
column LOGON_USER format a10
column OPERATION format a10
column TABLE_NAME format a20
column TABLE_owner format a10
column START_SCN format 999999999999
column COMMIT_SCN format 999999999999
--//alter database add supplemental log data;
select * from flashback_transaction_query where xid=hextoraw('&&1');


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3053896/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969252