我有一个主数据库,仅在总部设置数据,在不同的分支机构有几个数据库。我为每个分支机构服务器创建了一个数据库链接。

在某些情况下,我想查询所有有效链接(因为某些链接可能由于连接问题或其他原因而无效),所以我的问题是如何检查数据库链接是否有效而不会出现连接超时问题。是否有 SQL 语句让 oracle 主服务器进行检查并仅返回有效的数据库链接?

有帮助吗?

解决方案

我不知道,你可以创建一个查询,以检查现场分贝链接。 有一两件事你可以做的是通过创建一个后台进程与数据库链接的列表,并为他们每个人的更新表中的“最后一次看到活着的”时间戳

其他提示

可以通过执行验证分贝链接:

select * from dual@my_db_link;

要可以创建函数验证DB链接:

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,名称,状态(0,1)),并对其进行更新:

update 
  my_db_links mdl
set
  mdl.status = is_link_active(mdl.name);

由于不同类别的问题,任何链接都可能出现问题:

  • 无效链接定义:错误的用户名,密码(如果使用),服务名称

  • 远程帐户被锁定

  • 远程数据库配置(例如超出每个用户的会话数)

  • 远程数据库或主机不可用

  • 网络连接

鉴于这些故障模式不断变化的性质,不可能有一个字典视图(例如)来描述链接的状态。在后台检查的异步进程也有可能过时。您可以做的最轻量级的测试可能是在需要使用代码中的链接之前发出“select sysdate from Dual@remote_db”

您可以写一个操作系统级别的脚本,执行一个TNSPING,因为DB链接通常依赖于tnsnames.ora反正。

您可以使用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或错误消息。

我不知道,如果你成功地完成这件事,但我想这样做,并检查其数据库链接是活动的。我发现这个另一个论坛上

Select * from v$dblink 

其示出了仅活性dblinks。同样,如果你有权限访问v$dblink这只会工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top