使用DB链接访问Oracle数据库的其他数据库的详细信息

时间:2012-08-16 16:37:58

标签: oracle

有没有办法找到使用数据库链接访问我们的Oracle数据库的数据库的详细信息? Dba_db_links 保存有关我们在数据库中访问其他数据库的数据库链接的信息,但是有一个类似的表,我们可以从中找到访问我们数据库的数据库链接或记录的数据库一些在哪里?

先谢谢。

3 个答案:

答案 0 :(得分:2)

我同意Justin的观点,即没有办法确定将数据库链接到给定数据库的所有数据库的显式列表。

但是, 可以监控活动数据库链接。您可以使用以下查询来查看通过数据库链接以及从哪些数据库进行的会话:

-- who is querying via dblink?
-- Courtesy of Tom Kyte, via AskTom
-- this script can be used at both ends of the database link
-- to match up which session on the remote database started
-- the local transaction
-- the GTXID will match for those sessions
-- just run the script on both databases

Select /*+ ORDERED */
substr(s.ksusemnm,1,10)||'-'|| substr(s.ksusepid,1,10)      "ORIGIN",
substr(g.K2GTITID_ORA,1,35) "GTXID",
substr(s.indx,1,4)||'.'|| substr(s.ksuseser,1,5) "LSESSION" ,
s2.username,
substr(
   decode(bitand(ksuseidl,11),
      1,'ACTIVE',
      0, decode( bitand(ksuseflg,4096) , 0,'INACTIVE','CACHED'),
      2,'SNIPED',
      3,'SNIPED',
      'KILLED'
   ),1,1
) "S",
substr(w.event,1,10) "WAITING"
from  x$k2gte g, x$ktcxb t, x$ksuse s, v$session_wait w, v$session s2
where  g.K2GTDXCB =t.ktcxbxba
and   g.K2GTDSES=t.ktcxbses
and  s.addr=g.K2GTDSES
and  w.sid=s.indx
and s2.sid = w.sid;

希望有所帮助。

答案 1 :(得分:1)

当您在数据库A中创建指向数据库B的数据库链接时,没有向数据库B发送通知,因此B中没有数据字典表会告诉您A有一个链接。就B而言,数据库A只是另一个定期打开与数据库连接的客户端。

通常,当A想要创建到B的数据库链接时,为此目的将在B中创建用户(假设数据库链接使用固定用户而不是当前用户),因为您不想要密码此帐户定期过期,如果特定人员离开公司并删除了他或她的帐户,则不希望破坏数据库链接。您可以审核B上的连接,既可以针对为数据库链接创建的特定帐户,也可以审核所有用户,然后查看审核日志以识别来自容纳其他数据库的服务器的连接。

答案 2 :(得分:0)

你可能正在寻找这个。

步骤1:检查X数据库中会话的hash_value。     从v $ session中选择sql_hash_value,其中sid =& sid;

步骤2:检查触发SQL的X数据库中的会话的完整SQL。     从v $ sql中选择sql_fulltext,其中hash_value =& hash_value;

步骤3:记下SQL中调用的所有数据库链接,并标识这些数据库链接的主机。     select * from dba_db_links where db_link like upper('& db_link');

步骤4:在每个主机(仅指一个远程主机,指向数据库Y)和数据库X本身,触发上述查询(Tom Kyte's)以收集来自远程数据库的会话的会话详细信息。

步骤5:在数据库X中,检查感兴趣的SID及其对应的GTXID。在远程主机Y中查找相同的GTXID。

步骤6:从数据库Y获取此GTXID的会话ID,并检查会话等待或其他详细信息。