Настройка Oracle Data Guard (physical standby)
Симптом
Цель: настроить аварийное восстановление и высокую доступность для Oracle с physical standby (Data Guard); иметь возможность переключиться на standby при сбое primary.
1. Переведите primary в режимы FORCE LOGGING и ARCHIVELOG
Чтобы standby оставался согласованным с primary, все изменения должны записываться в redo. FORCE LOGGING журналирует даже операции NOLOGGING. Для режима ARCHIVELOG база данных поднимается в состоянии MOUNT.
Oracle
ALTER DATABASE FORCE LOGGING;
-- For ARCHIVELOG:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;2. Добавьте standby redo log
В standby redo logs (SRL) должно быть на одну группу больше, чем в online redo logs, и тот же размер. Они создаются и на primary, и на standby; они необходимы для real-time apply. В примере online redo 200M, значит и SRL по 200M.
Oracle
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl04.log') SIZE 200M;3. Задайте log_archive_dest и связанные параметры
На primary определите dest_2 для передачи redo на standby. Задайте DB_UNIQUE_NAME, LOG_ARCHIVE_CONFIG (db_unique_name обеих сторон), FAL_SERVER и STANDBY_FILE_MANAGEMENT=AUTO. Так файлы будут автоматически создаваться на standby.
Oracle
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_prim,orcl_stby)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby';
ALTER SYSTEM SET FAL_SERVER='orcl_stby'; -- for role changes; on the standby FAL_SERVER='orcl_prim'
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;4. Создайте standby с помощью RMAN DUPLICATE FOR STANDBY
После настройки файла паролей и статического listener/tnsnames на сервере standby RMAN подключается к primary и к standby (AUXILIARY). FROM ACTIVE DATABASE копирует по сети без бэкапа; DORECOVER применяет redo.
Oracle
rman TARGET sys/password@orcl_prim AUXILIARY sys/password@orcl_stby
RUN {
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
DORECOVER
NOFILENAMECHECK;
}5. Запустите применение redo (MRP) и проверьте
Запустите managed recovery, пока standby находится в состоянии MOUNT; для real-time apply используйте USING CURRENT LOGFILE. Проверьте через v$managed_standby, что процесс применения (MRP0) работает.
Oracle
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
SELECT process, status, sequence# FROM v$managed_standby WHERE process LIKE 'MRP%';6. Включите Data Guard Broker
Broker централизует конфигурацию и сводит failover/switchover к одной команде. Задайте DG_BROKER_START=TRUE на обоих экземплярах, затем создайте и включите конфигурацию в dgmgrl. В 12c+ broker управляет транспортом redo: если LOG_ARCHIVE_DEST_2 был задан вручную, ADD DATABASE завершается ошибкой ORA-16698; сначала очистите его командой ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=''.
Oracle
ALTER SYSTEM SET DG_BROKER_START=TRUE;
-- In dgmgrl:
CREATE CONFIGURATION dgconf AS PRIMARY DATABASE IS orcl_prim CONNECT IDENTIFIER IS orcl_prim;
ADD DATABASE orcl_stby AS CONNECT IDENTIFIER IS orcl_stby;
ENABLE CONFIGURATION;7. Отслеживайте разрыв синхронизации и завершите тестирование
Разницу sequence между primary и standby нужно отслеживать постоянно; растущий разрыв указывает на узкое место в сети/применении. dgmgrl SHOW CONFIGURATION должен показывать 'SUCCESS'. При желании протестируйте смену ролей через switchover.
Oracle
-- dgmgrl (SHOW DATABASE shows the Transport Lag / Apply Lag values):
SHOW CONFIGURATION;
SHOW DATABASE orcl_stby;
-- SQL (standby): SELECT name, value FROM v$dataguard_stats WHERE name LIKE '%lag';