THE HOLY BIBLE - King James Version - БИБЛИЯ в Синодальном переводе
"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу

Клонирование и кластеризация баз данных Оракл

В процессе разработки и тестирования приложений, работающих с базами данных Оракл, часто возникает необходимость "копирования" существующей базы данных на несколько подобных машин, для тестеров и разработчиков. Также часто необходимо создать "дубликат" последней версии базы для последующего переноса и кластеризации на производственной (либо подобной ей) системе.

При всём обилии документации и публикаций на тему, их подавляющее большинство рассматривает простые случаи "клонирования" некластерных баз данных с одной машины на другую, не описывая подробности всего процесса.

Предлагаемая читателю заметка демонстрирует полный пример достаточно сложного процесса клонирования базы данных на той же машине, её последующего перемещения на удалённый сервер и трансформирования некластерной базы данных в кластерную систему с восемью узлами. Рассматриваются варианты использования Oracle Recovery Manager (RMAN) и ручного клонирования / кластеризации.

Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:



......................... == Книга пророка Исаии == ............................
=== Глава 6, Стих 10 ===
9 И сказал Он: пойди и скажи этому народу: слухом услышите -  и  не  уразумеете,
  и очами смотреть будете - и не увидите.
10 Ибо огрубело сердце народа  сего,  и  ушами  с  трудом  слышат,  и  очи  свои
   сомкнули, да не узрят очами, и не услышат ушами, и не  уразумеют  сердцем,  и
   не обратятся, чтобы Я исцелил их.

Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.

Читая Библию, мы можем заметить как с давних времён пророки как бы видели сегодняшнее отступление некогда преданных и ревностных в вере славян, подобно израильтянам во дни ропота. Но не все отступили - в самые тяжёлые времена вера в Господа и Его Церковь хранили наши многострадальные народы. Такое время мы переживаем и сейчас. Не разумеем сердцем, не пытаемся увидеть свет Божий, понуря голову плетёмся путём греха на заклание ... Но исцеление рядом. Сбрось с себя ярмо мирской суетности, прочисти уши, продери глаза, обратись сердцем от грехов, через покаяние и раскаяние - и будешь исцелён, по слову Господа, которое не изменяется и не отнимается у нас. Иисус всегда с нами - но ты сам должен сделать шаг навстречу Ему. Сделай его сегодня, брат или сестра!

Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.

Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.

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


Вернёмся к нашим техническим деталям.

Рассмотрим пример из реальной жизни - периодически мне необходимо делать локальную копию основной базы данных, используемой разработчиками для написания приложения. Эта база находится на одном из серверов на резервной площадке. Клон базы в её текущем "релизном" состоянии будет использован тестерами для начальной проверки. Выявленные недоработки будут исправлены в основной базе разработчиков и она будет вновь "скопирована" для работы тестеров. Всё это происходит на одном и том же сервере, для экономии времени.

После того, как тестеры завершат проверки функциональности и признают работу приложения и "релизной" базы данных удовлетворительными, эта же самая "релизная" база должна быть скопирована на кластер на основной площадке для тестирования производительности и масштабируемости. Естественно, что для такой проверки понадобится "конвертировать" некластерную "single instance" релизную базу в кластерную "RAC database", использующую восемь доступных узлов. После окончания проверок "релизная" кластерная база становится текущей версией основной производственной базы и процесс повторяется вновь. (Естественно мы надеемся что наши разработчики были заняты делом в течение всего этого времени и приготовили очередной "релиз". Часто такие надежды оказываются тщетными ... )

В процессе выпуска "релиза" нам понадобится:

  • клонировать некластерную "девелоперскую" базу в "тестовую" на той же машине;
  • переместить сжатую резервную копию "тестовой" базы с машины разработчиков на кластер;
  • клонировать "тестовую" базу из бэкапа на кластере, на этом этапе всё ещё "single instance";
  • конвертировать "single instance" БД клон в "RAC database" на кластере.
  • Я рассмотрю оба способа - RMAN и ручное копирование базы данных на сервере разработчиков. Для кластеризации базы данных будет использован RMAN и ручное "включение" семи дополнительных "redo threads". Мой опыт выполнения этих операций чётко показывает необходимость полного понимания процессов, происходящих в базе при её конвертировании в RAC. Средства автоматизирования, предоставляемые Ораклом, не дают нам такой возможности.

    Обобщённый подход к клонированию баз данных Оракл

    Я привожу ну очень примитивное описание базы Оракл и её работы, тем не менее чаще полезное, чем вредное. Для верного понимания читайте документацию, документ под названием "Oracle Database Concepts".

    Для начала использования базы-клона нам понадобится сделать "копию" данных, имеющихся в исходной базе. Эти данные хранятся в виде файлов или ASM контейнеров, подобных файлам по функциональности (в конце концов в линуксе всё представлено в виде файла). Каждый файл помечен именем и номером базы данных, к которой он принадлежит (или из которой взят). Все файлы данных в Оракл имеют двоичное (binary) представление и легко копируются средствами ОС.

    Сами по себе файлы с "копией" данных не очень-то и полезны. Их (данные) необходимо читать в память и передавать клиенту на стороне приложения. Такое чтение осуществляется процессами Оракл, запускаемых общей "кучей" под названием экземпляр ("database instance"). Процессы представляют из себя обычные исполняемые линукс-программы различного назначения. Процессы получают информацию о составе базы данных (именах файлов, временной зоне, кодировке символов) из двоичного control file и из двоичного серверного файла параметров spfile. Имя базы "зашито" в каждый файл данных, control file и spfile. Если имена не совпадают - база отказывается запускаться.

    В процессе клонирования базы мы прежде всего создаём набор параметров (для будущего spfile), описывающих нашу новую базу (имя, домен, расположение директорий для файлов). Затем, используя эти параметры, мы запускаем все нужные процессы для работающего экземпляра - но пока эти процессы не знают что и откуда читать. Они пока просто занимают память, при этом зная, что принадлежат базе-клону с новым именем.

    Теперь нам надо "убедить" процессы экземпляра что они могут читать из (заранее скопированных из старой базы) файлов данных. Но эти файлы помечены старым именем базы. Решается проблема просто - мы создаём новый control file, описывающий уже нашу новую базу - и в процессе создания такого файла процесс Оракл сам "помечает" копии файлов новым именем базы. (Есть и другой способ для смены имени базы).

    Когда уже все параметры, заголовки файлов данных и control file приведены к согласию об имени новой базы - она может быть смонтирована. С этого момента процессы уже знают что и откуда читать, но ещё не готовы посылать данные пользователям. Нам надо открыть базу, переформатируя при этом все файлы в специальном наборе "online redo logs".

    С этого момента база-клон с новым именем готова к работе с пользователями. Итак, ещё раз и кратко что надо сделать, в общих чертах:

  • Скопировать файлы данных из старой базы в новое место;
  • Подготовить минимальный набор нужных параметров (initSID.ora файл новой базы);
  • Запустить экземпляр новой базы, ещё не пытаясь ничего монтировать;
  • Создать новый control file. Этот шаг автоматически "перештампует" файлы данных новым именем базы и смонтирует всё, что надо;
  • Открыть базу для пользователя, используя опцию RESETLOGS;
  • В случае необходимости "кластеризации" базы, будем "включать" один за другим необходимые "redo threads" и запускать новые экземпляры (процессы) на других узлах кластера, предварительно связанных между собой посредством Grid Infrastructure.
  • Клонирование некластерной базы на той же машине - RMAN

    На этом этапе мы создаём "релизную" копию базы данных девелоперов для работы тестеров на том же сервере.

    Оракл предлагает нам помощь в виде команды RMAN "DUPLICATE". Как мы убедимся, ручное копирование базы сравнимо по времени и усилиям с этим "автоматизированным" процессом.

    Использование Enterprise Manager с его "однокнопочной" функцией клонирования базы я не рассматриваю по многим причинам. Например, мой сервер разработчиков не имеет избыточных ресурсов для "агентов" ЕМ. "Девелоперский сервер" имеет очень "динамичную" конфигурацию, где новые базы могут появляться и исчезать по нескольку раз за день - у людей нет времени на бесконечные расследования причин, по которым EM не смог обнаружить их новую базу. Ну и главная причина - нестабильная работа процесса клонирования базы в EM. В случае каких-либо отклонений чаще всего процесс приходится полностью повторять, предварительно потратив время на выяснение что же именно делал ЕМ во время сбоя. Кроме того, я уверен что ДБА должны знать и уверенно владеть техникой клонирования баз данных из "командной строки", без использования "помощников" типа ЕМ, Toad и прочих.

    Зачастую подобное клонирование баз выполняется с использованием функциональности внешних дисковых массивов ("storage snapshots"), а также особенностей файловых систем типа ZFS, BTRFS и т.п. Но в моём случае я пытаюсь предельно упростить процесс клонирования, да и саму конфигурацию "девелоперского" сервера. Я не использую внешних дисков - только "внутренние" локальные диски сервера, собранные в RAID5 массив на встроенном контроллере. Из соображений стабильности (да и производительности) мы используем файловые системы ext3/ext4 (иногда ext2). Этот подход позволяет мне значительно удешевить конфигурацию серверов, не используемых на основной производственной площадке, и держать администраторов баз данных "в форме", ежедневно практикуя резервное копирование и восстановление баз данных.

    В маловероятном случае появления "лишних" денег в бюджете я предпочитаю покупать локальные диски улучшенной производительности (возможно SSD), что позволяет уменьшать время "локального" клонирования до величин, фактически сопоставимых со временем "поднятия клона" из storage snapshot.

    Итак, после затянутого вступления, начнём. Все действия выполняются на "конечном" (auxiliary) сервере, где необходимо запустить клон существующей базы. В моём случае это тот же самый компьютер, где расположена исходная база данных разработчиков. Я использую OMF (Oracle Managed Files) во всех случаях, на файловой системе и на ASM, что упрощает синтаксис команд копирования.

    Прежде всего, нам необходимо сделать резервную копию исходной (target) базы. Делается это обычным способом - установите соответствующие переменные окружения для базы данных девелоперов (у меня ORACLE_SID=DB), запустите RMAN, подключитесь через "connect target" и выполните команду "backup database". Вероятнее всего девелоперская база находится в режиме NOARCHIVELOG - в этом случае базу перед резервным копированием надо будет запустить в режиме "mount" и открыть для пользователей после (командой "alter database open"). Я не привожу примера резервного копирования - уверен что вы сами знаете как это делается. Заметьте расположение резервного набора данных - оно понадобится позже.

    Теперь переходим к "поднятию клона" - установите переменную среды нужным образом, у меня ORACLE_SID=CLONE. Первое, что нам понадобится во всех случаях - начальный конфигурационный файл для базы-клона (auxiliary). Он очень прост:

    ............ == Послание к Филиппийцам святого апостола Павла == ...............
    === Глава 4, Стих 8 ===
    8 Наконец, братия мои, что только истинно,  что  честно,  что  справедливо,  что
      чисто, что любезно, что достославно, что только добродетель и похвала,  о  том
      помышляйте.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@ouldb ~]$ cat $ORACLE_HOME/dbs/initCLONE.ora
    DB_NAME=CLONE
    DB_DOMAIN=localdomain
    DB_CREATE_FILE_DEST='/home/oracle/app/oracle/oradata/CLONE'
    DB_RECOVERY_FILE_DEST='/home/oracle/app/oracle/fast_recovery_area/CLONE'
    DB_RECOVERY_FILE_DEST_SIZE=2G
    [oracle@ouldb ~]$
    

    Всё, что нам требуется - это имя новой базы, её домен и маршрут для восстановления копий (DB's datafiles) и создания новых (CLONE's control files, online redo logs) файлов.

    Также нам понадобится заранее создать необходимые директории - для уверенности проверьте параметры "*_dest" и имена датафайлов исходной девелоперской базы DB. Также удалите следы предыдущих неудачных клонирований :-) :

    ........................ == Книга пророка Малахии == ...........................
    === Глава 3, Стих 16 ===
    16 Но боящиеся Бога говорят  друг  другу:  "внимает  Господь  и  слышит  это,  и
       пред лицем Его пишется памятная книга о боящихся Господа и чтущих имя Его".
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@ouldb ~]$ mkdir /home/oracle/app/oracle/admin/CLONE/adump
    [oracle@ouldb ~]$ mkdir /home/oracle/app/oracle/admin/CLONE/dpdump
    [oracle@ouldb ~]$ mkdir /home/oracle/app/oracle/admin/CLONE/pfile
    [oracle@ouldb ~]$ rm /home/oracle/app/oracle/product/00.o.0/dbhome_1/dbs/hc_CLONE.dat
    [oracle@ouldb ~]$ rm /home/oracle/app/oracle/product/00.o.0/dbhome_1/dbs/spfileCLONE.ora
    

    Теперь всё готово для запуска начального экземпляра клона (auxiliary), но при этом нам ещё нечего монтировать или открывать. Кроме того заметьте - мы используем для запуска только "pfile" initSID.ora, серверный файл параметров "spfile" должен был быть удалён. Последовательность команд обычная:

    - sqlplus
    - connect / as sysdba
    - startup nomount
    /* Здесь появятся записи о запуске экземпляра CLONE*/
    

    Поскольку ORACLE_SID у нас уже установлен в CLONE, запустим RMAN и подключимся к только что запущенному экземпляру CLONE командой "connect auxiliary /". Мы не подключаемся к исходной (target) базе или каталогу RMAN. Для клонирования данных будет использован сделанный ранее бэкап, находящийся на этом сервере и местоположение которого нам известно.

    Запустим ту самую "простую" команду DUPLICATE - обратите внимание на обилие действий, происходящих за кулисами. Очень важно использовать PARAMETER_VALUE_CONVERT в нашей команде - иначе, поскольку мы клонируем базу на том же сервере, мы перезапишем control file исходной девелоперской базы.

    
    RMAN> duplicate database to 'CLONE'
    2> spfile PARAMETER_VALUE_CONVERT ('/DB/','/CLONE/')	
    3> backup location '/home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_27'
    4> ;
    
    
    
    Starting Duplicate Db at 27-03-13 14:48:17
    
    
    
    contents of Memory Script:
    {
       restore clone spfile to  
     '/home/oracle/app/oracle/product/00.o.0/dbhome_1/dbs/spfileCLONE.ora' from 
     '/home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_27/
      o1_mf_nnsnf_TAG20130327T111450_8o4ghvdk_.bkp';
       sql clone "alter system set spfile= ''/home/oracle/app/oracle/product/00.o.0/
      dbhome_1/dbs/spfileCLONE.ora''";
    }
    executing Memory Script
    
    Starting restore at 27-03-13 14:48:18
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=289 device type=DISK
    
    channel ORA_AUX_DISK_1: restoring spfile from AUTOBACKUP 
    /home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_27/
     o1_mf_nnsnf_TAG20130327T111450_8o4ghvdk_.bkp
    channel ORA_AUX_DISK_1: SPFILE restore from AUTOBACKUP complete
    Finished restore at 27-03-13 14:48:19
    
    sql statement: alter system set spfile= ''/home/oracle/app/oracle/product/00.o.0/
     dbhome_1/dbs/spfileCLONE.ora''
    
    
    
    contents of Memory Script:
    {
       sql clone "alter system set  db_name = 
     ''CLONE'' comment=
     ''duplicate'' scope=spfile";
       sql clone "alter system set  audit_file_dest = 
     ''/home/oracle/app/oracle/admin/CLONE/adump'' comment=
     '''' scope=spfile";
       sql clone "alter system set  control_files = 
     ''/home/oracle/app/oracle/oradata/CLONE/controlfile/o1_mf_8nf6szof_.ctl'', 
     ''/home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/o1_mf_8nf6szvd_.ctl'' comment=
     '''' scope=spfile";
       shutdown clone immediate;
       startup clone nomount;
    }
    executing Memory Script
    
    sql statement: alter system set  db_name =  ''CLONE'' comment= ''duplicate'' scope=spfile
    
    sql statement: alter system set  audit_file_dest =  
    ''/home/oracle/app/oracle/admin/CLONE/adump'' comment= '''' scope=spfile
    
    sql statement: alter system set  control_files =  
    ''/home/oracle/app/oracle/oradata/CLONE/controlfile/o1_mf_8nf6szof_.ctl'', 
    ''/home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/o1_mf_8nf6szvd_.ctl'' 
    comment= '''' scope=spfile
    
    Oracle instance shut down
    
    connected to auxiliary database (not started)
    Oracle instance started
    
    Total System Global Area    1653518336 bytes
    
    Fixed Size                     2288392 bytes
    Variable Size               1056965880 bytes
    Database Buffers             587202560 bytes
    Redo Buffers                   7061504 bytes
    
    
    
    contents of Memory Script:
    {
       sql clone "alter system set  control_files = 
      ''/home/oracle/app/oracle/oradata/CLONE/controlfile/o1_mf_8nf6szof_.ctl'', 
    ''/home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/o1_mf_8nf6szvd_.ctl'' 
      comment= ''Set by RMAN'' scope=spfile";
       sql clone "alter system set  db_name = 
     ''DB'' comment=
     ''Modified by RMAN duplicate'' scope=spfile";
       sql clone "alter system set  db_unique_name = 
     ''CLONE'' comment=
     ''Modified by RMAN duplicate'' scope=spfile";
       shutdown clone immediate;
       startup clone force nomount
       restore clone primary controlfile from  
     '/home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_27/
      o1_mf_ncnnf_TAG20130327T111503_8o4gj8nx_.bkp';
       alter clone database mount;
    }
    executing Memory Script
    
    sql statement: alter system set  control_files =   
    ''/home/oracle/app/oracle/oradata/CLONE/controlfile/o1_mf_8nf6szof_.ctl'', 
    ''/home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/o1_mf_8nf6szvd_.ctl'' 
    comment= ''Set by RMAN'' scope=spfile
    
    sql statement: alter system set  db_name =  ''DB'' 
     comment= ''Modified by RMAN duplicate'' scope=spfile
    
    sql statement: alter system set  db_unique_name =  ''CLONE'' 
     comment= ''Modified by RMAN duplicate'' scope=spfile
    
    Oracle instance shut down
    
    Oracle instance started
    
    Total System Global Area    1653518336 bytes
    
    Fixed Size                     2288392 bytes
    Variable Size               1056965880 bytes
    Database Buffers             587202560 bytes
    Redo Buffers                   7061504 bytes
    
    Starting restore at 27-03-13 14:48:51
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=357 device type=DISK
    
    channel ORA_AUX_DISK_1: restoring control file
    channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
    output file name=/home/oracle/app/oracle/oradata/CLONE/controlfile/o1_mf_8nf6szof_.ctl
    output file name=/home/oracle/app/oracle/fast_recovery_area/CLONE/
     controlfile/o1_mf_8nf6szvd_.ctl
    Finished restore at 27-03-13 14:48:53
    
    database mounted
    released channel: ORA_AUX_DISK_1
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=357 device type=DISK
    
    
    
    contents of Memory Script:
    {
       set newname for clone datafile  1 to new;
       set newname for clone datafile  2 to new;
       set newname for clone datafile  3 to new;
       set newname for clone datafile  4 to new;
       set newname for clone datafile  6 to new;
       restore
       clone database
       ;
    }
    executing Memory Script
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    Starting restore at 27-03-13 14:48:59
    using channel ORA_AUX_DISK_1
    
    channel ORA_AUX_DISK_1: starting datafile backup set restore
    channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
    channel ORA_AUX_DISK_1: restoring datafile 00001 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_system_%u_.dbf
    channel ORA_AUX_DISK_1: restoring datafile 00002 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_soe_%u_.dbf
    channel ORA_AUX_DISK_1: restoring datafile 00003 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_sysaux_%u_.dbf
    channel ORA_AUX_DISK_1: restoring datafile 00004 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_undotbs1_%u_.dbf
    channel ORA_AUX_DISK_1: restoring datafile 00006 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_users_%u_.dbf
    channel ORA_AUX_DISK_1: reading from backup piece /home/oracle/app/oracle/
     fast_recovery_area/DB/backupset/2013_03_27/o1_mf_nnndf_TAG20130327T095402_8o49rc2x_.bkp
    channel ORA_AUX_DISK_1: piece handle=/home/oracle/app/oracle/fast_recovery_area/ \
     DB/backupset/2013_03_27/o1_mf_nnndf_TAG20130327T095402_8o49rc2x_.bkp 
     tag=TAG20130327T095402
    channel ORA_AUX_DISK_1: restored backup piece 1
    channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:04:05
    Finished restore at 27-03-13 14:53:05
    
    
    
    contents of Memory Script:
    {
       switch clone datafile all;
    }
    executing Memory Script
    
    datafile 1 switched to datafile copy
    input datafile copy RECID=6 STAMP=811176785 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_system_8o4v1dg3_.dbf
    datafile 2 switched to datafile copy
    input datafile copy RECID=7 STAMP=811176786 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_soe_8o4v1dc0_.dbf
    datafile 3 switched to datafile copy
    input datafile copy RECID=8 STAMP=811176786 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_sysaux_8o4v1ddo_.dbf
    datafile 4 switched to datafile copy
    input datafile copy RECID=9 STAMP=811176786 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_undotbs1_8o4v1dd3_.dbf
    datafile 6 switched to datafile copy
    input datafile copy RECID=10 STAMP=811176786 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_users_8o4v1dh5_.dbf
    
    
    
    contents of Memory Script:
    {
       recover
       clone database
       noredo
        delete archivelog
       ;
    }
    executing Memory Script
    
    Starting recover at 27-03-13 14:53:08
    using channel ORA_AUX_DISK_1
    
    Finished recover at 27-03-13 14:53:08
    Oracle instance started
    
    Total System Global Area    1653518336 bytes
    
    Fixed Size                     2288392 bytes
    Variable Size               1056965880 bytes
    Database Buffers             587202560 bytes
    Redo Buffers                   7061504 bytes
    
    
    
    contents of Memory Script:
    {
       sql clone "alter system set  db_name = 
     ''CLONE'' comment=
     ''Reset to original value by RMAN'' scope=spfile";
       sql clone "alter system reset  db_unique_name scope=spfile";
    }
    executing Memory Script
    
    sql statement: alter system set  db_name =  ''CLONE'' 
     comment= ''Reset to original value by RMAN'' scope=spfile
    
    sql statement: alter system reset  db_unique_name scope=spfile
    Oracle instance started
    
    Total System Global Area    1653518336 bytes
    
    Fixed Size                     2288392 bytes
    Variable Size               1056965880 bytes
    Database Buffers             587202560 bytes
    Redo Buffers                   7061504 bytes
    sql statement: CREATE CONTROLFILE REUSE SET DATABASE "CLONE" RESETLOGS NOARCHIVELOG --как "nid"
      MAXLOGFILES     16
      MAXLOGMEMBERS      3
      MAXDATAFILES      100
      MAXINSTANCES     8
      MAXLOGHISTORY      292
     LOGFILE
      GROUP   1  SIZE 100 M ,
      GROUP   2  SIZE 100 M ,
      GROUP   3  SIZE 100 M ,
      GROUP   4  SIZE 100 M ,
      GROUP   5  SIZE 100 M ,
      GROUP   6  SIZE 100 M 
     DATAFILE
      '/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_system_8o4v1dg3_.dbf'
     CHARACTER SET AL32UTF8
    
    
    
    contents of Memory Script:
    {
       set newname for clone tempfile  1 to new;
       switch clone tempfile all;
       catalog clone datafilecopy  
     "/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_soe_8o4v1dc0_.dbf", 
     "/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_sysaux_8o4v1ddo_.dbf", 
     "/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_undotbs1_8o4v1dd3_.dbf", 
     "/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_users_8o4v1dh5_.dbf";
       switch clone datafile all;
    }
    executing Memory Script
    
    executing command: SET NEWNAME
    
    renamed tempfile 1 to 
     /home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_temp_%u_.tmp in control file
    
    cataloged datafile copy
    datafile copy 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_soe_8o4v1dc0_.dbf 
     RECID=1 STAMP=811176838
    cataloged datafile copy
    datafile copy 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_sysaux_8o4v1ddo_.dbf 
     RECID=2 STAMP=811176838
    cataloged datafile copy
    datafile copy 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_undotbs1_8o4v1dd3_.dbf 
     RECID=3 STAMP=811176838
    cataloged datafile copy
    datafile copy 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_users_8o4v1dh5_.dbf 
     RECID=4 STAMP=811176838
    
    datafile 2 switched to datafile copy
    input datafile copy RECID=1 STAMP=811176838 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_soe_8o4v1dc0_.dbf
    datafile 3 switched to datafile copy
    input datafile copy RECID=2 STAMP=811176838 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_sysaux_8o4v1ddo_.dbf
    datafile 4 switched to datafile copy
    input datafile copy RECID=3 STAMP=811176838 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_undotbs1_8o4v1dd3_.dbf
    datafile 6 switched to datafile copy
    input datafile copy RECID=4 STAMP=811176838 
     file name=/home/oracle/app/oracle/oradata/CLONE/datafile/o1_mf_users_8o4v1dh5_.dbf
    
    
    
    contents of Memory Script:
    {
       Alter clone database open resetlogs;
    }
    executing Memory Script
    
    database opened
    Finished Duplicate Db at 27-03-13 14:54:16
    
    RMAN> 
    
    
    -- Здесь я хочу удостовериться что имя базы и DBID были изменены 
    -- при создании нового control file.
    RMAN> select name, open_mode, dbid from v$database;	-- Да, это работает даже без "sql".
    
    NAME      OPEN_MODE                  DBID
    --------- -------------------- ----------
    CLONE     READ WRITE           1009992514
    
    RMAN> 
    

    Как видим, RMAN выполнил достаточно много разных команд, объединённых в скрипты, для последовательного:

  • восстановления spfile из бэкапа;
  • смены имени базы, её "*_dest" параметров и расположения control files;
  • первого рестарта базы под новым именем, без монтирования и без control file;
  • восстановления старого имени базы и рестарта без монтирования;
  • восстановления исходного (DB) control file из бэкапа;
  • монтирования базы под старым именем;
  • восстановления из бэкапа файлов данных и регистрации их в старом control file;
  • создания нового control file, смены имени базы и DBID;
  • монтирования базы под новым именем;
  • регистрации уже восстановленных файлов в новом control file;
  • открытии базы данных с ре-форматированием online redo logs.
  • В заключение, добавим имя базы в файл "oratab":

    ........................ == Книга пророка Софонии == ...........................
    === Глава 2, Стих 1 ===
    1 Исследуйте    себя    внимательно,    исследуйте,    народ       необузданный,
    2 доколе не пришло определение - день пролетит как мякина  -  доколе  не  пришел
      на вас пламенный гнев Господень,  доколе  не  наступил  для  вас  день  ярости
      Господней.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@ouldb ~]$ tail -2 /etc/oratab
    DB:/home/oracle/app/oracle/product/00.o.0/dbhome_1:N
    CLONE:/home/oracle/app/oracle/product/00.o.0/dbhome_1:N
    [oracle@ouldb ~]$
    

    В процессе работы RMAN несколько раз меняет значения имени новой базы-клона, для синхронизации параметров и записей в control file, перерегистрирует уже существующие файлы и выполняет достаточно вроде бы ненужных действий. Если вы хотите понимать что же действительно происходит с базой во время клонирования - следующая секция для вас.

    Клонирование некластерной базы на той же машине - ещё раз, но вручную

    Ручное клонирование базы данных - одна из самых традиционных и уже подробно описанных операций. В принципе, при клонировании RMAN повторяет те же самые действия, что и обычный ДБА - разница лишь в том что ДБА знает какие шаги нужны а какие могут быть пропущены. Ещё раз повторим (но теперь вручную) приведенный выше процесс клонирования девелоперской базы с именем DB в базу с именем CLONE для тестировщиков, находящуюся на том же сервере.

    Выполним некоторые действия на исходной девелоперской базе DB:

    .......... == Первое послание к Тимофею святого апостола Павла == ..............
    === Глава 2, Стих 11 ===
    11 Жена    да    учится    в     безмолвии,     со     всякою       покорностью;
    12 а учить жене не позволяю, ни властвовать  над  мужем,  но  быть  в безмолвии.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb oracle]$ env | grep ORA
    ORACLE_SID=DB
    ORACLE_BASE=/home/oracle/app/oracle
    ORACLE_HOME=/home/oracle/app/oracle/product/00.o.0/dbhome_1
    [oracle@ouldb oracle]$
    
    -- Приготовим копию исходного (target) init file:
    [oracle@ouldb oracle]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Thu Mar 28 10:35:36 2013
    
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    
    Connected to:
    Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
    
    SQL> create pfile='/tmp/init.ora' from spfile;
    
    File created.
    
    -- создадим текстовый файл со скриптом для пересоздания control file:
    SQL> alter database backup controlfile to trace;
    
    Database altered.
    
    SQL>
    
    SQL> Disconnected from Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit 
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
    [oracle@ouldb oracle]$
    

    Отредактируем созданную копию файла параметров, заменив имя базы на новое (CLONE) и поместим файл в $ORACLE_HOME/dbs:

    ........................... == Притчи Соломона == ..............................
    === Глава 9, Стих 9 ===
    8 Не обличай кощунника, чтобы он не возненавидел тебя;  обличай  мудрого,  и  он
      возлюбит тебя;
    9 дай _наставление_ мудрому, и он будет  еще  мудрее;  научи  правдивого,  и  он
      приумножит знание.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb oracle]$ cat $ORACLE_HOME/dbs/initCLONE.ora
    *.audit_file_dest='/home/oracle/app/oracle/admin/CLONE/adump'
    *.audit_trail='db'
    *.compatible='00.0.0.0.0'
    *.control_files='/home/oracle/app/oracle/oradata/CLONE/controlfile/c1.ctl',
     '/home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/c2.ctl'
    *.db_block_size=8192
    *.db_create_file_dest='/home/oracle/app/oracle/oradata'
    *.db_create_online_log_dest_1='/home/oracle/app/oracle/oradata'
    *.db_domain='localdomain'
    *.db_name='CLONE'
    *.db_recovery_file_dest='/home/oracle/app/oracle/fast_recovery_area'
    *.db_recovery_file_dest_size=4800m
    *.diagnostic_dest='/home/oracle/app/oracle'
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=CLONEXDB)'
    *.memory_target=1584m
    *.open_cursors=300
    *.processes=300
    *.remote_login_passwordfile='EXCLUSIVE'
    *.undo_tablespace='UNDOTBS1'
    [oracle@ouldb oracle]$
    

    Поскольку я буду копировать базу вручную, мне понадобится более подробное описание параметров. Теперь подготовим скрипт для создания нового control file. Найдём в директории "user_dump_dest" trace file, содержащий "CREATE CONTROLFILE" и скопируем его в отдельный файл с изменённым содержанием:

    .................. == От Иоанна святое благовествование == .....................
    === Глава 16, Стих 8 ===
    7 Но Я истину говорю вам: лучше для вас, чтобы Я пошел; ибо, если  Я  не  пойду,
      Утешитель не приидет к вам; а если пойду, то пошлю Его к вам,
    8 и   Он,   придя,   обличит   мир   о   грехе   и   о   правде   и   о    суде:
    9 о грехе, что не веруют в Меня;
    10 о  правде,  что  Я  иду   к   Отцу   Моему,   и   уже   не   увидите    Меня;
    11 о     суде      же,      что      князь      мира      сего          осужден.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb oracle]$ cd /home/oracle/app/oracle/diag/rdbms/db/DB/trace/
    [oracle@ouldb trace]$ ls -latrh *trc | tail -10
    -rw-r----- 1 oracle oinstall  881 Mar 28 11:15 DB_lg00_1429.trc
    -rw-r----- 1 oracle oinstall 1.8K Mar 28 11:15 DB_vktm_1407.trc
    -rw-r----- 1 oracle oinstall 1.7K Mar 28 11:15 DB_ora_1583.trc
    -rw-r----- 1 oracle oinstall 3.3K Mar 28 11:17 DB_ora_1649.trc
    -rw-r----- 1 oracle oinstall 1.2K Mar 28 11:17 DB_vktm_1658.trc
    -rw-r----- 1 oracle oinstall  923 Mar 28 11:17 DB_dbw0_1674.trc
    -rw-r----- 1 oracle oinstall  900 Mar 28 11:17 DB_lgwr_1676.trc
    -rw-r----- 1 oracle oinstall 1.1K Mar 28 11:17 DB_ckpt_1678.trc
    -rw-r----- 1 oracle oinstall  913 Mar 28 11:17 DB_ora_1697.trc
    -rw-r----- 1 oracle oinstall 7.9K Mar 28 11:17 DB_ora_1706.trc
    [oracle@ouldb trace]$
    
    -- Необходимо заменить имена базы и директорий для файлов:
    [oracle@ouldb ~]$ cat crtctl.sql
    /* Изначально было так:
    CREATE CONTROLFILE REUSE DATABASE "DB" NORESETLOGS  NOARCHIVELOG
    */
    CREATE CONTROLFILE set DATABASE "CLONE" RESETLOGS  NOARCHIVELOG
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
    LOGFILE
      GROUP 1 '/home/oracle/app/oracle/oradata/CLONE/redo1.log'  SIZE 100M BLOCKSIZE 512,
      GROUP 2 '/home/oracle/app/oracle/oradata/CLONE/redo2.log'  SIZE 100M BLOCKSIZE 512,
      GROUP 3 '/home/oracle/app/oracle/oradata/CLONE/redo3.log'  SIZE 100M BLOCKSIZE 512,
      GROUP 4 '/home/oracle/app/oracle/oradata/CLONE/redo4.log'  SIZE 100M BLOCKSIZE 512,
      GROUP 5 '/home/oracle/app/oracle/oradata/CLONE/redo5.log'  SIZE 100M BLOCKSIZE 512,
      GROUP 6 '/home/oracle/app/oracle/oradata/CLONE/redo6.log'  SIZE 100M BLOCKSIZE 512
    -- STANDBY LOGFILE
    DATAFILE
      '/home/oracle/app/oracle/oradata/CLONE/system.dbf',
      '/home/oracle/app/oracle/oradata/CLONE/soe.dbf',
      '/home/oracle/app/oracle/oradata/CLONE/sysaux.dbf',
      '/home/oracle/app/oracle/oradata/CLONE/undotbs1.dbf',
      '/home/oracle/app/oracle/oradata/CLONE/users.dbf'
    CHARACTER SET AL32UTF8
    ;
    [oracle@ouldb ~]$
    

    Теперь у нас всё готово к первому запуску клона без датафайлов - у нас есть необходимые значения для параметров и команда для пересоздания control file. Но у нас ещё нет файлов с данными.

     == Первое послание к Фессалоникийцам (Солунянам) святого апостола Павла == ....
    === Глава 2, Стих 20 ===
    19 Ибо кто наша надежда, или радость,  или  венец  похвалы?  Не  и  вы  ли  пред
       Господом нашим Иисусом Христом в пришествие Его?
    20 Ибо вы -- слава наша и радость.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb ~]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Thu Mar 28 11:15:40 2013
    
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    -- запускаем экземпляр клона, не монтируя файлы, используем файл "initCLONE.ora"
    11:15:44 SQL> startup nomount
    ORACLE instance started.
    
    Total System Global Area 1653518336 bytes
    Fixed Size                  2288392 bytes
    Variable Size            1056965880 bytes
    Database Buffers          587202560 bytes
    Redo Buffers                7061504 bytes
    11:15:53 SQL>
    

    Теперь необходимые процессы экземпляра Оракл запущены и находятся в памяти ОС, нам надо скопировать файлы исходной базы по месту, указанному в скрипте для создания control file:

    ......... == Второе послание к Коринфянам святого апостола Павла == ............
    === Глава 3, Стих 3 ===
    1 Неужели нам  снова  знакомиться  с  вами?  Неужели  нужны  для  нас,  как  для
      некоторых, одобрительные письма к вам или от вас?
    2 Вы -- наше письмо, написанное в сердцах наших,  узнаваемое  и  читаемое  всеми
      человеками;
    3 вы  показываете  собою,  что  вы  --  письмо  Христово,  через  служение  наше
      написанное не чернилами, но Духом Бога живаго, не на  скрижалях  каменных,  но
      на плотяных скрижалях сердца.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb ~]$ cd app/oracle/oradata/
    [oracle@ouldb oradata]$ ls
    CLONE  DB
    [oracle@ouldb oradata]$ ls DB/
    controlfile/ datafile/    onlinelog/
    [oracle@ouldb oradata]$ ls DB/datafile/
    o1_mf_soe_8o1nmdwv_.dbf     o1_mf_system_8nf6p4po_.dbf  o1_mf_undotbs1_8nf6rv97_.dbf
    o1_mf_sysaux_8nf6mscy_.dbf  o1_mf_temp_8nf6toqb_.tmp    o1_mf_users_8nf6rt26_.dbf
    [oracle@ouldb oradata]$ cp DB/datafile/*system* CLONE/system.dbf
    [oracle@ouldb oradata]$ cp DB/datafile/*sysaux* CLONE/sysaux.dbf
    [oracle@ouldb oradata]$ cp DB/datafile/*soe* CLONE/soe.dbf
    [oracle@ouldb oradata]$ cp DB/datafile/*users* CLONE/users.dbf
    [oracle@ouldb oradata]$ cp DB/datafile/*undotbs1* CLONE/undotbs1.dbf
    [oracle@ouldb oradata]$ ls -lah DB/datafile/
    total 6.5G
    drwxr-x--- 2 oracle oinstall 4.0K Mar 26 09:40 .
    drwxr-x--- 5 oracle oinstall 4.0K Mar 18 15:42 ..
    -rw-r----- 1 oracle oinstall 3.5G Mar 27 16:48 o1_mf_soe_8o1nmdwv_.dbf
    -rw-r----- 1 oracle oinstall 841M Mar 27 16:48 o1_mf_sysaux_8nf6mscy_.dbf
    -rw-r----- 1 oracle oinstall 801M Mar 27 16:48 o1_mf_system_8nf6p4po_.dbf
    -rw-r----- 1 oracle oinstall 374M Mar 27 16:44 o1_mf_temp_8nf6toqb_.tmp
    -rw-r----- 1 oracle oinstall 1.1G Mar 27 16:48 o1_mf_undotbs1_8nf6rv97_.dbf
    -rw-r----- 1 oracle oinstall 5.1M Mar 27 16:48 o1_mf_users_8nf6rt26_.dbf
    [oracle@ouldb oradata]$ ls -lah CLONE/
    total 6.5G
    drwxr-xr-x 2 oracle oinstall 4.0K Mar 28 11:29 .
    drwxr-x--- 4 oracle oinstall 4.0K Mar 27 09:42 ..
    -rw-r----- 1 oracle oinstall 3.5G Mar 28 11:28 soe.dbf
    -rw-r----- 1 oracle oinstall 841M Mar 28 11:26 sysaux.dbf
    -rw-r----- 1 oracle oinstall 801M Mar 28 11:25 system.dbf
    -rw-r----- 1 oracle oinstall 1.1G Mar 28 11:29 undotbs1.dbf
    -rw-r----- 1 oracle oinstall 5.1M Mar 28 11:28 users.dbf
    [oracle@ouldb oradata]$
    

    Итак, почти всё готово - у нас есть файл с параметрами и экземпляр Оракл для новой базы уже запущен, копии файлов данных находятся в нужных для новой базы "CLONE" местах (но с именем старой базы "DB" внутри). Всё, что осталось сделать это создать новый control file, при этом все заголовки файлов данных будут обновлены автоматически. Проверим наличие всех необходимых директорий, используемых скриптом "crtctl.sql":

    ........... == Первое соборное послание святого апостола Петра == ..............
    === Глава 3, Стих 8 ===
    8 Наконец будьте  все  единомысленны,  сострадательны,  братолюбивы,  милосерды,
      дружелюбны, смиренномудры;
    9 не воздавайте  злом  за  зло  или  ругательством  за  ругательство;  напротив,
      благословляйте,  зная,   что   вы   к   тому   призваны,   чтобы   наследовать
      благословение.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@ouldb oradata]$ mkdir /home/oracle/app/oracle/oradata/CLONE/controlfile
    [oracle@ouldb oradata]$ mkdir /home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile
    ... 
    

    Запустим скрипт, создающий новый control file. При этом DBID останется тем же самым, но имя базы изменится на "CLONE". Так же по окончании выполнения команды база данных будет смонтирована.

    ......................... == Книга пророка Иоиля == ............................
    === Глава 2, Стих 12 ===
    11 И Господь даст глас Свой  пред  воинством  Своим,  ибо  весьма  многочисленно
       полчище Его и могуществен исполнитель слова Его; ибо велик день  Господень  и
       весьма страшен, и кто выдержит его?
    12 Но и ныне еще говорит  Господь:  обратитесь  ко  Мне  всем  сердцем  своим  в
       посте, плаче и рыдании.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@ouldb ~]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Thu Mar 28 11:31:32 2013
    
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    11:31:35 SQL> startup mount
    ORACLE instance started.
    
    Total System Global Area 1653518336 bytes
    Fixed Size                  2288392 bytes
    Variable Size            1056965880 bytes
    Database Buffers          587202560 bytes
    Redo Buffers                7061504 bytes
    
    ORA-00205: error in identifying control file, check alert log for more info
    		-- резонно, у нас ещё нет CF
    
    
    11:31:41 SQL> show parameter control	
    		-- удостоверимся что мы не перезаписываем CF исходной базы
    
    NAME				     TYPE	 VALUE
    ------------------------------------ ----------- ------------------------------
    control_file_record_keep_time	     integer	 7
    control_files			     string	 /home/oracle/app/oracle/oradat
    						 a/CLONE/controlfile/c1.ctl, /h
    						 ome/oracle/app/oracle/fast_rec
    						 overy_area/CLONE/controlfile/c
    						 2.ctl
    control_management_pack_access	     string	 DIAGNOSTIC+TUNING
    11:34:24 SQL> @crtctl
    
    Control file created.
    
    Elapsed: 00:00:00.92
    11:34:27 SQL> select name, open_mode from v$database;
    
    NAME	  OPEN_MODE
    --------- --------------------
    CLONE	  MOUNTED
    
    1 row selected.
    
    Elapsed: 00:00:00.21
    11:34:41 SQL> 
    
    
    	-- проверим, что необходимые файлы найдены
    11:35:09 SQL> select * from v$recover_file;
    	--  recovery не потребуется - все файлы имеют один и тот же CHANGE#
    
         FILE# ONLINE  ONLINE_ ERROR			CHANGE# TIME	      CON_ID
    ---------- ------- ------- ------------------------- ---------- --------- ----------
    	 1 ONLINE  ONLINE				2242469 27-MAR-13	   0
    	 2 ONLINE  ONLINE				2242469 27-MAR-13	   0
    	 3 ONLINE  ONLINE				2242469 27-MAR-13	   0
    	 4 ONLINE  ONLINE				2242469 27-MAR-13	   0
    	 6 ONLINE  ONLINE				2242469 27-MAR-13	   0
    
    5 rows selected.
    
    Elapsed: 00:00:00.26
    11:35:15 SQL>
    ...
    11:36:29 SQL> l
      1* select member, status from v$logfile	-- resetlog необходим
    11:36:30 SQL> /
    
    MEMBER							STATUS
    ------------------------------------------------------- -------
    /home/oracle/app/oracle/oradata/CLONE/redo6.log 	STALE
    /home/oracle/app/oracle/oradata/CLONE/redo5.log 	STALE
    /home/oracle/app/oracle/oradata/CLONE/redo4.log 	STALE
    /home/oracle/app/oracle/oradata/CLONE/redo3.log 	STALE
    /home/oracle/app/oracle/oradata/CLONE/redo2.log 	STALE
    /home/oracle/app/oracle/oradata/CLONE/redo1.log 	STALE
    
    6 rows selected.
    
    Elapsed: 00:00:00.02
    11:36:31 SQL> 
    

    Новая база-клон смонтирована - все файлы найдены. Остается добавить tempfile и открыть базу для пользователей:

    11:36:31 SQL> alter database open resetlogs;
    
    Database altered.
    
    Elapsed: 00:00:33.70
    11:39:02 SQL> alter tablespace temp add tempfile
    11:39:38   2  '/home/oracle/app/oracle/oradata/CLONE/temp1.dbf' size 200m;
    
    Tablespace altered.
    
    Elapsed: 00:00:00.33
    11:39:46 SQL>
    
    -- После перезапуска CLONE будет использовать server-side parameter file.
    
    11:57:12 SQL> create spfile from pfile;
    
    File created.
    
    Elapsed: 00:00:00.09
    11:57:23 SQL>
    

    С этого момента база данных может быть использована, но значение DBID осталось неизменным, что может привести к конфликтам в recovery catalog. Следующий шаг необязателен и приводится как пример использования утилиты DBNEWID.

    11:41:17 SQL> alter database close;
    
    Database altered.
    
    Elapsed: 00:00:04.23
    Disconnected from Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
    [oracle@ouldb ~]$ nid target='sys/oracle'
    
    DBNEWID: Release 00.o.0.1.0 - Production on Thu Mar 28 11:41:36 2013
    
    Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
    
    Connected to database CLONE (DBID=1574217976)		-- DBID исходной базы "DB"
    
    Connected to server version 00.o.0
    
    Control Files in database:
        /home/oracle/app/oracle/oradata/CLONE/controlfile/c1.ctl
        /home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/c2.ctl
    
    Change database ID of database CLONE? (Y/[N]) => y
    
    Proceeding with operation
    Changing database ID from 1574217976 to 1010035889
     Control File /home/oracle/app/oracle/oradata/CLONE/controlfile/c1.ctl - modified
     Control File /home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/c2.ctl - modified
     Datafile /home/oracle/app/oracle/oradata/CLONE/system.db - dbid changed
     Datafile /home/oracle/app/oracle/oradata/CLONE/soe.db - dbid changed
     Datafile /home/oracle/app/oracle/oradata/CLONE/sysaux.db - dbid changed
     Datafile /home/oracle/app/oracle/oradata/CLONE/undotbs1.db - dbid changed
     Datafile /home/oracle/app/oracle/oradata/CLONE/users.db - dbid changed
     Datafile /home/oracle/app/oracle/oradata/CLONE/temp1.db - dbid changed
     Control File /home/oracle/app/oracle/oradata/CLONE/controlfile/c1.ctl - dbid changed
     Control File /home/oracle/app/oracle/fast_recovery_area/CLONE/controlfile/c2.ctl - dbid changed
     Instance shut down
    
    Database ID for database CLONE changed to 1010035889.                           -- NEW DBID
    All previous backups and archived redo logs for this database are unusable.  -- Сделайте backup!
    Database is not aware of previous backups and archived logs in Recovery Area.
    Database has been shutdown, open database with RESETLOGS option.	-- Ещё один раз!
    Succesfully changed database ID.
    DBNEWID - Completed succesfully.
    
    [oracle@ouldb ~]$ sqlplus
    ...
    startup mount;
    alter database open resetlogs;
    ...
    -- База была открыта с RESETLOGS повторно, после использования DBNEWID.
    11:50:08 SQL> select DBID, name, open_mode from v$database;
    
          DBID NAME      OPEN_MODE
    ---------- --------- --------------------
    1010035889 CLONE     READ WRITE
    
    1 row selected.
    
    Elapsed: 00:00:00.02
    11:50:18 SQL>
    

    Если необходимо, добавьте строчку с именем новой базы-клона в файл "oratab", как в предыдущем примере. В нашем случае listener обнаружит новую базу автоматически:

    [oracle@ouldb oradata]$ lsnrctl status
    
    LSNRCTL for Linux: Version 00.o.0.1.0 - Production on 28-MAR-2013 11:51:05
    
    Copyright (c) 1991, 2013, Oracle.  All rights reserved.
    
    Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 00.o.0.1.0 - Production
    Start Date                28-MAR-2013 11:50:48
    Uptime                    0 days 0 hr. 0 min. 17 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Log File         /home/oracle/app/oracle/diag/tnslsnr/ouldb/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ouldb.localdomain)(PORT=1521)))
      ...
    Services Summary...
    Service "CLONE.localdomain" has 1 instance(s).
      Instance "CLONE", status READY, has 1 handler(s) for this service...
    Service "CLONEXDB.localdomain" has 1 instance(s).
      Instance "CLONE", status READY, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@ouldb oradata]$
    

    На этом процесс ручного клонирования девелоперской базы "DB" в базу тестеров "CLONE" завершён.

    Клонирование некластерной базы в кластерную - RMAN

    Предположим, что функциональное тестирование завершено и теперь наша база должна быть перемещена на кластер для проверки производительности и масштабируемости. Чтобы скопировать данные с сервера разработчиков на кластер как можно быстрее, я создаю сжатую резервную копию исходной базы. Я могу использовать DB или CLONE.

    Если вы столкнётесь с ошибками, приведенными ниже - просто увеличьте объём памяти, отведённой Ораклу, путём увеличения параметра MEMORY_TARGET до 2Гб:

  • RMAN-03009: failure of backup command on ORA_DISK_1 channel at 03/28/2013 15:05:08
  • ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
  • -- Создадим сжатую резервную копию некластерной базы "DB":
    RMAN> select open_mode, log_mode, flashback_on from v$database;
    
    OPEN_MODE            LOG_MODE     FLASHBACK_ON      
    -------------------- ------------ ------------------
    MOUNTED              NOARCHIVELOG NO            
    -- база должна быть смонтирована, но закрыта
    
    RMAN> backup as compressed backupset database;
    
    Starting backup at 28-03-13 15:10:17
    using channel ORA_DISK_1
    channel ORA_DISK_1: starting compressed full datafile backup set
    channel ORA_DISK_1: specifying datafile(s) in backup set
    input datafile file number=00002 
     name=/home/oracle/app/oracle/oradata/DB/datafile/o1_mf_soe_8o1nmdwv_.dbf
    input datafile file number=00004 
     name=/home/oracle/app/oracle/oradata/DB/datafile/o1_mf_undotbs1_8nf6rv97_.dbf
    input datafile file number=00003 
     name=/home/oracle/app/oracle/oradata/DB/datafile/o1_mf_sysaux_8nf6mscy_.dbf
    input datafile file number=00001 
     name=/home/oracle/app/oracle/oradata/DB/datafile/o1_mf_system_8nf6p4po_.dbf
    input datafile file number=00006 
     name=/home/oracle/app/oracle/oradata/DB/datafile/o1_mf_users_8nf6rt26_.dbf
    channel ORA_DISK_1: starting piece 1 at 28-03-13 15:10:18
    channel ORA_DISK_1: finished piece 1 at 28-03-13 15:18:03
    piece handle=
     /home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_28/
      o1_mf_nnndf_TAG20130328T151017_8o7job6r_.bkp 
     tag=TAG20130328T151017 comment=NONE
    channel ORA_DISK_1: backup set complete, elapsed time: 00:07:45
    channel ORA_DISK_1: starting compressed full datafile backup set
    channel ORA_DISK_1: specifying datafile(s) in backup set
    including current control file in backup set
    including current SPFILE in backup set
    channel ORA_DISK_1: starting piece 1 at 28-03-13 15:18:04
    channel ORA_DISK_1: finished piece 1 at 28-03-13 15:18:05
    piece 
     handle=/home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_28/
      o1_mf_ncsnf_TAG20130328T151017_8o7k3wrk_.bkp 
     tag=TAG20130328T151017 comment=NONE
    channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
    Finished backup at 28-03-13 15:18:05
    
    RMAN> 
    
    RMAN> list backup
    2> ;
    
    
    List of Backup Sets
    ===================
    
    		!!!!!!!!
    
    BS Key  Type LV Size       Device Type Elapsed Time Completion Time  
    ------- ---- -- ---------- ----------- ------------ -----------------
    12      Full    1.57G      DISK        00:07:36     28-03-13 15:17:54
            BP Key: 12   Status: AVAILABLE  Compressed: YES  Tag: TAG20130328T151017
            Piece Name: /home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_28/
    	 o1_mf_nnndf_TAG20130328T151017_8o7job6r_.bkp
      List of Datafiles in backup set 12
      File LV Type Ckp SCN    Ckp Time          Name
      ---- -- ---- ---------- ----------------- ----
      1       Full 2268214    28-03-13 15:08:42 /home/oracle/app/oracle/oradata/DB/
    						datafile/o1_mf_system_8nf6p4po_.dbf
      2       Full 2268214    28-03-13 15:08:42 /home/oracle/app/oracle/oradata/DB/
    						datafile/o1_mf_soe_8o1nmdwv_.dbf
      3       Full 2268214    28-03-13 15:08:42 /home/oracle/app/oracle/oradata/DB/
    						datafile/o1_mf_sysaux_8nf6mscy_.dbf
      4       Full 2268214    28-03-13 15:08:42 /home/oracle/app/oracle/oradata/DB/
    						datafile/o1_mf_undotbs1_8nf6rv97_.dbf
      6       Full 2268214    28-03-13 15:08:42 /home/oracle/app/oracle/oradata/DB/
    						datafile/o1_mf_users_8nf6rt26_.dbf
    
    BS Key  Type LV Size       Device Type Elapsed Time Completion Time  
    ------- ---- -- ---------- ----------- ------------ -----------------
    13      Full    1.05M      DISK        00:00:02     28-03-13 15:18:05
            BP Key: 13   Status: AVAILABLE  Compressed: YES  Tag: TAG20130328T151017
            Piece Name: /home/oracle/app/oracle/fast_recovery_area/DB/backupset/2013_03_28/
    	 o1_mf_ncsnf_TAG20130328T151017_8o7k3wrk_.bkp
      SPFILE Included: Modification time: 28-03-13 15:09:07
      SPFILE db_unique_name: DB
      Control File Included: Ckp SCN: 2268214      Ckp time: 28-03-13 15:08:42
    
    RMAN> 
    

    Итак, нам надо скопировать с девелоперского сервера на кластер 1.6 Гб данных. Используем ftp для пересылки данных на один из узлов кластера. После этого подключимся к узлу кластера, на который был перенесён сжатый бэкап, и установим переменные среды для новой базы - кластерного клона. При этом пока наш "кластерный" клон остаётся всё ещё с одним экземпляром.

    ........... == Первое соборное послание святого апостола Петра == ..............
    === Глава 4, Стих 18 ===
    17 Ибо время начаться суду с дома Божия; если же прежде  с  нас  _начнется,_  то
       какой конец непокоряющимся Евангелию Божию?
    18 И  если  праведник  едва  спасается,  то  нечестивый  и  грешный  где явится?
    19 Итак страждущие по воле  Божией  да  предадут  Ему,  как  верному  Создателю,
       души свои, делая добро.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@db07 ~]$ env | grep ORA
    ORACLE_SID=RACCLONE
    ORACLE_BASE=/u01/app/oracle
    ORACLE_HOME=/u01/app/oracle/product/db00o
    [oracle@db07 ~]$
    

    Клонирование исходной (target) базы (DB в нашем примере) будет производиться с использованием сжатой резервной копии, ранее перемещённой на локальный узел кластера. Само клонирование базы остаётся почти в точности таким, как в первых двух разделах. Мы "клонируем" некластерную базу из бэкапа в некластерную (пока) базу "RACCLONE" (также известную как "auxiliary" database) на единственном узле кластера и открываем её. Затем мы "включаем" оставшиеся "потоки" и кластеризуем базу.

    Нам вновь понадобится создать файл параметров и запустить локальный экземпляр, ещё без датафайлов или control file. Если вы заметите приведенные ниже ошибки - проверьте "ASM diskgroup compatibility" - параметр COMPATIBLE в файле параметров нового экземпляра базы должен соответствовать (не быть ниже) свойству дисковой группы ASM.

  • ORA-17502: ksfdcre:4 Failed to create file +ASM_GROUP_NAME
  • ORA-15001: diskgroup "ASM_GROUP_NAME" does not exist or is not mounted
  • ORA-15204: database version 00.o.0.0.0 is incompatible with diskgroup ASM_GROUP_NAME
  • ............... == Книга Премудрости Иисуса, сына Сирахова == ..................
    === Глава 1, Стих 13 ===
    13 Боящемуся  Господа  благо  будет  напоследок,  и  в  день  смерти  своей   он
       получит благословение. Страх Господень -  дар  от  Господа  и  поставляет  на
       стезях любви.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@db07 ~]$ cat $ORACLE_HOME/dbs/initRACCLONE.ora
    DB_NAME=RACCLONE
    DB_DOMAIN=localdomain
    CLUSTER_DATABASE=FALSE
    CONTROL_FILES='+SLOW_DG','+FAST_DG'
    DB_CREATE_FILE_DEST='+FAST_DG'
    DB_RECOVERY_FILE_DEST='+SLOW_DG'
    DB_RECOVERY_FILE_DEST_SIZE=2G
    COMPATIBLE=00.o.0.1.0
    [oracle@db07 ~]$
    
    [oracle@db07 oracle]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Fri Mar 29 22:52:48 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    SQL> startup nomount
    ORACLE instance started.
    
    Total System Global Area  384200704 bytes
    Fixed Size                  2287920 bytes
    Variable Size             322963152 bytes
    Database Buffers           50331648 bytes
    Redo Buffers                8617984 bytes
    SQL> Disconnected from Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit
    With the Partitioning, Real Application Clusters, OLAP, Advanced Analytics
    and Real Application Testing options
    [oracle@db07 oracle]$
    

    Запустив процессы нового экземпляра-клона "RACCLONE", мы можем начать восстановление данных из сжатой резервной копии, используя уже знакомую нам команду RMAN DUPLICATE:

    ............. == Послание к Римлянам святого апостола Павла == .................
    === Глава 10, Стих 10 ===
    9 Ибо если устами твоими будешь исповедывать Иисуса  Господом  и  сердцем  твоим
      веровать, что Бог воскресил Его из мертвых, то спасешься,
    10 потому что сердцем веруют к праведности, а  устами  исповедуют  ко  спасению.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@db07 oracle]$ rman
    
    Recovery Manager: Release 00.o.0.1.0 - Production on Fri Mar 29 22:54:30 2013
    
    Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
    
    RMAN> connect auxiliary /
    
    connected to auxiliary database: RACCLONE (not mounted)
    
    RMAN> 
    RMAN> duplicate database to 'RACCLONE' 
    2> backup location '/u01/app/oracle/fra/DB/backupset/2013_03_29';
    
    Starting Duplicate Db at 29-MAR-13
    
    contents of Memory Script:
    {
       sql clone "create spfile from memory";
    }
    executing Memory Script
    
    sql statement: create spfile from memory
    
    contents of Memory Script:
    {
       shutdown clone immediate;
       startup clone nomount;
    }
    executing Memory Script
    
    Oracle instance shut down
    
    connected to auxiliary database (not started)
    Oracle instance started
    
    Total System Global Area     384200704 bytes
    
    Fixed Size                     2287920 bytes
    Variable Size                322963152 bytes
    Database Buffers              50331648 bytes
    Redo Buffers                   8617984 bytes
    
    contents of Memory Script:
    {
       sql clone "alter system set  control_files = 
      ''+SLOW_DG/RACCLONE/CONTROLFILE/current.273.811379081'', 
      ''+FAST_DG/RACCLONE/CONTROLFILE/current.294.811379083'' comment=
     ''Set by RMAN'' scope=spfile";
       sql clone "alter system set  db_name = 
     ''DB'' comment=
     ''Modified by RMAN duplicate'' scope=spfile";
       sql clone "alter system set  db_unique_name = 
     ''RACCLONE'' comment=
     ''Modified by RMAN duplicate'' scope=spfile";
       shutdown clone immediate;
       startup clone force nomount
       restore clone primary controlfile from  
       '/u01/app/oracle/fra/DB/backupset/2013_03_29/o1_mf_ncsnf_TAG20130329T041213_8ob55qg4_.bkp';
       alter clone database mount;
    }
    executing Memory Script
    
    sql statement: alter system set  control_files =   
     ''+SLOW_DG/RACCLONE/CONTROLFILE/current.273.811379081'', 
     ''+FAST_DG/RACCLONE/CONTROLFILE/current.294.811379083'' 
     comment= ''Set by RMAN'' scope=spfile
    
    sql statement: alter system set  db_name =  ''DB'' 
     comment= ''Modified by RMAN duplicate'' scope=spfile
    
    sql statement: alter system set  db_unique_name =  ''RACCLONE'' 
     comment= ''Modified by RMAN duplicate'' scope=spfile
    
    Oracle instance shut down
    
    Oracle instance started
    
    Total System Global Area     384200704 bytes
    
    Fixed Size                     2287920 bytes
    Variable Size                322963152 bytes
    Database Buffers              50331648 bytes
    Redo Buffers                   8617984 bytes
    
    Starting restore at 29-MAR-13
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=267 device type=DISK
    
    channel ORA_AUX_DISK_1: restoring control file
    channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:04
    output file name=+SLOW_DG/RACCLONE/CONTROLFILE/current.273.811379081
    output file name=+FAST_DG/RACCLONE/CONTROLFILE/current.294.811379083
    Finished restore at 29-MAR-13
    
    database mounted
    released channel: ORA_AUX_DISK_1
    allocated channel: ORA_AUX_DISK_1
    channel ORA_AUX_DISK_1: SID=267 device type=DISK
    
    contents of Memory Script:
    {
       set newname for clone datafile  1 to new;
       set newname for clone datafile  2 to new;
       set newname for clone datafile  3 to new;
       set newname for clone datafile  4 to new;
       set newname for clone datafile  5 to new;
       restore
       clone database
       ;
    }
    executing Memory Script
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    executing command: SET NEWNAME
    
    Starting restore at 29-MAR-13
    using channel ORA_AUX_DISK_1
    
    channel ORA_AUX_DISK_1: starting datafile backup set restore
    channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
    channel ORA_AUX_DISK_1: restoring datafile 00001 to +FAST_DG
    channel ORA_AUX_DISK_1: restoring datafile 00002 to +FAST_DG
    channel ORA_AUX_DISK_1: restoring datafile 00003 to +FAST_DG
    channel ORA_AUX_DISK_1: restoring datafile 00004 to +FAST_DG
    channel ORA_AUX_DISK_1: restoring datafile 00005 to +FAST_DG
    channel ORA_AUX_DISK_1: reading from backup piece 
     /u01/app/oracle/fra/DB/backupset/2013_03_29/o1_mf_nnndf_TAG20130329T041213_8ob54x8x_.bkp
    channel ORA_AUX_DISK_1: piece handle=
     /u01/app/oracle/fra/DB/backupset/2013_03_29/o1_mf_nnndf_TAG20130329T041213_8ob54x8x_.bkp 
     tag=TAG20130329T041213
    channel ORA_AUX_DISK_1: restored backup piece 1
    channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:36
    Finished restore at 29-MAR-13
    
    contents of Memory Script:
    {
       switch clone datafile all;
    }
    executing Memory Script
    
    datafile 1 switched to datafile copy
    input datafile copy RECID=6 STAMP=811379151 file 
     name=+FAST_DG/RACCLONE/DATAFILE/system.298.811379119
    datafile 2 switched to datafile copy
    input datafile copy RECID=7 STAMP=811379151 file 
     name=+FAST_DG/RACCLONE/DATAFILE/sysaux.297.811379117
    datafile 3 switched to datafile copy
    input datafile copy RECID=8 STAMP=811379151 file 
     name=+FAST_DG/RACCLONE/DATAFILE/undotbs1.296.811379117
    datafile 4 switched to datafile copy
    input datafile copy RECID=9 STAMP=811379151 file 
     name=+FAST_DG/RACCLONE/DATAFILE/users.299.811379119
    datafile 5 switched to datafile copy
    input datafile copy RECID=10 STAMP=811379151 file 
     name=+FAST_DG/RACCLONE/DATAFILE/soe.295.811379117
    
    contents of Memory Script:
    {
       recover
       clone database
       noredo
        delete archivelog
       ;
    }
    executing Memory Script
    
    Starting recover at 29-MAR-13
    using channel ORA_AUX_DISK_1
    
    Finished recover at 29-MAR-13
    Oracle instance started
    
    Total System Global Area     384200704 bytes
    
    Fixed Size                     2287920 bytes
    Variable Size                322963152 bytes
    Database Buffers              50331648 bytes
    Redo Buffers                   8617984 bytes
    
    contents of Memory Script:
    {
       sql clone "alter system set  db_name = 
     ''RACCLONE'' comment=
     ''Reset to original value by RMAN'' scope=spfile";
       sql clone "alter system reset  db_unique_name scope=spfile";
    }
    executing Memory Script
    
    sql statement: alter system set  db_name =  ''RACCLONE'' 
     comment= ''Reset to original value by RMAN'' scope=spfile
    
    sql statement: alter system reset  db_unique_name scope=spfile
    Oracle instance started
    
    Total System Global Area     384200704 bytes
    
    Fixed Size                     2287920 bytes
    Variable Size                322963152 bytes
    Database Buffers              50331648 bytes
    Redo Buffers                   8617984 bytes
    sql statement: CREATE CONTROLFILE REUSE SET DATABASE "RACCLONE" RESETLOGS NOARCHIVELOG 
      MAXLOGFILES     16
      MAXLOGMEMBERS      2
      MAXDATAFILES      400
      MAXINSTANCES     8
      MAXLOGHISTORY      876
     LOGFILE
      GROUP   1  SIZE 50 M ,
      GROUP   2  SIZE 50 M ,
      GROUP   3  SIZE 50 M 
     DATAFILE
      '+FAST_DG/RACCLONE/DATAFILE/system.298.811379119'
     CHARACTER SET AL32UTF8
    
    
    contents of Memory Script:
    {
       set newname for clone tempfile  1 to new;
       switch clone tempfile all;
       catalog clone datafilecopy  "+FAST_DG/RACCLONE/DATAFILE/sysaux.297.811379117", 
     "+FAST_DG/RACCLONE/DATAFILE/undotbs1.296.811379117", 
     "+FAST_DG/RACCLONE/DATAFILE/users.299.811379119", 
     "+FAST_DG/RACCLONE/DATAFILE/soe.295.811379117";
       switch clone datafile all;
    }
    executing Memory Script
    
    executing command: SET NEWNAME
    
    renamed tempfile 1 to +FAST_DG in control file
    
    cataloged datafile copy
    datafile copy file 
     name=+FAST_DG/RACCLONE/DATAFILE/sysaux.297.811379117 RECID=1 STAMP=811379172
    cataloged datafile copy
    datafile copy file 
     name=+FAST_DG/RACCLONE/DATAFILE/undotbs1.296.811379117 RECID=2 STAMP=811379172
    cataloged datafile copy
    datafile copy file 
     name=+FAST_DG/RACCLONE/DATAFILE/users.299.811379119 RECID=3 STAMP=811379172
    cataloged datafile copy
    datafile copy file 
     name=+FAST_DG/RACCLONE/DATAFILE/soe.295.811379117 RECID=4 STAMP=811379172
    
    datafile 2 switched to datafile copy
    input datafile copy RECID=1 STAMP=811379172 file 
     name=+FAST_DG/RACCLONE/DATAFILE/sysaux.297.811379117
    datafile 3 switched to datafile copy
    input datafile copy RECID=2 STAMP=811379172 file 
     name=+FAST_DG/RACCLONE/DATAFILE/undotbs1.296.811379117
    datafile 4 switched to datafile copy
    input datafile copy RECID=3 STAMP=811379172 file 
     name=+FAST_DG/RACCLONE/DATAFILE/users.299.811379119
    datafile 5 switched to datafile copy
    input datafile copy RECID=4 STAMP=811379172 file 
     name=+FAST_DG/RACCLONE/DATAFILE/soe.295.811379117
    
    contents of Memory Script:
    {
       Alter clone database open resetlogs;
    }
    executing Memory Script
    
    database opened
    Cannot remove created server parameter file	-- база данных ещё не кластеризована
    Finished Duplicate Db at 29-MAR-13
    
    RMAN> exit
    
    Recovery Manager complete.
    [oracle@db07 oracle]$ 
    

    Переместим spfile на ASM:

    ........................... == Притчи Соломона == ..............................
    === Глава 23, Стих 4 ===
    4 Не  заботься  о  том,  чтобы  нажить  богатство;  оставь  такие  мысли   твои.
    
    (b+/b-, c+/c-, +/-, *) >
    [oracle@db07 oracle]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Fri Mar 29 23:07:44 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    
    Connected to:
    Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Advanced Analytics and Real Application Testing options
    
    SQL> show parameter pfile
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      /u01/app/oracle/product/db00o/
                                                     dbs/spfileRACCLONE.ora
    SQL>SQL> create pfile from spfile;
    
    File created.
    
    SQL> create spfile='+FAST_DG' from pfile;
    
    File created.
    
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> exit
    
    -- В другой сессии установите SID для ASM и найдите имя spfile, используя "asmcmd" :
    ...
    ASMCMD> pwd
    +FAST_DG/RACCLONE/PARAMETERFILE
    ASMCMD> ls
    spfile.304.811379423
    ASMCMD>
    
    -- Удалите /u01/app/oracle/product/db00o/dbs/spfileRACCLONE.ora.
    -- Отредактируйте локальный pfile и перезапустите экземпляр:
    [oracle@db07 oracle]$ rm $ORACLE_HOME/dbs/spfileRACCLONE.ora
    [oracle@db07 oracle]$ mv $ORACLE_HOME/dbs/initRACCLONE.ora /var/tmp/initRACCLONE.ora
    [oracle@db07 oracle]$ cat $ORACLE_HOME/dbs/initRACCLONE.ora
    SPFILE='+FAST_DG/RACCLONE/PARAMETERFILE/spfile.304.811379423'
    [oracle@db07 oracle]$
    [oracle@db07 oracle]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Fri Mar 29 23:32:12 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    SQL> startup
    ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance
    ORACLE instance started.
    
    Total System Global Area  384200704 bytes
    Fixed Size                  2287920 bytes
    Variable Size             322963152 bytes
    Database Buffers           50331648 bytes
    Redo Buffers                8617984 bytes
    Database mounted.
    Database opened.
    SQL>
    
    -- Удалите "deprecated parameters", они указаны в alert log нашей новой базы:
    
    [oracle@db07 ~]$ tail -400f \
    > $ORACLE_BASE/diag/rdbms/racclone/RACCLONE/trace/alert_RACCLONE.log| grep -v "^NOTE:"
    ...
    Deprecated system parameters with specified values:
      background_dump_dest
      user_dump_dest
    End of deprecated system parameter listing
    ...
    
    SQL> show parameter spfile
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      +FAST_DG/RACCLONE/PARAMETERFIL
                                                     E/spfile.304.811379423
    SQL> show parameter background_dump_dest
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    background_dump_dest                 string      /u01/app/oracle/diag/rdbms/rac
                                                     clone/RACCLONE/trace
    SQL> alter system reset background_dump_dest scope=spfile;
    
    System altered.
    
    SQL> alter system reset user_dump_dest scope=spfile;
    
    System altered.
    
    SQL> startup force
    ORACLE instance started.
    
    Total System Global Area  384200704 bytes
    Fixed Size                  2287920 bytes
    Variable Size             322963152 bytes
    Database Buffers           50331648 bytes
    Redo Buffers                8617984 bytes
    Database mounted.
    Database opened.
    SQL>
    ...
    -- проверим, что наша база по-прежнему остаётся некластерной:
    SQL> l
      1  select THREAD#, STATUS, GROUPS, INSTANCE, SEQUENCE#, CURRENT_GROUP#
      2* from v$thread
    SQL> /
    
       THREAD# STATUS     GROUPS INSTANCE              SEQUENCE# CURRENT_GROUP#
    ---------- ------ ---------- -------------------- ---------- --------------
             1 OPEN            3 RACCLONE                      5              2
    

    Итак, основная (и уже хорошо знакомая нам) часть работы выполнена - девелоперская база "DB" была клонирована в новую базу "RACCLONE" с помощью RMAN DUPLICATE, база открыта и уже может быть использована пользователями. Но "RACCLONE" по-прежнему имеет только один экземпляр. Теперь нам предстоит её "кластеризация" - включение дополнительных "redo threads". Естественно, мы должны установить некоторые параметры, делающие из нашей базы "RACCLONE" настоящую "RAC database":

    SQL> show parameter cluster_
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    cluster_database                     boolean     FALSE
    cluster_database_instances           integer     1
    cluster_interconnects                string
    SQL> alter system set cluster_database=TRUE scope=spfile;
    
    System altered.
    
    SQL> alter system set cluster_database_instances=8 scope=spfile;
    
    System altered.
    
    SQL>
    
    SQL> show parameter instance
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    active_instance_count                integer
    cluster_database_instances           integer     1
    instance_groups                      string
    instance_name                        string      RACCLONE
    instance_number                      integer     0
    instance_type                        string      RDBMS
    open_links_per_instance              integer     4
    parallel_instance_group              string
    parallel_server_instances            integer     1
    SQL>
    

    Имя нашего экземпляра не соответствует кластерной концепции - каждый из восьми узлов должен выполнять экземпляры той же самой базы данных, но с разными именами экземпляра от "RACCLONE1" до "RACCLONE8". Изменим имена экземпляров:

    -- Для каждого из 8 экземпляров; изменения вступят в силу после рестарта.
    -- Все эти команды выполняются из одной и той же сессии, на одном узле.
    -- Это возможно из-за использования "sid=..." в каждой команде.
    
    SQL> alter system set instance_name=RACCLONE1 scope=spfile sid='RACCLONE1';
    
    System altered.
    
    SQL> alter system set instance_number=1 scope=spfile sid='RACCLONE1';
    
    System altered.
    
    SQL> alter system set thread=1 scope=spfile sid='RACCLONE1';
    
    System altered.
    
    SQL> alter system set undo_tablespace=undots1 scope=spfile sid='RACCLONE1';
    
    System altered.
    
    SQL> 
    ...
    SQL> c/7/8
      1* alter system set instance_number=8 scope=spfile sid='RACCLONE7'
    SQL> c/7/8
      1* alter system set instance_number=8 scope=spfile sid='RACCLONE8'
    SQL> /
    
    System altered.
    
    SQL> 
    ...
    SQL> c/7/8
      1* alter system set undo_tablespace=undots8 scope=spfile sid='RACCLONE7'
    SQL> c/7/8
      1* alter system set undo_tablespace=undots8 scope=spfile sid='RACCLONE8'
    SQL> /
    
    System altered.
    
    SQL> 
    QL> create undo tablespace undots1;
    
    Tablespace created.
    
    SQL> c/1/2
      1* create undo tablespace undots2
    SQL> /
    
    Tablespace created.
    
    SQL> 
    ...
    SQL> c/7/8
      1* create undo tablespace undots8
    SQL> /
    
    Tablespace created.
    
    ...
    SQL> l
      1  select file_name, bytes
      2  from dba_data_files
      3  where tablespace_name like '%UNDO%'
      4* order by 1
    SQL> /
    
    FILE_NAME						     BYTES
    ------------------------------------------------------- ----------
    +FAST_DG/RACCLONE/DATAFILE/undotbs1.296.811379117	1153433600	-- удалим позже
    +FAST_DG/RACCLONE/DATAFILE/undots1.305.811382881	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots2.306.811382887	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots3.307.811382903	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots4.308.811382905	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots5.309.811382909	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots6.310.811382911	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots7.311.811382915	 104857600
    +FAST_DG/RACCLONE/DATAFILE/undots8.312.811382919	 104857600
    
    9 rows selected.
    
    SQL> 
    -- включаем дополнительные redo threads
      1  select THREAD#, count(*), max(GROUP#)
      2  from v$log
      3* group by THREAD#
    SQL> /
    
       THREAD#   COUNT(*) MAX(GROUP#)
    ---------- ---------- -----------
    	 1	    3		3
    
    SQL> 
    SQL> alter database add logfile thread 2 group 4;
    
    Database altered.
    
    SQL> c/4/5
      1* alter database add logfile thread 2 group 5
    SQL> /
    
    Database altered.
    
    SQL> c/5/6
      1* alter database add logfile thread 2 group 6
    SQL> /
    
    Database altered.
    
    SQL> 
    ...
      1  select THREAD#, count(*), min(GROUP#), max(GROUP#)
      2  from v$log
      3  group by thread#
      4* order by thread#
    SQL> /
    
       THREAD#   COUNT(*) MIN(GROUP#) MAX(GROUP#)
    ---------- ---------- ----------- -----------
    	 1	    3		1	    3
    	 2	    3		4	    6
    	 3	    3		7	    9
    	 4	    3	       10	   12
    	 5	    3	       13	   15
    	 6	    3	       16	   18
    	 7	    3	       19	   21
    	 8	    3	       22	   24
    
    8 rows selected.
    
    -- теперь наша база должна иметь 2 экземпляра ...
    SQL> alter database enable public thread 2;
    
    Database altered.
    
    SQL> 
    ...
    
    SQL> l
      1  select THREAD#, STATUS, GROUPS, INSTANCE, SEQUENCE#, CURRENT_GROUP#
      2* from v$thread
    SQL> /
    
       THREAD# STATUS     GROUPS INSTANCE			SEQUENCE# CURRENT_GROUP#
    ---------- ------ ---------- ------------------------- ---------- --------------
    	 1 OPEN 	   3 RACCLONE				5	       2
    	 2 CLOSED	   3 UNNAMED_INSTANCE_2 		1	       4
    	 3 CLOSED	   3 UNNAMED_INSTANCE_3 		1	       7
    	 4 CLOSED	   3 UNNAMED_INSTANCE_4 		1	      10
    	 5 CLOSED	   3 UNNAMED_INSTANCE_5 		1	      13
    	 6 CLOSED	   3 UNNAMED_INSTANCE_6 		1	      16
    	 7 CLOSED	   3 UNNAMED_INSTANCE_7 		1	      19
    	 8 CLOSED	   3 UNNAMED_INSTANCE_8 		1	      22
    
    8 rows selected.
    
    -- завершение работы некластеризованного экземпляра.
    SQL> shutdown
    

    Все параметры в spfile были изменены. Мы "включили" дополнительные "потоки" и создали для них необходимые файлы, и завершили работу некластерного экземпляра "RACCLONE" имеющего "non-RAC" SID. Теперь каждый экземпляр должен запускаться строго на соответствующем узле.

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

    -- Важно: Установите SID для ASM!
    ...
    [oracle@db07 ~]$ asmcmd
    ASMCMD> cp +FAST_DG/RACCLONE/PARAMETERFILE/spfile.304.811379423 /tmp/spfile.304.811379423                                                      
    copying +FAST_DG/RACCLONE/PARAMETERFILE/spfile.304.811379423 -> /tmp/spfile.304.811379423
    ASMCMD> exit
    [oracle@db07 ~]$
    [oracle@db07 ~]$ strings /tmp/spfile.304.811379423 | grep  -v "^\*\.\_"
    ...
    *.cluster_database=TRUE
    *.cluster_database_instances=8
    *.db_domain='localdomain'
    *.db_name='RACCLONE'#Reset to original value by RMAN
    ...
    RACCLONE1.instance_name='RACCLONE1'
    RACCLONE2.instance_name='RACCLONE2'
    RACCLONE3.instance_name='RACCLONE3'
    RACCLONE4.instance_name='RACCLONE4'
    RACCLONE5.instance_name='RACCLONE5'
    RACCLONE6.instance_name='RACCLONE6'
    RACCLONE7.instance_name='RACCLONE7'
    RACCLONE8.instance_name='RACCLONE8'
    RACCLONE1.instance_number=1
    RACCLONE2.instance_number=2
    RACCLONE3.instance_number=3
    RACCLONE4.instance_number=4
    RACCLONE5.instance_number=5
    RACCLONE6.instance_number=6
    RACCLONE7.instance_number=7
    RACCLONE8.instance_number=8
    ...
    RACCLONE1.thread=1
    RACCLONE2.thread=2
    RACCLONE3.thread=3
    RACCLONE4.thread=4
    RACCLONE5.thread=5
    RACCLONE6.thread=6
    RACCLONE7.thread=7
    RACCLONE8.thread=8
    RACCLONE1.undo_tablespace='UNDOTS1'
    RACCLONE2.undo_tablespace='UNDOTS2'
    RACCLONE3.undo_tablespace='UNDOTS3'
    RACCLONE4.undo_tablespace='UNDOTS4'
    RACCLONE5.undo_tablespace='UNDOTS5'
    RACCLONE6.undo_tablespace='UNDOTS6'
    RACCLONE7.undo_tablespace='UNDOTS7'
    RACCLONE8.undo_tablespace='UNDOTS8'
    ...
    

    Как видим, spfile тоже можно "читать". Попробуем запустить экземпляр с номером 1 на узле с номером 7. Это возможно, но неправильно. Как я сказал прежде, экземпляр с номером 1 ожидается на узле 1 и т.п. Но нам надо всего лишь быстро проверить функциональность базы с нашим новым spfile:

    -- Запускаем экземпяр с номером 1 - его имя должно быть "RACCLONE1":
    [oracle@db07 oracle]$ export ORACLE_SID=RACCLONE1
    [oracle@db07 oracle]$ mv $ORACLE_HOME/dbs/initRACCLONE.ora $ORACLE_HOME/dbs/initRACCLONE1.ora
    [oracle@db07 oracle]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Sat Mar 30 00:48:58 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  405094400 bytes
    Fixed Size		    2288112 bytes
    Variable Size		  339740176 bytes
    Database Buffers	   50331648 bytes
    Redo Buffers		   12734464 bytes
    Database mounted.
    Database opened.
    SQL> 
    SQL> l
      1  select THREAD#, STATUS, GROUPS, INSTANCE, SEQUENCE#, CURRENT_GROUP#
      2* from v$thread
    SQL> /
    
       THREAD# STATUS     GROUPS INSTANCE		      SEQUENCE# CURRENT_GROUP#
    ---------- ------ ---------- ----------------------- ---------- --------------
    	 1 OPEN 	   3 RACCLONE1			      5 	     2
    	 2 CLOSED	   3 UNNAMED_INSTANCE_2 -- новые      1 	     4
    	 3 CLOSED	   3 UNNAMED_INSTANCE_3 	      1 	     7
    	 4 CLOSED	   3 UNNAMED_INSTANCE_4 	      1 	    10
    	 5 CLOSED	   3 UNNAMED_INSTANCE_5 	      1 	    13
    	 6 CLOSED	   3 UNNAMED_INSTANCE_6 	      1 	    16
    	 7 CLOSED	   3 UNNAMED_INSTANCE_7 	      1 	    19
    	 8 CLOSED	   3 UNNAMED_INSTANCE_8 	      1 	    22
    
    8 rows selected.
    
    SQL> 
    SQL> drop tablespace undotbs1; -- старый "некластерный" контейнер удалён.
    
    Tablespace dropped.
    
    SQL>  exit
    

    Добавим строки в "oratab" файл, создадим файл паролей и проверим регистрацию с listener:

    -- Добавим записи в /etc/oratab файл:
    [oracle@db07 ~]$ tail -2 /etc/oratab 
    RACCLONE:/u01/app/oracle/product/db00o:N:
    RACCLONE1:/u01/app/oracle/product/db00o:N:
    [oracle@db07 ~]$ 
    
    -- создадим новый password файл:
    [oracle@db07 ~]$ cd $ORACLE_HOME/dbs
    [oracle@db07 dbs]$ orapwd file=orapwRACCLONE1 password=oracle
    
    -- Проверим возможность удалённого подключения:
    [oracle@db07 dbs]$ lsnrctl stat
    
    LSNRCTL for Linux: Version 00.o.0.1.0 - Production on 30-MAR-2013 02:27:25
    
    Copyright (c) 1991, 2012, Oracle.  All rights reserved.
    
    Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 00.o.0.1.0 - Production
    Start Date                29-MAR-2013 02:33:26
    Uptime                    0 days 23 hr. 53 min. 58 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/grid/gi00.o/network/admin/oracle/listener.ora
    Listener Log File         /u01/app/oracle/diag/tnslsnr/db07/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.1.1.218)(PORT=1521)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.1.1.47)(PORT=1521)))
    Services Summary...
    Service "+ASM" has 1 instance(s).
      Instance "+ASM7", status READY, has 1 handler(s) for this service...
    Service "RACCLONE.localdomain" has 1 instance(s).
      Instance "RACCLONE1", status READY, has 1 handler(s) for this service...
    The command completed successfully
    [oracle@db07 dbs]$ sqlplus sys/oracle@//10.1.1.218:1521/RACCLONE.localdomain as sysdba
    
    SQL*Plus: Release 00.o.0.1.0 Production on Sat Mar 30 02:31:00 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Advanced Analytics and Real Application Testing options
    
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> Disconnected from Oracle Database 00o Enterprise Edition Release 00.o.0.1.0 - 64bit
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Advanced Analytics and Real Application Testing options
    [oracle@db07 dbs]$ 
    

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

    -- скопируем локальные pfile и password file на все узлы кластера:
    [oracle@db07 dbs]$ tail -2 /etc/oratab
    RACCLONE:/u01/app/oracle/product/db00o:N:
    RACCLONE7:/u01/app/oracle/product/db00o:N:      -- было RACCLONE1
    [oracle@db07 dbs]$
    
    -- исправим несоответствие переименованием экземпляра
    [oracle@db07 dbs]$ mv initRACCLONE1.ora initRACCLONE7.ora 
    [oracle@db07 dbs]$ mv orapwRACCLONE1 orapwRACCLONE7
    [oracle@db07 dbs]$ rm hc_RACCLONE1.dat hc_RACCLONE.dat
    
    [dbs]$ scp initRACCLONE7.ora db01:/u01/app/oracle/product/db00o/dbs/initRACCLONE1.ora
    initRACCLONE7.ora                                       100%   62     0.1KB/s   00:00
    [dbs]$ scp initRACCLONE7.ora db02:/u01/app/oracle/product/db00o/dbs/initRACCLONE2.ora
    initRACCLONE7.ora                                       100%   62     0.1KB/s   00:00
    [dbs]$
    ...
    [dbs]$ scp initRACCLONE7.ora db08:/u01/app/oracle/product/db00o/dbs/initRACCLONE8.ora
    initRACCLONE7.ora                                       100%   62     0.1KB/s   00:00
    [dbs]$
    ...
    [oracle@db07 dbs]$ scp orapwRACCLONE7 db01:/u01/app/oracle/product/db00o/dbs/orapwRACCLONE1
    orapwRACCLONE7                                                100% 7680     7.5KB/s   00:00
    [oracle@db07 dbs]$ scp orapwRACCLONE7 db02:/u01/app/oracle/product/db00o/dbs/orapwRACCLONE2
    orapwRACCLONE7                                                100% 7680     7.5KB/s   00:00
    [oracle@db07 dbs]$
    ...
    [oracle@db07 dbs]$ scp orapwRACCLONE7 db08:/u01/app/oracle/product/db00o/dbs/orapwRACCLONE8
    orapwRACCLONE7                                                100% 7680     7.5KB/s   00:00
    [oracle@db07 dbs]$
    

    Настал решающий момент - заходим на каждый узел кластера и запускаем на нём экземпляр с соответствующим именем:

    ......................... == Книга пророка Ионы == .............................
    === Глава 2, Стих 11 ===
    9 Чтущие   суетных   и   ложных   _богов_   оставили    Милосердаго      своего,
    10 а я гласом  хвалы  принесу  Тебе  жертву;  что  обещал,  исполню:  у  Господа
      спасение!
    11 И    сказал    Господь    киту,    и    он    изверг    Иону    на      сушу.
    
    (b+/b-, c+/c-, +/-, *) > 
    [oracle@db07 dbs]$ ssh db01
    Last login: Wed Jan 16 06:49:51 2013 from db07.localdomain
    [oracle@db01 ~]$ echo "RACCLONE:/u01/app/oracle/product/db00o:N:" >>/etc/oratab 
    [oracle@db01 ~]$ . oraenv
    ORACLE_SID = [oracle] ? RACCLONE
    The Oracle base has been set to /u01/app/oracle
    [oracle@db01 ~]$ export ORACLE_SID=RACCLONE1
    [oracle@db01 ~]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Sat Mar 30 02:41:44 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  405094400 bytes
    Fixed Size		    2288112 bytes
    Variable Size		  339740176 bytes
    Database Buffers	   50331648 bytes
    Redo Buffers		   12734464 bytes
    Database mounted.
    Database opened.
    SQL> select inst_id, INSTANCE_NAME, HOST_NAME, STATUS, THREAD#, LOGINS
      2  from gv$instance;
    
       INST_ID INSTANCE_NAME    HOST_NAME			   STATUS	   THREAD# LOGINS
    ---------- ---------------- ------------------------------ ------------ ---------- ----------
    	 1 RACCLONE1	    db01.localdomain	   	   OPEN 		 1 ALLOWED
    
    SQL> 
    
    -- Один экземпляр уже открыт для пользователей, запущен на узле с номером 1.
    ...
    [oracle@db07 dbs]$ ssh db08
    Last login: Fri Jan 18 02:45:19 2013 from 10.191.130.200
    [oracle@db08 ~]$ echo "RACCLONE:/u01/app/oracle/product/db00o:N:" >>/etc/oratab
    [oracle@db08 ~]$ . oraenv
    ORACLE_SID = [RACCLONE8] ? RACCLONE
    The Oracle base has been set to /u01/app/oracle
    [oracle@db08 ~]$ export ORACLE_SID=RACCLONE8
    [oracle@db08 ~]$ sqlplus
    
    SQL*Plus: Release 00.o.0.1.0 Production on Sat Mar 30 03:16:08 2013
    
    Copyright (c) 1982, 2012, Oracle.  All rights reserved.
    
    Enter user-name: / as sysdba
    Connected to an idle instance.
    
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area  405094400 bytes
    Fixed Size		    2288112 bytes
    Variable Size		  339740176 bytes
    Database Buffers	   50331648 bytes
    Redo Buffers		   12734464 bytes
    Database mounted.
    Database opened.
    SQL> 
    SQL> l
      1  select inst_id, INSTANCE_NAME, HOST_NAME, STATUS, THREAD#, LOGINS
      2  from gv$instance
      3* order by 1
    SQL> /
    
       INST_ID INSTANCE_NAME    HOST_NAME		  STATUS    THREAD# LOGINS
    ---------- ---------------- ---------------- ----------- ---------- -------
    	 1 RACCLONE1	    db01.localdomain	    OPEN	  1 ALLOWED
    	 2 RACCLONE2	    db02.localdomain	    OPEN	  2 ALLOWED
    	 3 RACCLONE3	    db03.localdomain	    OPEN	  3 ALLOWED
    	 4 RACCLONE4	    db04.localdomain	    OPEN	  4 ALLOWED
    	 5 RACCLONE5	    db05.localdomain	    OPEN	  5 ALLOWED
    	 6 RACCLONE6	    db06.localdomain	    OPEN	  6 ALLOWED
    	 7 RACCLONE7	    db07.localdomain	    OPEN	  7 ALLOWED
    	 8 RACCLONE8	    db08.localdomain	    OPEN	  8 ALLOWED
    
    8 rows selected.
    
    -- Пользователи могут использовать все 8 узлов.
    SQL> 
    SQL> l
      1  select THREAD#, STATUS, GROUPS, INSTANCE, SEQUENCE#, CURRENT_GROUP#
      2  from v$thread
      3* order by 1
    SQL> /
    
       THREAD# STATUS     GROUPS INSTANCE		   SEQUENCE# CURRENT_GROUP#
    ---------- ------ ---------- -------------------- ---------- --------------
    	 1 OPEN 	   3 RACCLONE1			   5		  2
    	 2 OPEN 	   3 RACCLONE2			   1		  4
    	 3 OPEN 	   3 RACCLONE3			   1		  7
    	 4 OPEN 	   3 RACCLONE4			   1		 10
    	 5 OPEN 	   3 RACCLONE5			   1		 13
    	 6 OPEN 	   3 RACCLONE6			   1		 16
    	 7 OPEN 	   3 RACCLONE7			   1		 19
    	 8 OPEN 	   3 RACCLONE8			   1		 22
    
    8 rows selected.
    
    SQL> 
    

    Для полноценной "кластеризации" базы необходимо запустить дополнительный скрипт, создающий специальные представления для RAC database. Также увеличим размер области памяти, отведённой под структуры Оракл:

    06:55:19 SQL> alter system set memory_max_target=20G scope=spfile sid='*';
    
    System altered.
    
    Elapsed: 00:00:00.04
    06:55:41 SQL> alter system set memory_target=20G scope=spfile sid='*';
    
    System altered.
    
    Elapsed: 00:00:00.02
    06:55:55 SQL> 
    
    -- Важно! --------
    
    SQL> @?/rdbms/admin/catclust.sql
    ...
    PL/SQL procedure successfully completed.
    
    -- Проверим создание необходимых компонентов:
    ...  
    SQL> l
      1  select comp_id, comp_name, version, status
      2* from dba_registry
    SQL> /
    
    COMP_ID   COMP_NAME                               VERSION     STATUS
    --------- --------------------------------------- ----------  ---------------
    XDB       Oracle XML Database                     00.o.0.1.0  VALID
    CATALOG   Oracle Database Catalog Views           00.o.0.1.0  VALID
    CATPROC   Oracle Database Packages and Types      00.o.0.1.0  VALID
    RAC       Oracle Real Application Clusters        00.o.0.1.0  VALID -- Новый компонент создан.
    
    SQL> select count(*)
      2  from dba_objects
      3  where status != 'VALID';
    
      COUNT(*)
    ----------
    	 0
    
    SQL> 
    

    Самое последнее действие - зарегистрировать новую кластерную базу RACCLONE со всеми её экземплярами в Oracle CRS, для автоматического (ре)старта и избежания необходимости "прыгать" по узлам кластера и запускать экземпляры вручную:

    -- Все операции выполняем на узле с номером 1:
    
    [oracle@db01 ~]$ srvctl add database -db RACCLONE -oraclehome /u01/app/oracle/product/db00o \
    > -domain localdomain -diskgroup "FAST_DG,SLOW_DG" -instance RACCLONE
    [oracle@db01 ~]$ srvctl add instance -db RACCLONE -instance RACCLONE1 -node db01
    ...
    [oracle@db01 ~]$ srvctl add instance -db RACCLONE -instance RACCLONE8 -node db08
    [oracle@db01 ~]$ /u01/grid/gi00.o/bin/crsctl status resource -t
    ...
    ora.racclone.db
          1        OFFLINE OFFLINE                               STABLE
          2        OFFLINE OFFLINE                               STABLE
          3        OFFLINE OFFLINE                               STABLE
          4        OFFLINE OFFLINE                               STABLE
          5        OFFLINE OFFLINE                               STABLE
          6        OFFLINE OFFLINE                               STABLE
          7        OFFLINE OFFLINE                               STABLE
          8        OFFLINE OFFLINE                               STABLE
    ...
    
    --  скажем CRS запустить базу, что автоматически обновит её статус:
    [oracle@db01 ~]$ srvctl start database -d RACCLONE
    [oracle@db01 ~]$ srvctl status database -d RACCLONE
    Instance RACCLONE1 is running on node db01
    Instance RACCLONE2 is running on node db02
    Instance RACCLONE3 is running on node db03
    Instance RACCLONE4 is running on node db04
    Instance RACCLONE5 is running on node db05
    Instance RACCLONE6 is running on node db06
    Instance RACCLONE7 is running on node db07
    Instance RACCLONE8 is running on node db08
    [oracle@db01 ~]$ /u01/grid/gi00.o/bin/crsctl status resource -t
    ...
    ora.racclone.db
          1        ONLINE  ONLINE       db01                 Open,STABLE
          2        ONLINE  ONLINE       db02                 Open,STABLE
          3        ONLINE  ONLINE       db03                 Open,STABLE
          4        ONLINE  ONLINE       db04                 Open,STABLE
          5        ONLINE  ONLINE       db05                 Open,STABLE
          6        ONLINE  ONLINE       db06                 Open,STABLE
          7        ONLINE  ONLINE       db07                 Open,STABLE
          8        ONLINE  ONLINE       db08                 Open,STABLE
    ...
    

    Теперь проверьте логи на каждом узле кластера и сделайте резервную копию. Наша кластерная база готова для тестирования производительности и масштабируемости.

    Простая проверка работоспособности кластерной базы

    Для проверки работы кластерной базы и распределения нагрузки между узлами, я сделаю простой тест. Используя программу SwingBench, я подключу генератор нагрузки к SCAN адресу моего кластера и запущу 1800 пользовательских сессий. Проверим распределение нагрузки - теоретически, даже несмотря на то, что все подключения идут на один "общий" адрес кластера, база должна суметь перераспределить сессии почти равномерно по узлам кластера:

      1  select inst_id, username, count(*)
      2  from gv$session
      3  where username  = 'SOE'
      4  group by inst_id, username
      5* order by 1
    05:52:26 SQL> 
    05:52:27 SQL> /
    
       INST_ID USERNAME			    COUNT(*)
    ---------- ------------------------------ ----------
    	 1 SOE					 200
    	 2 SOE					 200
    	 3 SOE					 300
    	 4 SOE					 200
    	 5 SOE					 200
    	 6 SOE					 200
    	 7 SOE					 300
    	 8 SOE					 200
    
    8 rows selected.
    
    Elapsed: 00:00:00.02
    05:52:27 SQL> 
    

    Итак, поздравим себя - теория совпала с практикой и наша клонированная база данных работает правильно в составе кластера.

    Спасибо что зашли,

    Будьте благословенны!
    Денис

    1 Апреля 2013 года (но всё выше написанное не является первоапрельской шуткой! :-) ).


    Сайт не содержит активных элементов - скриптов и cookies