如何在Oracle中检查数据库链接是否有效?

5
我有一个主数据库,仅在总部存储设置数据,并在不同分支机构中有多个数据库。我为每个分支服务器创建了一个数据库链接。
在某些情况下,我希望查询所有有效的链接(因为某些链接可能由于连接问题或其他原因无效),所以我的问题是如何检查数据库链接是否有效,而不会遇到连接超时问题。是否有一种SQL语句让Oracle主服务器进行检查并仅返回有效的数据库链接?
6个回答

8

您可以通过执行以下操作来验证数据库连接:

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);

2

我不确定您是否可以创建一个查询来检查实时数据库链接。

您可以做的一件事是创建一个表,由后台进程更新该表中的db链接列表,并为每个链接维护一个“最后一次活动时间戳”。


那也可能是一个解决方案,谢谢 vc74。 - Khaled

2
任何链接都可能存在不同类别的问题:
  • 无效的链接定义:用户名、密码(如果有)、服务名称错误
  • 远程账户被锁定
  • 远程数据库配置问题(例如,用户会话超限)
  • 远程数据库或主机不可用
  • 网络连接问题
由于这些故障模式的变化性,不能有一个字典视图(例如)来描述链接的状态。在后台进行检查的异步进程也有可能过时。你可以进行的最轻量级的测试可能是在需要在代码中使用链接之前发出“select sysdate from dual@remote_db”的命令。

1
谢谢您的回答,但我使用这种方法遇到的问题是等待直到超时异常出现。因此,如果由于任何原因其中一个数据库链接不可用,我将不得不等待服务器停止尝试连接! - Khaled

1

您可以编写一个操作系统级别的脚本来执行tnsping,因为数据库链接通常都依赖于tnsnames.ora文件。


对于 Windows 系统,请在 tnsping 后立即检查 %errorlevel% 值。如果它是 0 == OK,1 == ERROR。对于 UNIX 系统,返回码为 $?(与 errorlevel 等效)。 - Stellios
dblink可能有错误的密码,而tnsping无法知道。 - Tulains Córdova

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或错误消息。

0

我不知道你是否已经完成了这个任务,但我想做类似的事情并检查哪些数据库链接是活动的。我在另一个论坛上找到了这个。

Select * from v$dblink 

这将仅显示活动的dblink。但是,只有在您有访问v$dblink的权限时才能使用此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接