我在
DB1
中创建了从
table2
到
DB2
的数据库链接
Create database link mylink
Connect to user identified by passwd
Using DB2
然后在
DB1
我运行查询:
Select * from table2@mylink
在 DB2 中,我可以检查上面的 sql 文本并找出运行它的机器、操作系统用户吗?
是的,当然可以。但请注意,Oracle 通过远程链接转换您的 SQL,它不会完全相同,但仍然基本上可以识别。您会注意到的一件事是所有标识符均全部大写并用双引号引起来。第二件事是
osuser
将是 oracle
(假设默认软件所有者用于源数据库),并且 machine
将是源数据库的主机。它不会有任何识别信息将您直接绑定到客户端会话,因为您的 Oracle 拥有的“影子进程”正在建立与远程的连接。换句话说,本地会话的 v$process.spid
值将是远程会话的 v$session.process
。如果你知道你的本地会话,你可以这样找到它:
本地:
select spid from gv$process where (inst_id,addr) in (select inst_id,paddr from gv$session where sid = ? and session# = ? and inst_id = ?)
远程:
select * from gv$session where process = {spid from above} and machine = {source db host}
否则,您可以尝试在共享池中搜索 SQL。在目标数据库中,查询 gv$sqlarea
过滤表名称,全部大写并用双引号括起来:
select * from gv$sqlarea where sql_fulltext like '%"TABLE2"%'
,看看你是否可以通过这种方式找到它。如果当前正在运行,您可以加入
sql_id
到 gv$session
以获取会话信息。如果它是最近运行的,您也许可以在 gv$active_session_history
中找到它。