通过Oracle DB Link跨库查询后,如何在目标库DB2中溯源查询的SQL文本及执行源信息
通过Oracle DB Link跨库查询后,如何在目标库DB2中溯源查询的SQL文本及执行源信息
针对你这个场景,我来梳理下在Oracle目标库DB2里溯源跨库查询的具体方法,分为定位发起端信息和查找执行的SQL文本两部分:
一、先定位跨库查询对应的会话(获取发起机器、OS用户)
当你从DB1通过dblink发起查询时,DB2上会生成一个专属的数据库会话,我们可以通过V$SESSION视图找到它,关键是筛选出dblink连接的特征:
SELECT sid, serial#, machine, osuser, username, program FROM v$session WHERE username = '创建dblink时指定的DB2用户名' -- 也就是你写的"Connect to user"里的user AND program LIKE '%SQL*Net%'; -- dblink通过SQL*Net协议连接,program字段会带有这个标识
- 这里的
machine就是发起查询的DB1所在的机器名称; osuser是DB1那边执行该查询的操作系统用户;username是dblink连接DB2时使用的数据库账号。
二、关联会话查找对应的SQL文本
拿到上面查询到的sid和serial#后,我们可以关联V$SQL视图获取执行的SQL内容:
SELECT s.sql_text, s.sql_id FROM v$sql s JOIN v$session ses ON s.sql_id = ses.sql_id WHERE ses.sid = '第一步查到的sid值' AND ses.serial# = '第一步查到的serial#值';
如果这个查询执行完很久,V$SQL里的缓存记录已经被清理,还可以借助AWR(自动工作负载仓库)的历史视图来回溯,前提是你的DB2启用了AWR:
SELECT sql_text FROM dba_hist_sqltext WHERE sql_id = '从V$SESSION中拿到的sql_id';
注意事项
- 要查询这些动态性能视图,你需要拥有
SELECT_CATALOG_ROLE角色,或者被单独授权查询V$SESSION、V$SQL等视图; - 如果同一时间有多个相同dblink的连接,你可以结合
logon_time字段(会话创建时间)来匹配你查询的时间点,缩小范围。
备注:内容来源于stack exchange,提问作者Lagquary
相关产品推荐
相关产品推荐

