Как проверить, действительна ли ссылка на базу данных в Oracle? - PullRequest
5 голосов
/ 03 октября 2010

У меня есть основная база данных с данными настройки только в штаб-квартире и несколько баз данных в разных филиалах. Я создал ссылку на базу данных для каждого сервера филиала.

В некоторых случаях я хотел бы запросить все действительные ссылки (поскольку некоторые ссылки могут быть недействительными из-за проблем с подключением или чего-либо еще), поэтому мой вопрос: как проверить, действительна ли ссылка на базу данных, не попадая в проблемы тайм-аута соединения , Существует ли оператор SQL, позволяющий главному серверу oracle выполнять эту проверку и возвращать только действительные ссылки на базу данных?

Ответы [ 6 ]

6 голосов
/ 17 сентября 2013

Вы можете проверить ссылку на БД, выполнив:

select * from dual@my_db_link;

To может создать функцию, которая проверяет связь БД:

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 голосов
/ 03 октября 2010

У любой ссылки может быть проблема из-за разных категорий проблем:

  • неверное определение ссылки: неверно имя пользователя, пароль (если используется), сервис имя

  • удаленный аккаунт заблокирован

  • конфигурация удаленной базы данных (например, превышено количество сеансов на пользователя)

  • удаленная недоступность базы данных или хоста

  • сетевое подключение

Учитывая изменяющуюся природу этих режимов отказа, не может быть словарного представления (например), которое описывает состояние ссылки. Асинхронный процесс, выполняющий проверку в фоновом режиме, также может быть устаревшим. Вероятно, самый легкий тест, который вы можете сделать, это выдать «select sysdate from dual @ remote_db», прежде чем вам нужно будет использовать ссылку в вашем коде

2 голосов
/ 03 октября 2010

Я не уверен, что вы можете создать запрос, чтобы проверить живые ссылки на БД.Одна вещь, которую вы могли бы сделать, - это создать таблицу, обновленную фоновым процессом со списком ссылок на БД и для каждой из них отметку времени «последний раз видели живым»

1 голос
/ 13 марта 2018

Вы можете использовать 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 или сообщение об ошибке.

1 голос
/ 04 октября 2010

Вы могли бы написать сценарий уровня ОС, который выполняет tnsping, так как ссылки на базы данных обычно зависят от tnsnames.ora.

0 голосов
/ 21 июня 2011

Я не знаю, удалось ли вам это сделать, но я хотел сделать что-то подобное и проверить, какие ссылки на базы данных активны. Я нашел это на другом форуме

Select * from v$dblink 

, который показывает только активные ссылки. Опять же, это будет работать, только если у вас есть разрешение на доступ v$dblink.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...