如何知道数据库中某处是否使用了 db-link

How to know if a db-link is used somewhere in a DB

我想知道是否存在一个 Oracle 命令来了解数据库中是否使用了 DB-LINK(名称:myBDLink)以及如何显示对象(视图、实体化视图、使用它的程序、函数...)。

你能帮我解决一下吗?

感谢您的帮助

没有完整的答案。数据库如何知道数据库外部的代码?它不能。所以如果你有一个 sql 脚本,或者一些不依赖存储过程来做所有事情的应用程序,数据库将不知道它们。

也就是说,对于数据库存储过程中的依赖,你可以试试这个:

select *
from dba_dependencies
where referenced_link_name is not null
;

那么,您可以尝试查询各种系统视图,看看其中是否包含您要查找的字符串。当您想检查整个数据库时,您可能会以特权用户身份连接并检查 dba_ 视图;否则,all_user_ 就可以了。

例如,检查过程、函数、包...:[=​​20=]

select owner, name, type, line
from dba_source
where owner not in ('SYS', 'SYSTEM')
  and lower(text) like '%mydblink%';

要检查视图,您需要一个函数来搜索其 LONG 数据类型列(因为您不能在 SQL 中直接使用它):

create or replace function f_long(par_view in varchar2, par_String in varchar2) 
  return varchar2 
is
  l_text varchar2(32000);
begin
  select text 
    into l_text
    from dba_views 
    where owner not in ('SYS', 'SYSTEM')
      and view_name = par_view;
    
  return case when instr(lower(l_text), lower(par_string)) > 0 then 1
              else 0 
         end;              
end;
/

然后

select owner, view_name 
from dba_views
where f_long(view_name, 'mydblink') = 1;

我排除了 SYSSYSTEM,因为它们应该 包含任何用户的东西。也许您想排除更多用户。


要查看更多(资源)资源,请查询字典,例如

select table_name, comments
from dictionary;

TABLE_NAME                     COMMENTS
------------------------------ --------------------------------------------------
USER_CONS_COLUMNS              Information about accessible columns in constraint
                                definitions

ALL_CONS_COLUMNS               Information about accessible columns in constraint
                                definitions

DBA_CONS_COLUMNS               Information about accessible columns in constraint
                                definitions
<snip>

要添加@Littlefoot 和@EdStevens 发布的其他(正确)答案,还可以针对自动工作负载存储库 (AWR) 进行快速分析。

这种方法的好处是,无论 SQL 是否在 DBA_SOURCE 中(例如,嵌入在外部应用程序)。

-- Find any objects referenced across a database link (sort of)
select object_node, object_name, count(distinct sql_id) sql_id_count
from dba_hist_sql_plan
where object_type = 'REMOTE'
group by object_node, object_name
order by object_node, object_name
;

问题是 AWR 数据不是 100% 完整。首先,它不会永远保留,因此不会看到上次使用超过一个月(或两个月或您的 DBA 将 AWR 数据保留多长时间)的数据库 link。其次,AWR 只定期拍摄快照,比如每小时拍摄一次。因此,理论上 SQL 可以使用数据库 link,然后在下一个 AWR 快照之前从库缓存中老化。

我认为在我使用的系统上,由于最后一位而丢失某些东西的可能性很小。但是,如果您的应用程序编写得不好(即没有绑定变量)和有限的共享池 space,那就需要担心了。