Понедельник, 13.05.2024, 17:10

Компьютерная помощь

Записки системного администратора

Меню сайта
Категории раздела
Компьютер [36]
Общекомпьютерные темы
Windows server [18]
Статьи по версиям windows для серверов.
Windows [30]
Статьи по версиям windows для рабочих станций.
Unix [65]
Статьи на тему unix-подобных систем. Linux, FreeBSD и т.п.
Видеомонтаж [10]
Статьи по нелинейному видеомонтажу
Программирование [9]
Заметки по программированию
Databases [10]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Вход на сайт

Поиск

Главная » Статьи » Databases

Oracle RMAN DUPLICATE

 Итак вам по каким то причинам понадобилось склонировать вашу единственную базу данных. Например, Вам это нужно чтобы произвести тестирование новых достижений вашего или того интереснее чудного приложения.

Легкий способ что нибудь наделать это использовать RMAN duplicate.
(Я буду считать что вы уже знакомы с RMAN и просто как и я не подозревали о его уникальной фиче позволяющей клонировать базы данных на ходу.)

И так для того чтобы использовать этот непревзойденный инструмент (ну кто его превзойдет, все ведь от производителя :-) ) пройдемся по нескольким шагам.

Первое важное решение какой режим RMAN DUPLICATE вы будете использовать?

Выбор нужно сделать из таких опций:

    Backup-Based Duplication (фактически клонирование происходит из существующих на базе источнике архивных копий, следовательно обязательно их наличие)
    Active Database Duplication (Этот тип не требует наличие архивных копий и собственно именно о нем я и хочу рассказать. при этом надо учесть что это фича появилась только с Oracle DB 11g. Потому помните об этом и используйте там где она и правду есть :-))


И так решение принято: У нас база данных 11g и выше и мы как все трудолюбивые люди очень ленивы и потому желаем скопировать все и сразу, то есть вы выбрали режим Active Database Duplication.

Чтобы понять как нам дальше быть надо:

    Подготовить текущие базы данных с клонированию
    проверить все ли хорошо
    и сделать клонирование


и так приступим по шагам.

Сперва определимся с терминологией:

У нас есть База данных Источник:
SID: MD
host: mdsrcdb
ip: 192.168.1.1
TNS name: MD_SRC
ORACLE_HOME: /u0/app/oracle/product/11.2.0/dbhome_1

У нас есть База данных Приемник:
SID: MD
host: mddstdb
ip: 192.168.1.2
TNS name: MD_DST
ORACLE_HOME: /u0/app/oracle/product/11.2.0/dbhome_1

Шаг 0: Подготовка текущих баз данных.
Прописываем  в файлы /etc/hosts имена наших машин
или если у вас есть DNS имена то тогда используйте их.
192.168.1.1  mdsrcdb
192.168.1.2  mddstdb
а также в localhost дописать имена в зависимости от хоста.


Шаг 1: Подготовка текущих баз данных.
База данных Источник должна находиться в режиме archivelogs mode и при этом должны быть активирована fast recovery area (FRA).
проверить:


FRA:
SQL>show parameter DB_RECOVERY_FILE_DEST_SIZE specifies the maximum space to be used for all files that are stored the FRA.
DB_RECOVERY_FILE_DEST specifies the base directory for the FRA.
Если DB_RECOVERY_FILE_DEST_SIZE имеет осмысленное значение значит у вас включена FRA.
Чтобы включит надо:
Установить DB_RECOVERY_FILE_DEST_SIZE
вот так:
SQL> alter system set db_recovery_file_dest_size=200g;
проверить снова:

ARCHIVE LOG MODE;
проверить:
SQL> select log_mode from v$database;
SQL> archive log list;
если нет включить (но помните что при этом придется тормозить БД)
проверить:
Включить:
Enabling Archivelog Mode
$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;

Для базы данных приемника надо будет создать pfile. Вам придется стартовать эту базу с pfile:
SQL>create pfile=’initMD.ora’ from spfile;
файл будет доступен в Linux ${ORACLE_HOME}/dbs/
файл будет доступен в Цштвщцы ${ORACLE_HOME}/database/

Теперь нужно сделать одинаковыми пароли системных пользователей. Особенно пароль SYS.
Я это сделал очень просто в базе приемнике я поставил пароль такой же как базе источнике вот так:
SQL>alter user SYS identified by ***ваше_значение***;

Проверка путей
Я проделал опыт копирования баз данных при условии их идентичности.
Это означает
идентичность версий
идентичность путей расположения файлов.
Для этого на базе приемнике надо сделать такие же каталоги как в источники
каталог где лежат данные
кататалог ORACLE_HOME
каталог FRA
каталог ARCHIVE_LOG

после это проверки можем двигаться далее.

Осталось сделать еще пару очень важных вещей и проверить как нам это удалось.
Правильно настроить листнера (listener) на базе данных приемнике. Делается это так:
находим ${ORACLE_HOME}/network/admin/listener.ora
и тут пишем что то вроде:

 

 


--------------------------
ADR_BASE_LISTENER_1521 = /u0/app/oracle

LISTENER_1521 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = mddstdb)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = MD)
      (ORACLE_HOME = /u0/app/oracle/product/11.2.0/dbhome_1)
      (SID_NAME = MD)
     )
   )
--------------------------
Скорей всего у вас этот файл уже есть и придется добавить то что выделено жирным.
Это (очень важно) прописывает некий статический маршрут к базе данных. Это позволяет конектиться к базе данных даже в том случае если она находиться в состоянии shutdown. Если это не прописать то, когда вы с удаленного sqlplus сделаете shu immediate. А затем попробуете сделать startup nomount. Ео ничего не выйдет - вылезет ошибка типа:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
и удаленно базу вам к жизни уже не вернуть.
Это все не так печально, но для дублирования просто необходимо. посему надо правильно настроить слушатель - чтобы этого избежать.
У меня выходила та же ошибка если:
(GLOBAL_DBNAME =MD)
Это строка не была равно SID базы данных. Это тоже важно и стоило мне некоторого времени. А вам повезло :-)
(Да большая просьба к тем кто разбирается в тонкостях настройки Oracle DB рассказать в коментариях про GLOBAL_DBNAME and SID)

Да еще исправим на базе приемнике tnsnames для порядку
${ORACLE_HOME}/network/admin/tnsnames.ora
вот так:
--------
MDDSTDB_TNS =
  (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS =
            (PROTOCOL = TCP)
                  (Host = mddstdb)
                (Port = 1521)
            )
        )
    (CONNECT_DATA = (SID = MD)
 )
)
MDSRCDB_TNS =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)
                   (HOST = mdsrcdb)
                   (PORT = 1521)
       )
      (CONNECT_DATA =
                (SERVER = DEDICATED)
                      (SERVICE_NAME = MD)
                 )
    )

---------


И так после того как listener настроен и перезапущен
lsnrctl stop/start
мы должны проверить как дела на базе источнике и как у нее со связью с базой приемником.
Для этого
Мы должны
на базе источнике
настроить tnsnames ${ORACLE_HOME}/network/admin/tnsnames.ora
примерно вот так:
------------------------------------------------
MDSRCDB_TNS =
  (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS =
            (PROTOCOL = TCP)
                  (Host = mdsrcdb)
                (Port = 1521)
            )
        )
    (CONNECT_DATA = (SID = MD)
 )
)

MDDSTDB_TNS =
  (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS =
           (PROTOCOL = TCP)
              (Host = mdsrcdb)
              (Port = 1521)
           )
        )
    (CONNECT_DATA = (SID = MD)
 )
)
------------------------------------------------
а вот ${ORACLE_HOME}/network/admin/listener.ora базы источника
ADR_BASE_LISTENER_1521 = /u0/app/oracle

LISTENER_1521 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = mdsrcdb)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER_1521 =
  (SID_LIST =
      (SID_DESC =
        (ORACLE_HOME = /u0/app/oracle/product/11.2.0/dbhome_1)
        (SID_NAME = MD)
      )
  )
--------------------------------------
Хотя в данном случае это не так уж важно особенно для параметра SID_LIST_LISTENER_1521 - очень важен он на базе приемнике.

И так теперь все готово. и для начала проведем тест о котором я говорил:


Надо проверить связь с базой приемником. Для этого идем на машину
находясь на хосте mddstdb (на источника) делаем
        sqlplus sys/***@MDDSTDB_TNS as sysdba;
        shu immediate;
        startup nomount;
        Важно чтобы все прошло без ошибок поери связи тогда listner на базе приемнике настроен правильно (статически)

После того как мы убедились что изложенная выше концепция сработала мы можем начать дубликацию.

Первое надо стартануть базу приемник с pfile (sqlplus / as sysdba)
SQL>startup NOMOUNT pfile='ваш_pfile.ora'
Это обязательно иначе процесс дуликации завалиться

Затем надо просто залогинться в RMAN особым образом:
 rman TARGET sys/oracle@MDSRC_TNS AUXILIARY sys/oracle@MDDST_TNS
Этот процесс должен пройти без ошибок.
затем собственно делаем то ради чего мы тут собрались:

RMAN>DUPLICATE DATABASE TO MD FROM ACTIVE DATABASE SPFILE NOFILENAMECHECK;

Все далее время копирования зависит от размеров вашей базы данных. И после завершения сего часто довольно долгого процесса вы получите точную копию базы данных, которая включает все, даже настройки. В моем случае скопировались даже настройки DATA GUARD, которые совершенно не нужны на сервере приемнике.

sergeydanilov.blogspot.com/2014/11/oracle-rman-duplicate.html

Категория: Databases | Добавил: admin (15.05.2018)
Просмотров: 951 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: