top of page
Admin

Перемещаемый сервис для Primary инстанса Oracle (ADG)

Обновлено: 7 сент. 2021 г.

В конфигурации со Standby базой при переключении на резервную БД возникает ситуация, что клиенты как и ранее осуществляют попытки подключения к старому промышленному серверу.


Для исключения данной проблемы можно использовать перемещаемые сервисы, для этого необходимо:


Указать значение параметра local_listener

Пример:


alter system set local_listener='(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.45)(PORT = 1522))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))))' scope=both;

перерегистрировать инстанс в листенере


alter system register;

Создать перемещаемые сервисы в пром базе


begin DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME=>'PRIMARY',NETWORK_NAME=>'PRIMARY'); 
end;
begin DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME=>'ADG',NETWORK_NAME=>'ADG');  end;
begin DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME=>'SNAP',NETWORK_NAME=>'SNAP'); end;
begin DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME=>'LOGICAL',NETWORK_NAME=>'LOGICAL'); 
end;

Названия сервисов могут быть любыми.


Создать триггер который при старте базы данных будет запускать тот или иной сервис


CREATE OR REPLACE TRIGGER START_SERVICE AFTER STARTUP ON DATABASE
DECLARE
  DBROLE VARCHAR(30);
  OPEN_MODE VARCHAR(30);
BEGIN

  SELECT DATABASE_ROLE INTO DBROLE FROM V$DATABASE;
  SELECT OPEN_MODE INTO OPEN_MODE FROM V$DATABASE;
  IF DBROLE = 'PRIMARY' THEN
     DBMS_SERVICE.START_SERVICE ('PRIMARY');
  ELSIF DBROLE = 'PHYSICAL STANDBY' THEN
        IF OPEN_MODE LIKE 'READ ONLY%' THEN
           DBMS_SERVICE.START_SERVICE ('ADG');
        END IF;

  ELSIF DBROLE = 'LOGICAL STANDBY' THEN
        DBMS_SERVICE.START_SERVICE ('LOGICAL');
  ELSIF DBROLE = 'SNAPSHOT STANDBY' THEN
        DBMS_SERVICE.START_SERVICE ('SNAP');

  END IF;

END;
/  

Перезапускаем базу, проверяем зарегистрирован ли сервис



Добавляем клиентам оба адреса в блок в файл tnsnames.ora и указываем имя промышленного сервиса


PROMDB =
 (DESCRIPTION =
    (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.45)(PORT = 1522))
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.46)(PORT = 1522))
       )
       (CONNECT_DATA =
       (SERVICE_NAME = PRIMARY)
    )
 )

80 просмотров0 комментариев

Недавние посты

Смотреть все

Comments


bottom of page