"Нас Атакуют!" Изобличи козни лукавого, запрети диаволу
Клонирование и кластеризация баз данных Оракл
В процессе разработки и тестирования приложений, работающих с базами данных Оракл, часто возникает необходимость "копирования" существующей базы данных на несколько подобных машин, для тестеров и разработчиков. Также часто необходимо создать "дубликат" последней версии базы для последующего переноса и кластеризации на производственной (либо подобной ей) системе.
При всём обилии документации и публикаций на тему, их подавляющее большинство рассматривает простые случаи "клонирования" некластерных баз данных с одной машины на другую, не описывая подробности всего процесса.
Предлагаемая читателю заметка демонстрирует полный пример достаточно сложного процесса клонирования базы данных на той же машине, её последующего перемещения на удалённый сервер и трансформирования некластерной базы данных в кластерную систему с восемью узлами. Рассматриваются варианты использования Oracle Recovery Manager (RMAN) и ручного клонирования / кластеризации.
Прежде чем мы продолжим, я хотел бы привести строки из Евангелия:
......................... == Книга пророка Исаии == ............................
=== Глава 6, Стих 10 ===
9 И сказал Он: пойди и скажи этому народу: слухом услышите - и не уразумеете,
и очами смотреть будете - и не увидите.
10 Ибо огрубело сердце народа сего, и ушами с трудом слышат, и очи свои
сомкнули, да не узрят очами, и не услышат ушами, и не уразумеют сердцем, и
не обратятся, чтобы Я исцелил их.
Лично для вас благая весть - Единородный Сын Божий Иисус Христос любит вас, Он взошёл на крест за ваши грехи, был распят и на третий день воскрес, сел одесную Бога и открыл нам дорогу в Царствие Небесное.
Читая Библию, мы можем заметить как с давних времён пророки как бы видели сегодняшнее отступление некогда преданных и ревностных в вере славян, подобно израильтянам во дни ропота. Но не все отступили - в самые тяжёлые времена вера в Господа и Его Церковь хранили наши многострадальные народы. Такое время мы переживаем и сейчас. Не разумеем сердцем, не пытаемся увидеть свет Божий, понуря голову плетёмся путём греха на заклание ... Но исцеление рядом. Сбрось с себя ярмо мирской суетности, прочисти уши, продери глаза, обратись сердцем от грехов, через покаяние и раскаяние - и будешь исцелён, по слову Господа, которое не изменяется и не отнимается у нас. Иисус всегда с нами - но ты сам должен сделать шаг навстречу Ему. Сделай его сегодня, брат или сестра!
Покайтесь, примите Иисуса как вашего Спасителя, ибо наступают последние времена и время близко - стоит Судья у ворот.
Пожалуйста, в своих каждодневных трудах, какими бы занятыми вы себе ни казались - находите время для Бога, Его заповедей и Библии.
На главной странице этого сайта вы найдете программу для чтения Библии в командной строке - буду очень рад если программа окажется полезной. Пожалуйста, читайте Библию, на экране или в печатном виде - вы будете искренне удивлены как много там сказано лично про вас и ваши обстоятельства.
Вернёмся к нашим техническим деталям.
Рассмотрим пример из реальной жизни - периодически мне необходимо делать локальную копию основной базы данных, используемой разработчиками для написания приложения. Эта база находится на одном из серверов на резервной площадке. Клон базы в её текущем "релизном" состоянии будет использован тестерами для начальной проверки. Выявленные недоработки будут исправлены в основной базе разработчиков и она будет вновь "скопирована" для работы тестеров. Всё это происходит на одном и том же сервере, для экономии времени.
После того, как тестеры завершат проверки функциональности и признают работу приложения и "релизной" базы данных удовлетворительными, эта же самая "релизная" база должна быть скопирована на кластер на основной площадке для тестирования производительности и масштабируемости. Естественно, что для такой проверки понадобится "конвертировать" некластерную "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".
С этого момента база-клон с новым именем готова к работе с пользователями. Итак, ещё раз и кратко что надо сделать, в общих чертах:
Клонирование некластерной базы на той же машине - 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 выполнил достаточно много разных команд, объединённых в скрипты, для последовательного:
В заключение, добавим имя базы в файл "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Гб:
-- Создадим сжатую резервную копию некластерной базы "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.
............... == Книга Премудрости Иисуса, сына Сирахова == .................. === Глава 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 года (но всё выше написанное не является первоапрельской шуткой! :-) ).