В конфигурации со 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)
)
)
Comments