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

来源:这里教程网 时间:2026-03-03 20:56:55 作者:

[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');

相关推荐