5

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

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

4

6 回答 6

8

You can verify db link by executing:

select * from dual@my_db_link;

To can create function that verifies 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;

Lastly, you can create table my_db_links(id, name, status(0,1)) and update it:

update 
  my_db_links mdl
set
  mdl.status = is_link_active(mdl.name);
于 2013-09-17T13:00:34.483 回答
2

我不确定您是否可以创建查询来检查实时数据库链接。您可以做的一件事是创建一个由后台进程更新的表,其中包含数据库链接列表,并为每个链接创建一个“最后一次看到活动”时间戳

于 2010-10-03T12:35:41.377 回答
2

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

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

  • 远程帐户被锁定

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

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

  • 网络连接

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

于 2010-10-03T14:04:21.720 回答
1

您可以编写一个执行 tnsping 的操作系统级脚本,因为 db 链接通常依赖于 tnsnames.ora。

于 2010-10-04T05:36:46.737 回答
1

You could use WITH FUNCTION and do simple check:

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;

As result you will get OK or error message.

于 2018-03-13T15:22:09.497 回答
0

I don't know if you managed to get this done, but I wanted to do something like this and check which database links are active. I found this on another forum

Select * from v$dblink 

which shows only active dblinks. Again, this will work only if you have permission to access v$dblink.

于 2011-06-21T10:30:17.847 回答