• BigAdmin

Oracle standby database - configure

Пост обновлен май 2

Хорошая и полезная статья, взято с https://habr.com/ru/post/120495/

Главная идея при создании standby экземпляра состоит в том, чтобы с помощью выполнения транзакций, сохраненных в оперативных или архивных журналах основной БД, поддерживать резервную БД в актуальном состоянии (такой механизм для Oracle называется Data Guard).

Отсюда следует первое требование к нашей основной базе — она должна быть запущена в archivelog mode.

Вторым требованием является наличие файла паролей. Это позволит удаленно подключаться к нашей БД в административном режиме.

Третье требование — это режим force logging. Этот режим нужен для принудительной записи транзакций в redo logs даже для операций, выполняемых с опцией NOLOGGING. Отсутствие этого режима может привести к тому, что на standby базе будут повреждены некоторые файлы данных, т.к. при «накате» архивных журналов из них нельзя будет получить данные о транзакциях, выполненных с опцией NOLOGGING.

Также необходимо отметить, что если вы используете Oracle ниже 11g, то необходимо, чтобы сервера для основной базы и для standby имели одинаковую платформу. Т.е., если ваша основная база работает на Linux-сервере, то standby-сервер не может быть под управлением Windows.

1. Перевод базы в режим ARCHIVELOG (в случаи если она не работает в данном режиме):

SQL> shutdown immediate;

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

2.Проверяем наличие файла паролей

SQL> select * from v$pwfile_users;

Если поле sysdba не равно TRUE, или запрос не вернул данные, то

orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=<ваш пароль> force=y

3. Переводим БД в force loging:

SQL> alter database force logging;

Создаем standby redo logs. Они нужны только на standby базе для записи данных, сохраняемых в redo logs на основной базе. На основной базе они нам понадобятся, когда мы будем переключать ее в режим standby и при этом использовать real-time apply redo. Файлы standby redo logs должны быть такого же размера как и online redo logs. Посмотреть размер online redo logs можно с помощью команды:

SQL> select bytes/1024/1024 from v$log;

Проверяем номера существующих групп:

SQL> select group# from v$logfile;

Добавляем по очереди еще столько же групп redo:

SQL> alter database add standby logfile group <следующий номер> '<папка с журналами>/stnbylog01.log' size 50m;

На всякий случай для дальнейшей работы будем использовать не рабочий pfile, а создадим новый на основе spfile:

SQL> create pfile='<path>/pfileprod.ora' from spfile;

В сформированный файл внесем следующие строки

db_name='test' — это имя нашей базы (одинаковое для основного и standby экземпляра).

db_unique_name='testprod' — а это уникальное имя для каждого экземпляра, оно не будет изменяться при смене ролей со standby на production. log_archive_config='dg_config=(testprod,teststan)' — определяем имена экземпляров,

между которыми будет происходить обмен журналами.

log_archive_dest_1='SERVICE=teststan LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name='teststan' – когда экземпляр является основной базой (PRIMARY_ROLE), мы будем передавать архивные журналы на standby сервер с помощью процесса LGWR. Параметр ASYNC указывает, что данные, сгенерированные транзакцией, не обязательно должны быть получены на standby до завершения транзакции – это не приведет к остановке основной базы, если нет связи со standby.

log_archive_dest_2='LOCATION=/oradata/test/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=testprod' – здесь мы указываем каталог, куда будут локально сохранятся архивные журналы (для основной базы) или куда будут складываться пришедшие с основной базы журналы

(для standby базы).

log_archive_dest_state_1=ENABLE – включаем запись архивных журналов в log_archive_dest_1. Пока мы не создали standby базу, этот параметр можно поставить в значение DEFER, если мы не хотим видеть лишние сообщения о недоступности standby базы в alert_log.

log_archive_dest_state_2=ENABLE – включаем запись архивных журналов в log_archive_dest_2.

fal_client='testprod' – этот параметр определяет, что когда экземпляр перейдет в режим standby, он будет являться клиентом для приема архивных журналов (fetch archive log).

fal_server='teststan' – определяет FAL (fetch archive log) сервер, с которого будет осуществляться передача архивных журналов. Параметры fal_client и fal_server работают только когда база запущена в standby режиме.

standby_file_management='AUTO' – задаем режим автоматического управления файлами в standby режиме. При таком значении параметра все создаваемые или удаляемые файлы основной базы будут автоматически создаваться или удаляться и на standby базе.

В случаи если необходимо разместить standby базу в иных каталогах, то: db_file_name_convert='/oradata_new/test','/oradata/test' – этот параметр указывает,

что в именах файлов данных, которые будут создаваться в standby базе (т.е. когда наш основной экземпляр начнет работать в режиме standby), необходимо изменить пути с '/oradata_new/test' на '/oradata/test'.

log_file_name_convert='/oradata_new/test/archive','/oradata/test/archive' – этот параметр указывает, что в именах журнальных файлов, которые будут создаваться в standby базе, необходимо изменить пути с '/oradata_new/test/archive' на '/oradata/test/archive'.

Перезапускаем базу с использованием данного файла параметров:

SQL> shutdown immediate;

SQL> startup nomount pfile='<path>/pfileprod.ora ';

SQL> create spfile from pfile='<path>/pfileprod.ora';

SQL> shutdown immediate;

SQL> startup;

Добавляем в tnsnames.ora запись о будущем standby сервер (что-то вроде):

TESTSTAN =

(DESCRIPTION = (ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = standbysrv)(PORT = 1521))) (CONNECT_DATA =

(SERVICE_NAME = teststan) )

)

Бэкап (на сервере standby должен присутствовать аналогичный каталог, а так же свободное место для хранения копии):

  • бэкап controlfile

rman> backup current controlfile for standby format '<path>';

  • бэкап базы

rman> run {

       2>allocate channel c1 device type disk format '/data/backup/%u';

       3>backup database plus archivelog;

       4>}

После завершения бэкапа переносим его на новый сервер в тот же каталог.

Настройка нового сервера.

На новом сервере устанавливаем туже версию Oracle (с патчами, в случаи необходимости), только ПО.

Создаем структуру каталогов, аналогичную основному серверу. Создаем файлы конфигурации listener-а и net service names.

listener:

SID_LIST_LISTENER =

 (SID_LIST = (SID_DESC =

   (SID_NAME = PLSExtProc) (ORACLE_HOME = /oracle)

       (PROGRAM = extproc)

   )

   (SID_DESC = (GLOBAL_DBNAME = teststan)

       (ORACLE_HOME = /oracle)

           (SID_NAME = test)

   )

)

LISTENER =

    (DESCRIPTION_LIST =

        (DESCRIPTION =

              (ADDRESS = (PROTOCOL = TCP)

              (HOST = standbysrv)(PORT = 1521)

        )

(ADDRESS = (PROTOCOL = IPC)

   (KEY = EXTPROC0))

)

)

tnsname:

TEST =

(DESCRIPTION = (ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = standbysrv)(PORT = 1521))

)

(CONNECT_DATA = (SERVICE_NAME = teststan)

)

)

TESTPROD =

(DESCRIPTION = (ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = productionsrv)(PORT = 1521))

)

(CONNECT_DATA = (SID = test)

)

)

Рестартуем листенер

$ lsnrctl stop

$ lsnrctl start

На основе файла параметров с основной БД (pfileprod.ora) создаем файл параметров для standby базы со следующим содержимым:

db_name='test'

db_unique_name='teststan'

log_archive_config='dg_config=(testprod,teststan)'

log_archive_dest_1='SERVICE=testprod LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name='testprod'

log_archive_dest_2='LOCATION=/oradata/test/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=teststan'

log_archive_dest_state_1=ENABLE

log_archive_dest_state_2=ENABLE

# эти параметры нам понадобятся для работы только в режиме STANDBY fal_client='teststan'

fal_server='testprod'

standby_file_management='AUTO'

При размещении standby базы в других каталогах также добавляем необходимые параметры:

db_file_name_convert='/oradata/test','/oradata_new/test' log_file_name_convert='/oradata/test/archive','/oradata_new/test/archive'

и сохраняем его с новым именем (например: pfilestand.ora)

Стартуем инстанс:

SQL> startup nomount pfile='<path>/pfilestand.ora';

SQL> create spfile from pfile='<path>/pfilestand.ora';

SQL> shutdown immediate;

SQL> startup nomount;

Разворачиваем standby. На основном сервер:

$ rman target /

rman> connect auxiliary sys@teststan;

rman> duplicate target database for standby nofilenamecheck dorecover;

Параметр nofilenamecheck нужен, чтобы rman не ругался на повторяющиеся имена файлов (если мы используем одинаковую структуру каталогов на основном и standby серверах).

Если все прошло успешно, то переводим систему в режим автоматического применения транзакций на standby базе.

Переключаем журнальный файл и смотрим последний номер архивного журнала на основной базе:

SQL> alter system switch logfile;

System altered.

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)

--------------

205

Теперь переходим на standby сервер.

Проверяем состояние базы:

SQL> select name,open_mode,log_mode from v$database;

NAME OPEN_MODE LOG_MODE

--------- ---------- ------------

TEST MOUNTED ARCHIVELOG

SQL> select recovery_mode from v$archive_dest_status;

RECOVERY_MODE

-----------------------

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

IDLE

11 rows selected.

SQL> select max(sequence#) from v$log_history;

MAX(SEQUENCE#)

--------------

202

Мы видим, что последний примененный лог на standby отстает от основной базы, а также, что процессы ARCH не работают.

Проверяем наличие standby redo logs:

SQL> select * from v$standby_log;

Если их нет – создаем:

SQL> alter database add standby logfile group <номер(тот же, что и на основной БД)> '<папка с журналами>/stnbylog01.log' size 50m;

Переводим standby базу в режим Real-time apply redo:

SQL> alter database recover managed standby database using current logfile disconnect;

Смотрим, что получилось:

SQL> select recovery_mode from v$archive_dest_status;

RECOVERY_MODE

-----------------------

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

MANAGED REAL TIME APPLY

11 rows selected.

SQL> select max(sequence#) from v$log_history;

MAX(SEQUENCE#)

--------------

205

Все работает.

Если не хотим использовать режим Real-time apply redo, а хотим дожидаться когда будет закончено формирование очередного архивного журнала на основном сервере и он будет передан на standby для применения сохраненных в нем транзакций, то необходимо переводить standby базу в режим redo apply командой:

SQL> alter database recover managed standby database disconnect;

Если что-то пошло не так, то для решения проблемы в первую очередь необходимо остановить «накатку» логов:

SQL> alter database recover managed standby database cancel;

Возможно, что в процессе дуплицирования на standby сервер были переданы не все архивные журналы. Тогда их надо вручную скопировать на standby сервер (в нашем случае в каталог /oradata/test/archive), произвести ручную «накатку»:

SQL> recover standby database;

и после этого опять запустить режим Real-time apply redo:

SQL> alter database recover managed standby database using current logfile disconnect;

Просмотров: 0