четверг, 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)
        )
 )
Ссылки.

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

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

rlwrap и kline для WLST Upd 11.07.2011

Как и все тулзы oracle, консоль WLST не умеет повторять последнюю введённую команду или дополнять команду по нажатию горячей клавиши. Способ решить проблему (или создать себе другую) на linux-платформах есть:

Качаем пакет rlwrap, например, отсюда или отсюда.
Устанавливаем:
rpm -ihv rlwrap-0.28-1.guru.suse102.x86_64.rpm
Создаём файл $HOME/.rlwrap/WLST и вписываем туда ключевые слова (под катом есть готовый набор)
Запускаем
rlwrap -f $HOME/.rlwrap/WLST --multi-line java weblogic.WLST
После этого начинает работать дополнение и повтор команд, но запущенный из этой консоли NodeManager будет в качестве родительского процесса считать процесс  weblogic.WLST. То есть при выходе из консоли процесс weblogic.Nodemanager Завершится как дочерний. Имеет смысл завести в .bash_profile отдельный alias для работы, и не пользоваться для запуска NM.
alias "WLST"='/usr/bin/rlwrap -if $HOME/.rlwrap/wlst --multi-line java weblogic.WLST'
Решение для HP-UX.
Я долго пробовал скомпилировать из исходников readline и rlwrap, но победить компилятор не получилось.
Your system and compiler (hpux11.31-cc) are not supported by the
../support/shobj-conf script.
Пока буду пользоваться решением c установкой gcc отсюда:
http://hpux.ch/index.php/HPUX::Ports

Альтернативный метод для Windows и Linux - JLine.


1. Свежая версия.
2. Распаковываем в какую-нибудь директорию.
3. Добавляем директорию в CLASSPATH.
4. Запускаем 
java jline.ConsoleRunner weblogic.WLST
После этого должны заработать редактирование комнд и история.

вторник, 7 июня 2011 г.

Порядок применения параметров запуска weblogic-сервера.

Несколько способов запустить сервер с нужными параметрами.
1. Непосредственно из командной строки, написав конструкцию вида:
java [JVM options] [Weblogic Options] weblogic.Server
Собственно, компонованием этой строки и занимается startWeblogic.sh, лежащий в $MW_HOME/bin. Этот скрипт рекомендован Oracle для запуска и остановки серверов. Его можно немного подредактировать под свои нужды или передать ему пару параметров прямо из командной строки
nohup sh $DOMAIN_HOME/bin/startWebLogic.sh -Dweblogic.management.username=weblogic -Dweblogic.management.password=password > wls_start.log &
2. Запуск Admin-сервера командой startServer из консоли WLST. Пример такой команды можно посмотреть, набрав
help('startServer') 
3. Запуск серверов из консоли WLST с помощью NodeManager командой
nmStart('ServerName')
В первом случае все параметры запуска задаются в тексте команды. Во втором параметры запуска jvmArgs передаются как аргумент метода startServer(). В третьем случае параметры берутся из конфиг-файлов и скрипта запуска. Параметры, хранящиеся в файле config.xml в этом случае не применяются. Они там просто хранятся.

Есть свои правила применения параметров при запуске сервера через Nodemanager:
1. В первую очередь применяются параметры, указанные явно в консоли WLST. В этом случае мы переопределяем всё, что  было задано другими методами.
arg="Arguments=\" -Dweblogic.management.server=localhost:7001\""
prps=makePropertiesObject(arg)
nmStart('serverName',props=prps)
2. Параметры, заданные в файле startup.properties.

После запуска блока из предыдущего пункта в директории {DOMAIN_HOME}/servers/serverName/data/nodemanager/
появится файл startup.properties примерно такого содержания
#Server startup properties
#Fri Jun 03 16:59:19 MSD 2011
Arguments=\ -Dweblogic.management.server\=localhost\:7001
Именно этот файл, а не  config.xml читает Nodemanager перед запуском сервера. Полный список возможных параметров можно посмотреть тут.

3.  Параметры запуска можно указать через web-консоль. Вообще говоря, этот способ - практически полное повторение пункта 2, но со своей логикой работы. При запуске/остановке серверов через web-консоль AdminServer обращается к NodeManager-у, который управляет ManagedServer-ом. Nodemanager в свою очередь выполняет метод nmStart('serverName')

На страничке Server Start вводим всё, что интересует


После сохранения и применения изменений  значения пишутся в файл config.xml и, если сервер уже запущен, генерируется файл startup.properties.Если сервер не запущен, файл не создаётся. Такое поведение похоже на вызов функции
nmGenBootStartupProps('serverName')
из консоли WLST, которая генерирует startup.properties-файл на основе config.xml и которая также требует подключения к работающему серверу.
Если сервер до этого ни разу не запускался, то необходимого для запуска файла startup.properties всё ещё нет. За его создание почему-то отвечает кнопка "Start" на странице управления серверами.
Такая логика работы web-консоли позволяет избежать ошибки (а может именно она её и вызывает), с которой сталкиваются новички, пытаясь стартовать свежесконфигурированный сервер из консоли WLST командой nmStart('serverName') до того, как будут заданы все необходимые параметры запуска.
4. Ещё один способ запустить сервер с нужными параметрами - использовать одновременно и скрипт startWeblogic, и файл startup.properties.
Если почитать документацию, можно найти вот такой текст:
You can use a start script to specify required startup properties and perform any other work you need performed at start up.
Для этого надо отредактировать конфиг NodeManager-а
${MW_HOME}/wlserver_10.3/common/nodemanager/nodemanager.properties
 StartScriptEnabled=true
и перезапустить его и сервер. После рестарта получаем процесс примерно такого вида:
ps -ef | grep weblogic.Server
/opt/oracle/java/latest/bin/java
-server
-Xms256m
-Xmx512m
-XX:MaxPermSize=256m

-Dweblogic.Name=serverName
-Djava.security.policy=/opt/oracle/middleware/wlserver_10.3/server/lib/weblogic.policy
-Dweblogic.ProductionModeEnabled=true
-Dweblogic.system.BootIdentityFile=/.../data/nodemanager/boot.properties
-Dweblogic.nodemanager.ServiceEnabled=true
-Dweblogic.security.SSL.ignoreHostnameVerification=true
-Dweblogic.ReverseDNSAllowed=false
-server
-Xms256m
-Xmx256m
-XX:MaxPermSize=128m

-Dplatform.home=/opt/oracle/middleware/wlserver_10.3
-Dwls.home=/opt/oracle/middleware/wlserver_10.3/server
-Dweblogic.home=/opt/oracle/middleware/wlserver_10.3/server
-Dweblogic.management.discover=false
-Dweblogic.management.server=http://...:7001
Первая выделенная группа - параметры JVM, заданные в скрипте startWeblogic.sh.
Вторая - параметры JVM, заданные в файле startup.properties. Параметры из этого файла всегда будут добавляться в конец строки запуска. Действующими параметрами будут только последние. Способ стоит пользоваться осторожно, так как для некоторых параметров JVM важен порядок следования, также важен порядок перечисления путей в переменной CLASSPATH .