我有一个主数据库,只有总部的设置数据和不同分支的几个数据库。我为每个分支服务器创建了一个数据库链接。
在某些情况下,我想查询所有有效链接(因为某些链接可能由于连接问题或其他任何原因而无效),所以我的问题是如何检查数据库链接是否有效而不会出现连接超时问题。是否有一个SQL语句让oracle主服务器执行检查并仅返回有效的数据库链接?
答案 0 :(得分:6)
您可以通过执行以下命令验证数据库链接:
select * from dual@my_db_link;
要创建验证数据库链接的函数:
function is_link_active(
p_link_name varchar2
) return number is
v_query_link varchar2(100) := 'select count(*) alive from dual@'||p_link_name;
type db_link_cur is REF CURSOR;
cur db_link_cur;
v_status number;
begin
open cur FOR v_query_link;
loop
fetch cur INTO v_status;
exit when cur%notfound;
dbms_output.put_line('v_status='||v_status);
return v_status;
end loop;
close cur;
exception when others then
close cur;
return 0;
end is_link_active;
最后,您可以创建表my_db_links(id,name,status(0,1))并更新它:
update
my_db_links mdl
set
mdl.status = is_link_active(mdl.name);
答案 1 :(得分:2)
我不确定您是否可以创建查询来检查实时数据库链接。 您可以做的一件事是创建一个由后台进程更新的表,其中包含数据库链接列表,并为每个链接创建一个“上次看到活着”时间戳
答案 2 :(得分:2)
由于不同类别的问题,任何链接都可能出现问题:
链接定义无效:错误 用户名,密码(如果使用),服务 名称
远程帐户锁定
远程数据库配置(例如,超出每个用户的会话数)
远程数据库或主机不可用
鉴于这些失败模式的性质发生变化,不能有一个描述链接状态的字典视图(例如)。在后台检查的异步过程也有可能过时。您可以做的最轻量级测试可能是在您需要使用代码中的链接之前发出“从dual @ remote_db中选择sysdate”
答案 3 :(得分:1)
您可以编写执行tnsping的操作系统级脚本,因为数据库链接通常依赖于tnsnames.ora。
答案 4 :(得分:1)
您可以使用WITH FUNCTION
并进行简单检查:
WITH FUNCTION check_dblink(p_dblink IN VARCHAR2) RETURN VARCHAR2 IS
r INT;
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM dual@"' || p_dblink || '"' INTO r;
RETURN 'OK';
EXCEPTION
WITH OTHERS THEN
RETURN SQLERRM;
END;
SELECT check_dblink(db_link), udl.*
FROM user_db_links udl;
结果您将收到OK
或错误消息。
答案 5 :(得分:0)
我不知道你是否设法完成了这项任务,但我想做这样的事情并检查哪些数据库链接是活动的。我在另一个论坛上发现了这个
Select * from v$dblink
仅显示活动的dblink。同样,只有在您有权访问v$dblink
时才会有效。