如何知道数据库中某处是否使用了 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;
我排除了 SYS
和 SYSTEM
,因为它们应该 不 包含任何用户的东西。也许您想排除更多用户。
要查看更多(资源)资源,请查询字典,例如
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,那就需要担心了。
我想知道是否存在一个 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;
我排除了 SYS
和 SYSTEM
,因为它们应该 不 包含任何用户的东西。也许您想排除更多用户。
要查看更多(资源)资源,请查询字典,例如
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,那就需要担心了。