Admin

28 авг. 2021 г.1 мин.

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

Пост обновлен 6 сент. 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)
 
)
 
)

    620
    0