четверг, 23 июня 2011 г.

Active Data Guard 11g Upd 26.10.2011

Step-by-step руководство по созанию Standby сервера БД.


Для удобства администрирования Primary и Standby базы будут иметь один и тот же SID, DB_NAME, одинаковыми будут пути расположения файлов и журналов. Различаться инстансы будут по service_names и db_unique_name.

Primary Stanby
SID oracle oracle
Service_names oracle_prdoracle_stb
DB_name oracle oracle
Host oraclem oracles

Primary DB создана.
ORACLE_HOME установлена в  /opt/oracle/ora11g/11.2.0.2/oradb
Grid Control Agents установлены.

Настройка Net services


1. Правим /etc/hosts

127.0.0.1       localhost
10.0.0.1      oraclem
10.0.0.2     oracles
2. Настройка listener для статической регистрации сервисов на Primary-хосте:
cat $ORACLE_HOME/network/admin/listener.ora 
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = oracle_prd)
      (ORACLE_HOME = /opt/oracle/ora11g/11.2.0.2/oradb)
      (SID_NAME = oracle)
    )
 )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclem)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )
и на Standby-хосте

SID_LIST_LISTENER =
     (SID_LIST =
        (SID_DESC =
           (GLOBAL_DBNAME = oracle_stb)
           (ORACLE_HOME = /opt/oracle/ora11g/11.2.0.2/oradb)
           (SID_NAME = oracle)
        )
     )
LISTENER =
    (DESCRIPTION_LIST =
         (DESCRIPTION = 

             (ADDRESS = (PROTOCOL = TCP)(HOST = oracles)(PORT = 1521))
             (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
         )
    )

 3. Настройка TNSnames  на обоих серверах.
cat $ORACLE_HOME/network/admin/tnsnames.ora
oracle_stb =
 (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracles)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oracle_stb)
 )
 )
oracle_prd =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclem)(PORT = 1521))
)
    (CONNECT_DATA =
      (SERVICE_NAME = oracle_prd)
    )
)
oracle_prd_DGB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oraclem)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oracle_prd )
    )
 )
oracle_stb_DGB =
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracles)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oracle_stb )
    )
)
После настройки служб можно протестировать доступность Primary-сервера.

Предварительная настройка Primary DB


4. Если это ещё не сделано, нужно перевести Primary базу в archivelog mode, указав место, где будут храниться архивные логи.
alter system set oracle.log_archive_format='%t_%s_%r.arc';
alter system set log_archive_dest_1='location=/bachup/archive/oracle';
alter system set log_archive_max_processes = 5;
alter database archivelog;
alter database open
shutdown immediate
startup mount
5. Настройка необходимых для standby параметров на Primary-сервере.

  • Необходимо включить принудительное логирование всех операций с БД. 
alter database force logging;
  • Для использования возможности  Active Standby необходимо выставить на обеих базах параметр compatible не ниже 11.2.0.2 и audit_trail в 'NONE'.
alter system set audit_trail='NONE';
alter system set compatible='11.2.0.2';
  • Для автоматического создания файлов на Standby-сервере при создании их на Primary нужно выставить
alter system set standby_file_management=AUTO;
  •  Для обеспечения уникальности имён.
 alter system set db_unique_name='oracle_prd';       на Primary 

6. Создание STANDBY LOGFILS
Размер лога должен быть не меньше, чем размер redologs.
Количество групп не меньше (лучше на одну больше), чем количество redolog groups.
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 '/media/redo/oracle/redo01.stb' SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 '/media/redo/
oracle/redo02.stb' SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 '/media/redo/oracle/redo03.stb' SIZE 50M REUSE;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14 '/media/redo/oracle/redo04.stb' SIZE 50M REUSE;
Создание Standby instance.

Для создание нового instance с новым именем можно снять холодный или горячий backup Развернуть его на standby-сервере и, в общем случае, для переименования instance воспользоваться утилитой nid. Этот способ описан в документации.
Я воспользуюсь командой rman duplicate. Если посмотреть на лог её выполнения, то можно заметить что она делает то же самое (переименовывать instance не нужно)

7. Подготовка конфигурационных файлов для Standby instance.
На primary host необходимо стоздать pfile.
create pfile from spfile;
в получившемся файле отредактировать параметр
db_unique_name='oracle_stb'
8. Копирование на на standby-host файлы orarwd и pfile:

scp /opt/oracle/ora11g/11.2.0.2/oradb/dbs/orapworacle oracle@10.0.0.2:/opt/oracle/ora11g/11.2.0.2/oradb/dbs/orapworacle
9. На Standby-сервере, так же как на Primary, должны быть созданы все директории для хранения datafiles, archive/redo-logs, controlfiles.

10. Запускаем instance в nomount на Standby-host.
sqlplus / as sysdba
startup nomount
Так как в конфигурационном файле listener.ora используется статическая регистрация, этот instance будет доступен с Primary хоста. На Primmary хосте можно проверить соединение с удалённой БД командой
tnsping oracle_stb
если пинг не прошёл, можно поискать ошибки в настройках listener или параметрах service_names и db_name.


Копирование БД. 


11. Если ping прошёл успешно, соединяемся с удалённой бд, запустив на primary-сервере
rman target / auxiliary sys/Password@oracle_stb
Для случая, когда расположение файлов журналов исходной базы и файлов базы-назначения совпадают, необходимо явно указать одинаковые пути "конвертации" логфайлов. При совпадении путей расположения файлов данных необходимо добавить  NOFILENAMECHECK в выражение duplicate target database
duplicate target database for standby from active database NOFILENAMECHECK
spfile
set db_unique_name='oracle_stb'
set control_files='/media/data/oracle/control01.ctl','/media/data/oracle/control02.ctl' set audit_file_dest='/opt/oracle/ora11g/admin/oracle/adump'
set LOG_FILE_NAME_CONVERT='/media/redo/oracle','/media/redo/oracle';
Если этого не сделать, восстановление закончится с шибкой
ORA-19527: physical standby redo log must be renamed или
RMAN-05001: auxiliary file name undotbs01.dbf conflicts with a file used by the target database
Если восстановление завершилось неудачно, перед новой попыткой необходимо удалить со  standby сервера spfile, controlfiles и datafiles, если они были созданы.

Настройка Standby


12. Для Standby database.
alter system set log_archive_config='dg_config=(oracle_prd,oracle_stb)';
alter system set fal_server='oracle_prd';
alter system set log_archive_dest_1='location=/backup/archivelog/oracle VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=oracle_stb';
alter system set log_archive_dest_2='service=oracle_prd db_unique_name=oracle_prd VALID_FOR=(ALL_LOGFILES,PRIMARY_ROLE)';

13. На Primary database.

alter system set  log_archive_config='dg_config=(oracle_prd,oracle_stb)';
alter system set  fal_server='oracle_stb';
alter system set log_archive_dest_1='LOCATION=/backup/archivelog/oracle VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=oracle_prd'
alter system set log_archive_dest_2='service=oracle_stb db_unique_name=oracle_stb valid_for=(all_logfiles,primary_role)'

Подробнее про log_archive_dest_n здесь.

14. Установка режима работы.
Alter database set standby database to maximize performance;
Alter database set standby database to maximize protection;
Alter database set standby database to maximize availability;
Про режимы работы можно почитать в документации. Это лучше сделать до того, как вслед за отключившимся primary автоматически сложится standby.
15. Запускаем standby

  •  В режиме наката архивных логов

Alter database recover managed standby database disconnect from session;

  • в режиме realtime apply

Alter database recover managed standby database disconnect from session USING CURRENT LOGFILE

  •  в режиме Active standby
alter database open read only;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE  THROUGH ALL SWITCHOVER DISCONNECT  USING CURRENT LOGFILE;
Stabdby готов.

Настройка брокера
Брокер можно настроить вручную или через Grid Control.
для Grid Control версии 10.2.0.5 конфигурирование завершится c ошибкой
ORA-16538 When Adding Existent 11gR2 Standby Database to Grid Control 10.2.0.5 [ID 1145294.1]
Этот bug лечится установкой  Patch 8267406. Или ручным конфигурированием Dataguard broker.


16. Ручная настройка брокера. (workaround)
По умолчанию брокер хранит конфигурационые файлы в $ORACLE_HOME/dbs
можно указать место хранения явно. На обеих базах.
alter system set dg_broker_start=TRUE
alter system set Dg_broker_config_file1='/opt/oracle/ora11g/11.2.0.2/oradb/dbs/Dg_broker.cfig';
17. Создаём конфигурацию брокера. Добавляем обе базы.
dgmgrl
connect sys/Password
create configuration dgb_oracle as primary database is oracle_prd connect identifier is oracle_prd;
add database oracle_stb as connect identifier is oracle_stb maintained as physical;
Если всё сделано правильно, можно посмотреть конфигурацию.
enable configuration;
show configuration;
Можно идти в Gridcontrol, настраивать оба instance и жать swichower.

Upd: Для запуска брокера лучше использовать запуск утилиты dgmgrl без параметров логин/пароль и авторизовываться командой connect уже из консоли брокера. Если этого не делать, в некоторых случаях команды брокеру не будут выполняться.

Tnsnames для пользователей.

oracle=
  (DESCRIPTION_LIST=
    (FAILOVER=true)
    (LOAD_BALANCE=no)
    (DESCRIPTION=
      (ADDRESS = (PROTOCOL=TCP) (HOST= oraclem) (PORT=1521))
      (CONNECT_DATA=
        (SERVER=dedicated)
        (SERVICE_NAME=oracle_prd)
      )
    )
    (DESCRIPTION=
      (ADDRESS=
        (PROTOCOL=TCP) (HOST=oracles) (PORT=1521))
      (CONNECT_DATA=
        (SERVER=dedicated)
        (SERVICE_NAME=oracle_stb)
      )
    )
  )

или вот так:
oracle=
(DESCRIPTION =
        (FAILOVER=on)
        (CONNECT_TIMEOUT=5)
        (ADDRESS_LIST=
                (ADDRESS = (PROTOCOL=TCP) (HOST= oraclem) (PORT=1521)
                (ADDRESS = (PROTOCOL=TCP) (HOST= oracles) (PORT=1521)
         )
        (CONNECT_DATA=
                (SERVER=dedicated)
                (SERVICE_NAME=oracle_prd)
        )
 )
Ссылки.

Достаточно старое руководство от Волкова:
Документация:

Комментариев нет:

Отправить комментарий