[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/ ,如需转载,请注明出处,否则将追究法律责任。