Дублирование базы данных – это процесс создания рабочей копии (дубликата) целевой (основной) базы данных (target database). Полученная при этом новая база данных называется дублированной и может располагаться с основной базой данных на одном или разных хостах. В Oracle дублированная база данных создаётся с помощью утилиты RMAN.
Дублирование обычно осуществляется для того, что бы получить свежую копию базы данных для целей разработки и тестирования. Реже дублирование используется для восстановления объектов и данных основной базы данных и проверки сделанных ранее на ней же резервных копий. Целевая и дублированная базы данных могут иметь различное расположение файлов данных, содержать разные значения инициализационных параметров, обладать различными именами. Некоторые табличные пространства вообще могут отсутствовать в дублированной базе данных.
В RMAN дублированная база данных всегда создаётся из резервной копии, ранее сделанной на целевой базе данных (базовое дублирование). Начиная с одиннадцатой версии Oracle без такой копии можно обойтись. Связано это с появлением альтернативного метода дублирования – активного. При таком способе дублирования файлы данных передаются в онлайн режиме из основной базы данных по сети. Это позволяет не тратить время на создание и копирование резервных копий, но создаёт большую нагрузку на сеть, и увеличивает время выполнения процесса дублирования по сравнению с базовым методом.
Сам по себе процесс дублирования довольно прост и не требует совершения большого количества действий. В основе, он сводится к запуску только одной RMAN команды. Ниже, мы рассмотрим, на примерах, различные варианты осуществления процесса дублирования, а так же попробуем решить возникающие при этом проблемы.
В качестве тестовых мы возьмём две виртуальные машины alfa.alldba.ru и alfa2.alldba.ru с операционными системами Linux CentOS 5.4 и экземплярами базы данных Oracle 10.2. Структура каталогов файловых систем хостов одинакова. Перед нами стоит задача получения рабочего дубликата целевой базы данных хоста alfa.alldba.ru, и размещение его в виртуальной машине alfa2.alldba.ru. Экземпляр Oracle расположенный на хосте alfa2.alldba.ru в дальнейшем будет называться вспомогательным (Auxiliary), и будет иметь только одно предназначение – это помощь в создании дублированной базы данных.
Для простоты примера, файлы Oracle в основной и дублированной базе данных будут иметь у нас одинаковые имена и местоположения, а дублирование будет производиться базовым методом.
Базовое дублирование
Создание резервной копии
Так как дублированная база создаётся из резервной копии основной базы данных, первым делом с помощью RMAN проводим полное резервное копирование целевой базы данных хоста alfa.alldba.ru:
RMAN> backup database; Starting backup at 02-MAR-12 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset input datafile fno=00001 name=/u02/oradata/orcl/system01.dbf input datafile fno=00003 name=/u02/oradata/orcl/sysaux01.dbf input datafile fno=00002 name=/u02/oradata/orcl/undotbs01.dbf input datafile fno=00005 name=/u02/oradata/orcl/example01.dbf input datafile fno=00004 name=/u02/oradata/orcl/users01.dbf channel ORA_DISK_1: starting piece 1 at 02-MAR-12 channel ORA_DISK_1: finished piece 1 at 02-MAR-12 piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG20120 302T092347_7o0svmmk_.bkp tag=TAG20120302T092347 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:06:57 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current control file in backupset including current SPFILE in backupset channel ORA_DISK_1: starting piece 1 at 02-MAR-12 channel ORA_DISK_1: finished piece 1 at 02-MAR-12 piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_ncsnf_TAG20120 302T092347_7o0t8plr_.bkp tag=TAG20120302T092347 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03 Finished backup at 02-MAR-12
В результате проведённого копирования, мы получаем два резервных набора. Первый набор содержит файлы данных. Второй, копию контрольного файла и серверный файл параметров:
RMAN> list backup; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 108 Full 610.20M DISK 00:06:55 02-MAR-12 BP Key: 119 Status: AVAILABLE Compressed: NO Tag: TAG20120302T092347 Piece Name: /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG20120302T092 347_7o0svmmk_.bkp List of Datafiles in backup set 108 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- --------- ---- 1 Full 658208 02-MAR-12 /u02/oradata/orcl/system01.dbf 2 Full 658208 02-MAR-12 /u02/oradata/orcl/undotbs01.dbf 3 Full 658208 02-MAR-12 /u02/oradata/orcl/sysaux01.dbf 4 Full 658208 02-MAR-12 /u02/oradata/orcl/users01.dbf 5 Full 657258 02-MAR-12 /u02/oradata/orcl/example01.dbf BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 109 Full 6.83M DISK 00:00:02 02-MAR-12 BP Key: 120 Status: AVAILABLE Compressed: NO Tag: TAG20120302T092347 Piece Name: /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_ncsnf_TAG20120302T092 347_7o0t8plr_.bkp Control File Included: Ckp SCN: 658245 Ckp time: 02-MAR-12 SPFILE Included: Modification time: 02-MAR-12
Перенос резервной копии
Так как одним из основных требований дублирования является наличие резервных копий и архивных файлов на хосте, где будет создаваться дублированная база данных, нам необходимо перенести полученную копию и архивы на машину alfa2.alldba.ru, соблюдая при этом те же пути расположения файлов в файловой системе, что и на основном хосте. Для переноса будем использовать sft клиент.
Переходим на машину alfa2.alldba.ru и запускаем клиент, в котором подключаемся к хосту alfa.alldba.ru:
alfa.alldba.ru:
[oracle@alfa2 ~]$ sftp alfa.alldba.ru
Connecting to alfa.alldba.ru...
The authenticity of host 'alfa.alldba.ru (190.125.250.200)' can't be
established.
RSA key fingerprint is 81:ab:40:5d:a3:e0:6f:7f:d8:b0:50:40:b9:fb:0e:34.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'alfa.alldba.ru,190.125.250.200' (RSA) to the list
of known hosts.
oracle@alfa.alldba.ru's password:
Переходим на удалённой машине (alfa.alldba.ru) в каталог с файлом резервной копии:
sftp> cd /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/
На локальной машине(alfa2.alldba.ru) создаём в флэш-области восстановления для резервной копии необходимые каталоги:
sftp> lmkdir /u01/app/oracle/flash_recovery_area/ORCL/backupset sftp> lmkdir /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/
Переходим в созданный каталог,проверяем одинаковость путей для резервной копии на обеих машинах и копируем файл резервной копии с alfa.alldba.ru:
sftp> lcd /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/ sftp> pwd Remote working directory: /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02 sftp> lpwd Local working directory: /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02 sftp> mget * Fetching /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_ncsnf_TAG2 0120302T092347_7o0t8plr_.bkp to o1_mf_ncsnf_TAG20120302T092347_7o0t8plr_.bkp /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_ncsnf_TAG2 0120302 100% 7008KB 6.8MB/s 00:01 Fetching /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG2 0120302T092347_7o0svmmk_.bkp to o1_mf_nnndf_TAG20120302T092347_7o0svmmk_.bkp /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG2 0120302T092 100% 610MB 2.9MB/s 03:31 3
Копирование архивных журналов
Для дублирования базы данных, кроме резервной копии нам понадобятся и архивные журналы c целевой базы данных. В соответствии с настройками экземпляра они образуются в следующем каталоге:
sftp> pwd Remote working directory: /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> ls -l -rw-r----- 1 oracle oinstall 3846144 Mar 2 09:42 o1_mf_1_16_7o0ty7cb_.arc -rw-r----- 1 oracle oinstall 532992 Mar 2 09:42 o1_mf_1_17_7o0tyhox_.arc -rw-r----- 1 oracle oinstall 5256704 Mar 2 09:42 o1_mf_1_18_7o0tz0tp_.arc
Скопируем весь каталог 2012_03_02 с машины alfa.alldba.ru на машину alfa2.alldba.ru, не забывая при этом соблюдать одинаковость путей расположения файлов:
sftp> cd /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> lmkdir /u01/app/oracle/flash_recovery_area/ORCL/archivelog sftp> lmkdir /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> lcd /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> pwd sftp> pwd Remote working directory: /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> lpwd Local working directory: /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02 sftp> mget * Fetching /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_16_7o0t y7cb_.arc to o1_mf_1_16_7o0ty7cb_.arc /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_16_7o0t y7cb_.arc 100% 3756KB 1.2MB/s 00:03 Fetching /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_17_7o0t yhox_.arc to o1_mf_1_17_7o0tyhox_.arc /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_17_7o0t yhox_.arc 100% 521KB 520.5KB/s 00:01 Fetching /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_18_7o0t z0tp_.arc to o1_mf_1_18_7o0tz0tp_.arc /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_18_7o0t z0tp_.arc 100% 5134KB 1.7MB/s 00:03 sftp> bye
Старт вспомогательного экземпляра
Непосредственно перед проведением процесса дублирования необходимо перевести экземпляры в нужные состояния. Экземпляр целевой базы данных (Target) на терминале alfa.alldba.ru должен быть обязательно открыт или смонтирован. Вспомогательный (Auxiliary) экземпляр на машине alfa2.alldba.ru должен находиться в несмонтированном режиме:
oracle@alfa2 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.3.0 - Production on Fri Mar 2 05:43:26 2012 Copyright (c) 1982, 2006, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup force nomount; ORACLE instance started. Total System Global Area 285212672 bytes Fixed Size 1261372 bytes Variable Size 268435652 bytes Database Buffers 12582912 bytes Redo Buffers 2932736 bytes
Подключение к экземплярам
Для проведения процесса дублирования нам надо иметь два подключения, одно к экземпляру целевой базы данных, другое к вспомогательному экземпляру. Место расположения клиента RMAN, из которого будут производиться эти подключения, большого значения не имеет. Дублирование можно производить с любого клиентского хоста. Но чтобы не сильно зависеть от состояния сетевого соединения и клиентской машины, процесс лучше организовать на хосте, где будет располагаться дублированная база данных. В нашем случае это будет хост alfa2.alldba.ru.
Запускаем RMAN и для начала попытаемся подключиться к целевой базе данных под пользователем system.
RMAN> connect target system/pass@alfa.alldba.ru;
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
ORA-01031: привилегий недостаточно
Возникает ошибка. Оказывается для дублирования необходимо подключение пользователя SYS или пользователя обладающего правами SYS. Последнего мы сейчас и создадим в Oracle на сервере alfa.alldba.ru:
SQL> grant connect, sysdba to duser identified by pass; Grant succeeded.
Пробуем снова подключиться, но уже под новым пользователем DUSER:
RMAN> connect target duser/pass@alfa.alldba.ru;
connected to target database: ORCL (DBID=1265664822)
Подключение успешно. Теперь мы можем соединиться с вспомогательным экземпляром (не забываем, что мы находимся на хосте вспомогательного экземпляра):
RMAN> connect auxiliary /; connected to auxiliary database: ORCL (not mounted)
Соединение прошло успешно, и в настоящий момент времени у нас есть два подключения, резервная копия и архивные файлы журнала. Можно запускать непосредственно сам процесс дублирования.
Дублирование
Наберём в RMAN следующую команду:
RMAN> duplicate target database to orcl nofilenamecheck;
Данная команда запустит процесс дублирования целевой базы данных, в результате которого на хосте alfa2.alldba.ru будет получена новая база данных с именем orcl. Указанное в команде ключевое слово nofilenamecheck выключает проверку имён восстанавливаемых файлов. То есть, если на хосте дублированной базы данных во время процесса дублирования попадётся уже существующий файл, по тому же пути и с тем же самым именем, то ошибка сгенерирована не будет, и файл будет заменён (не забываем, что старые файлы базы данных на хосте alfa2.alldba.ru всё ещё существуют).
Рассмотрим более подробно отчет, который выдает команда DUPLICATE.
Вначале у нас автоматически создаются каналы, по которым будет осуществляться дублирование:
Starting Duplicate Db at 02-MAR-12 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: sid=156 devtype=DISK
Затем генерируется скрипт, в котором задаются: команда, устанавливающая серийный номер изменения (SCN), до которого будет происходить восстановление, список команд изменяющих имена файлов данных (в нашем случае они останутся такими же), а так же команда восстановления, которая уже непосредственно производит восстановление файлов данных из резервной копии.
contents of Memory Script: { set until scn 658802; set newname for datafile 1 to "/u02/oradata/orcl/system01.dbf"; set newname for datafile 2 to "/u02/oradata/orcl/undotbs01.dbf"; set newname for datafile 3 to "/u02/oradata/orcl/sysaux01.dbf"; set newname for datafile 4 to "/u02/oradata/orcl/users01.dbf"; set newname for datafile 5 to "/u02/oradata/orcl/example01.dbf"; restore check readonly clone database ; }
Ниже, мы видим результат выполнения такого скрипта:
executing Memory Script executing command: SET until clause executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting restore at 02-MAR-12 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting datafile backupset restore channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set restoring datafile 00001 to /u02/oradata/orcl/system01.dbf restoring datafile 00002 to /u02/oradata/orcl/undotbs01.dbf restoring datafile 00003 to /u02/oradata/orcl/sysaux01.dbf restoring datafile 00004 to /u02/oradata/orcl/users01.dbf restoring datafile 00005 to /u02/oradata/orcl/example01.dbf channel ORA_AUX_DISK_1: reading from backup piece /u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG20120302T092 347_7o0svmmk_.bkp channel ORA_AUX_DISK_1: restored backup piece 1 piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2012_03_02/o1_mf_nnndf_TAG20120 302T092347_7o0svmmk_.bkp tag=TAG20120302T092347 channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:46 Finished restore at 02-MAR-12
Это была самая долгая часть дублирования. Теперь, когда файлы данных восстановлены, RMAN создаёт контрольный файл дублированной базы данных на основе контрольного файла целевой базы данных:
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ORCL" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 ( '/u02/oradata/orcl/redo01.log' ) SIZE 50 M REUSE, GROUP 2 ( '/u02/oradata/orcl/redo02.log' ) SIZE 50 M REUSE, GROUP 3 ( '/u02/oradata/orcl/redo03.log' ) SIZE 50 M REUSE DATAFILE '/u02/oradata/orcl/system01.dbf' CHARACTER SET CL8ISO8859P5
После создания контрольного файла, генерируется скрипт с единственной командой. Назначение этой команды, переключить все восстановленные из резервной копии файлы данных в статус текущих:
contents of Memory Script: { switch clone datafile all; } executing Memory Script released channel: ORA_AUX_DISK_1 released channel: ORA_AUX_SBT_TAPE_1 datafile 2 switched to datafile copy input datafile copy recid=1 stamp=776843437 filename=/u02/oradata/orcl/undotbs01.dbf datafile 3 switched to datafile copy input datafile copy recid=2 stamp=776843437 filename=/u02/oradata/orcl/sysaux01.dbf datafile 4 switched to datafile copy input datafile copy recid=3 stamp=776843437 filename=/u02/oradata/orcl/users01.dbf datafile 5 switched to datafile copy input datafile copy recid=4 stamp=776843437 filename=/u02/oradata/orcl/example01.dbf
После того как файлы переключены, производится неполное восстановление с использованием необходимых архивных файлов. Делает это действие специальный сгенерированный скрипт. В самом начале этого скрипта располагается команда, устанавливающая серийный номер изменения (SCN). Именно до этого SCN RMAN попытается восстановить дублированную базу данных с помощью команды recover скрипта:
contents of Memory Script: { set until scn 658802; recover clone database delete archivelog ; }
Ниже приведён результат выполнения этого скрипта:
executing Memory Script executing command: SET until clause Starting recover at 02-MAR-12 allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: sid=155 devtype=DISK starting media recovery archive log thread 1 sequence 16 is already on disk as file /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_16_7o0ty7cb_.arc archive log thread 1 sequence 17 is already on disk as file /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_17_7o0tyhox_.arc archive log thread 1 sequence 18 is already on disk as file /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_18_7o0tz0tp_.arc archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_16_7o0ty7 cb_.arc thread=1 sequence=16 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_17_7o0tyh ox_.arc thread=1 sequence=17 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_02/o1_mf_1_18_7o0tz0 tp_.arc thread=1 sequence=18 media recovery complete, elapsed time: 00:00:02 Finished recover at 02-MAR-12
Дублированная база данных восстановлена до актуального состояния. Следующие две команды нового скрипта перезагружают вспомогательный экземпляр (auxiliary) в режим без монтирования:
contents of Memory Script: { shutdown clone; startup clone nomount ; } executing Memory Script database dismounted Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 285212672 bytes Fixed Size 1261372 bytes Variable Size 268435652 bytes Database Buffers 12582912 bytes Redo Buffers 2932736 bytes sql statement: CREATE CONTROLFILE REUSE SET DATABASE "ORCL" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292 LOGFILE GROUP 1 ( '/u02/oradata/orcl/redo01.log' ) SIZE 50 M REUSE, GROUP 2 ( '/u02/oradata/orcl/redo02.log' ) SIZE 50 M REUSE, GROUP 3 ( '/u02/oradata/orcl/redo03.log' ) SIZE 50 M REUSE DATAFILE '/u02/oradata/orcl/system01.dbf' CHARACTER SET CL8ISO8859P5
В отчёте мы видим команду CREATE CONTROLFILE, которая после загрузки экземпляра пересоздаёт контрольный файл, очищая тем самым его секции и устанавливая новый номер (DBID) дублированной базы данных.
Вспомогательный экземпляр загружен. Файлы данных восстановлены до актуального состояния. Осталось только пересоздать файлы временного табличного пространства, так как они не включаются в резервный набор копии целевой базы данных. Заниматься этим пересозданием будет новый сгенерированный скрипт. Попутно скрипт занесёт в RMAN каталог на дублированной базе данных информацию об именах файлов данных, а потом переключит эти файлы в текущее состояние (ведь контрольный файл был пересоздан и его секции были пусты):
contents of Memory Script: { set newname for tempfile 1 to "/u02/oradata/orcl/temp01.dbf"; switch clone tempfile all; catalog clone datafilecopy "/u02/oradata/orcl/undotbs01.dbf"; catalog clone datafilecopy "/u02/oradata/orcl/sysaux01.dbf"; catalog clone datafilecopy "/u02/oradata/orcl/users01.dbf"; catalog clone datafilecopy "/u02/oradata/orcl/example01.dbf"; switch clone datafile all; } executing Memory Script executing command: SET NEWNAME renamed temporary file 1 to /u02/oradata/orcl/temp01.dbf in control file cataloged datafile copy datafile copy filename=/u02/oradata/orcl/undotbs01.dbf recid=1 stamp=776843459 cataloged datafile copy datafile copy filename=/u02/oradata/orcl/sysaux01.dbf recid=2 stamp=776843459 cataloged datafile copy datafile copy filename=/u02/oradata/orcl/users01.dbf recid=3 stamp=776843460 cataloged datafile copy datafile copy filename=/u02/oradata/orcl/example01.dbf recid=4 stamp=776843460 datafile 2 switched to datafile copy input datafile copy recid=1 stamp=776843459 filename=/u02/oradata/orcl/undotbs01.dbf datafile 3 switched to datafile copy input datafile copy recid=2 stamp=776843459 filename=/u02/oradata/orcl/sysaux01.dbf datafile 4 switched to datafile copy input datafile copy recid=3 stamp=776843460 filename=/u02/oradata/orcl/users01.dbf datafile 5 switched to datafile copy input datafile copy recid=4 stamp=776843460 filename=/u02/oradata/orcl/example01.dbf
И наконец, последний скрипт содержит всего одну команду, которая открывает полученную новую базу данных с опцией RESETLOG. Команда сбрасывает текущий SCN в единицу, архивирует незаархивированные журнальные файлы, в том числе и текущий журнал, и отбрасывает всю REDO информацию неприменённую во время восстановления. Этой же командой пересоздаются и текущие онлайн журналы:
contents of Memory Script: { Alter clone database open resetlogs; } executing Memory Script database opened Finished Duplicate Db at 02-MAR-12
Процесс дублирования окончен. Мы получили копию целевой базы данных, затратив для этого совсем немного усилий. Осталось только проверить эту копию на предмет ошибок.
Устранение ошибок
Не смотря на то, что в процессе дублировании никаких явных ошибок не возникло, старт экземпляра дублированной базы данных выявил несколько погрешностей. Во-первых, не пересоздался файл временного табличного пространства из-за совпадения имён старого и нового файлов, это явно читалось в alert логе:
Cannot re-create tempfile /u02/oradata/orcl/temp01.dbf, the same name file exists
Во-вторых, файлы журналов повторного выполнения создались совсем не в том месте, которое ожидалось. Как видно из представления v$logfile, файлы журнала были размещены в флэш-области дублированной базы данных, что само по себе является временным решением:
SYSTEM@ALFA2> SELECT member FROM v$logfile; MEMBER ------------------------------------------------------------------------ /u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_3_75do5wbp_.log /u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_2_75do5vhv_.log /u01/app/oracle/flash_recovery_area/ORCL/onlinelog/o1_mf_1_75do5thj_.log
В чём причины этих «ошибок» и как их исправить?
Начнём с неудачной попытки пересоздания файла временного табличного пространства. Как известно, в резервную копию, которую делает RMAN на целевой базе данных, не включаются файлы временных табличных пространств и файлы оперативного журнала. Подразумевается, что они будут пересозданы во время дублирования. Местоположение файлов временного табличного пространства заносится в новый контрольный файл во время выполнения скрипта, устанавливающего новые имена для этих файлов (команда SET NEWNAME FOR TEMPFILE). Следующая за этим команда переключения SWITCH переводит временные файлы в статус текущих, попутно пересоздавая их. Так как файл временного табличного пространства не заменяется, а пересоздаётся, возникает конфликт с файлом temp01.dbf, который уже до этого находился в каталоге /u01/opt/oracle/oradata/orcl. В процессе дублирования, во время перезагрузки экземпляра, этот старый файл пытается пройти тест на принадлежность к базе данных и не проходит его, выдавая ошибку ORA-01186. Следующая за тестом попытка пересоздания файла temp01.dbf тоже терпит неудачу. Похоже, опция NOFILENAMECHECK не действует на файлы временного табличного пространства. Впрочем, вполне возможно в будущих релизах Oracle это будет исправлено.
Какие пути выхода есть из возникшей ситуации? Во-первых, можно сразу после окончания дублирования удалить файл временного табличного пространства из дублированной базы данных, а затем заново создать его, то есть пересоздать файл вручную:
alter database tempfile '/u02/oradata/orcl/temp01.dbf' drop including datafiles; alter tablespace temp add tempfile '/u02/oradata/orcl/temp01.dbf' size 82m;
Можно так же удалить файл temp01.dbf, предшествующей базы данных хоста alfa2.alldba.ru до начала дублирования. Тогда пересоздание файла временного табличного пространства пройдёт автоматически, без ошибок, ведь физически этого файла уже не будет.
Третий вариант немного экзотический. Его суть состоит в использовании параметра инициализации db_file_name_convert. Хотя этот параметр используется в основном для файлов данных, когда надо переименовать имя или расположение файла в дублированной базе данных, для файлов временного табличного пространства его можно тоже использовать. Изменяем вышеуказанный параметр. В качестве его значения перечислим местоположение файлов временного табличного пространства в основной и дублированной базе данных. Имена у этих файлов будут разные:
SQL> alter system set db_file_name_convert='/u02/oradata/orcl/temp01.dbf', '/u02/oradata/orcl/temp02.dbf' SCOPE=SPFILE; System altered.
Не забывая перезагрузить экземпляр, проведем всю процедуру дублирования заново. В результате мы видим, что образовался ещё один файл временного табличного пространства:
[oracle@alfa2 orcl]$ ls –l … -rw-r----- 1 oracle oinstall 85991424 Авг 26 12:56 temp01.dbf -rw-r----- 1 oracle oinstall 85991424 Мар 2 11:08 temp02.dbf …
В процессе дублирования произошло изменение имени файла temp01.dbf на temp02.dbf, после чего он был благополучно создан и добавлен во временное табличное пространство:
SYSTEM@ALFA2> select status, name from v$tempfile; STATUS NAME ------ ---------------------------- ONLINE /u02/oradata/orcl/temp02.dbf
Правда данный метод не очень удобен, так как, для того чтобы не повторилась ошибка приходится при каждом дублировании менять имя файла. Впрочем, для каких-то одноразовых действий он вполне допустим.
Но вернёмся ко второй ошибке, происшедшей во время дублирования. Почему файлы журналов повторного выполнения оказались совсем не в том месте, где они должны быть?
Как было сказано ранее, файлы оперативных журналов не сохраняются в резервной копии RMAN. При дублировании, в момент открытия дублированной базы данных с опцией RESETLOGS, происходит неявное создание этих журналов. При этом местоположение файлов журналов никак не соответствует их местоположению в основной базе данных и зависит от нескольких факторов. Во-первых, если установлен хотя бы один из инсталляционных параметров DB_CREATE_ONLINE_LOG_DEST_n, журнальный файл создаётся по пути указанному в этом параметре. Если значение вышеуказанного параметра не определено, то журналы создаются в каталогах указанных в параметрах DB_CREATE_FILE_DEST и DB_RECOVERY_FILE_DEST. В нашем случае был определён именно параметр DB_RECOVERY_FILE_DEST, поэтому в процессе дублирования там и создались журнальные файлы:
SYSTEM@ALFA2> show parameters db_recovery_file_dest Параметр Тип Значение -------------------------- ------- ------------------------------------ db_recovery_file_dest string /u01/app/oracle/flash_recovery_area/
Как сделать так, чтобы журнальные файлы дублированной базы данных располагались и имели имена, так же как и на основной? Можно конечно удалить журналы после окончания дублирования, а затем снова создать их уже в нужных каталогах, но это далеко не самый простой путь, здесь есть свои сложности. Наиболее оптимальным в нашем случае будет использование параметра log_file_name_convert. Этот параметр специально предназначен для преобразования местоположения журнала при дублировании. Если мы укажем в качестве его значения каталоги, где будут находиться оперативные журналы баз, то при дублировании журналы будут созданы в дублированной базе данных по указанным путям. Например, изменим в нашем примере значение инициализационного параметра log_file_name_convert, указав следующие каталоги:
SQL> alter system set log_file_name_convert='/u02/oradata/orcl/','/u02/oradata/orcl/' SCOPE=SPFILE; System altered.
Если теперь провести дублирование заново, то мы увидим, что оперативные журнальные файлы были созданы в дублированной базе данных на своем привычном месте.
Подведение итогов
Настало время подвести некоторые итоги и коротко определить основные действия, которые необходимо сделать для осуществления базового дублирования:
- Создание в RMAN резервной копии целевой базы данных.
- Копирование резервной копии и необходимых архивных журнальных файлов с хоста целевой базы данных на хост вспомогательного экземпляра.
- Установка значения параметра log_file_name_convert во вспомогательном экземпляре;
- Старт вспомогательного экземпляра в несмонтированном режиме.
- Запуск RMAN на хосте вспомогательного экземпляра.
- Подключение из RMAN к экземпляру целевой базы данных и вспомогательному экземпляру.
- Запуск из RMAN процесса дублирования целевой базы данных.
- Удаление и создание файла временного табличного пространства в дублированной базе данных.
Как видно, надо сделать не так уж много шагов, чтобы получить полную копию целевой базы данных. Но даже такое небольшое количество команд можно существенно сократить. В следующей части статьи будет предпринята попытка ещё больше упростить процесс дублирования, а так же будут рассмотрены некоторые действия, которые нужно предпринять в случаях возникновения ошибок.
Оптимизация процесса дублирования
Рассмотренный выше процесс дублирования у нас начинался с создания резервной копии целевой базы данных на хосте alfa.alldba.ru. При больших объёмах данных действие этот очень длительное, и может продолжаться несколько часов. Не меньше времени будет тратится и на дальнейший перенос резервной копии и журнальных файлов на сервер, где будет развёрнута дублированная база. К тому же, резервная копия, создаваемая для дублирования, может занимать значительное место на хосте целевой базы данных, а сам процесс создания дублированной базы данных может быть сильно растянут по времени.
Ниже мы рассмотрим, что можно сделать для ускорения и упрощения процесса дублирования, в случаях больших объёмов данных. И начнем, пожалуй, с самого первого действия, создания резервной копии.
Создание резервной копии на удалённом хосте
В больших базах данных, файл резервной копии, сделанный с помощью RMAN, может достигать значительных размеров. В этом случае, флэш область восстановления (или другой каталог) не может содержать одновременно несколько резервных копий из-за дефицита дискового пространства. При дублировании, создаваемая резервная копия целевой базы данных предназначена в дальнейшем для отправки на другой хост, и поэтому будет очень некстати занимать (пусть, хотя и временно) такое дефицитное дисковое пространство. Даже если дискового пространства всё же хватает, процесс создания и переноса резервной копии всё равно получается очень сильно растянут по времени, так как эти операции выполняются последовательно.
Частично из этого положения можно выйти, если использовать для создания копии и дальнейшего дублирования внешние накопители, например лентоводы. В этом случае резервная копия целевой базы данных пишется прямо на магнитную ленту. Дублированная база данных может так же создаваться прямо из копии на магнитном носителе. Поэтому достаточно иметь по лентоводу на хостах участвующих в дублировании, и проблема с дефицитом дискового пространства и быстрым переносом резервной копии будет решена.
На самом деле такая возможность бывает не всегда. Поэтому, существует ещё один путь – это использование NFS. Суть его заключается в том, что на хосте целевой базы данных монтируется удалённый каталог хоста, на котором будет развёрнута дублированная база данных. В этот каталог с помощью RMAN пишется резервная копия целевой базы данных. Затем, из этой копии производится создание дублированной базы данных. В результате, мы объединяем два последовательных действия в одно, делая не нужным ручной перенос резервной копии на другой хост.
Рассмотрим этот метод подробнее на примере. Для краткости, хост alfa.alldba.ru, на котором у нас располагается целевая база данных, будем называть локальным, а хост alfa2.alldba.ru вспомогательного экземпляра, удалённым. Первое, что нам надо сделать, это стартовать на обоих хостах службу netfs. Если службы NFS уже стартованы, то следующим шагом будет создание удалённого каталога. Каталог будет иметь у нас имя export и располагаться по пути /mnt.
Для начала, войдём в систему как пользователь root:
[oracle@alfa2 /]$ su - Пароль:
Создадим указанный каталог export, сменим его владельца, и предоставим каталогу все необходимые привилегии:
[root@alfa2 ~]# mkdir /mnt/export [root@alfa2 ~]# chown -R oracle:oinstall /mnt/export [root@alfa2 ~]# chmod -R 775 /mnt/export [root@alfa2 /]# ls -l /mnt | grep export drwxrwxr-x 2 oracle oinstall 4096 Мар 6 04:57 export
Тоже самое сделаем и на локальном хосте:
[root@alfa ~]# mkdir /mnt/export [root@alfa ~]# chown -R oracle:oinstall /mnt/export [root@alfa ~]# chmod -R 775 /mnt/export
Удалённый каталог создан. Теперь, выдадим разрешение на подключение к этому каталогу локальному хосту alfa.alldba.ru. Для этого внесём в файл /etc/exports на удалённом хосте следующую строчку:
[oracle@alfa2 ~]$ more /etc/exports /mnt/export alfa.alldba.ru(rw)
Далее, смонтируем удалённый каталог, выполнив на локальном хосте команду mount со следующими опциями:
[root@alfa ~]# mount -t nfs -o hard,rw,rsize=32768,wsize=32768 alfa2.alldba.ru:/mnt/export /mnt/export
Опции должны быть указаны именно такие, иначе при дальнейшем создании резервной копии в удалённом каталоге, RMAN инициирует следующую ошибку:
ORA-19504: failed to create file "/mnt/export/backup_6fn58tc4_1_1.bkp" ORA-27054: NFS file system where the file is created or resides is not mounted with correct options
Указываем правильные опции и монтируем удалённый каталог. Как видно из отчёта команды df, в нашем случае, всё прошло удачно:
[root@alfa ~]# df -h Файловая система Разм Исп Дост Исп% смонтирована на /dev/mapper/VolGroup00-LogVol00 8,6G 5,2G 3,1G 64% / /dev/sda1 99M 12M 82M 13% /boot tmpfs 506M 0 506M 0% /dev/shm .host:/ 75G 67G 8,1G 90% /mnt/hgfs alfa2.alldba.ru:/mnt/export 8,6G 6,2G 2,0G 76% /mnt/export
Теперь необходимо выполнить резервное копирование целевой базы данных. Главным отличием этого копирования будет то, что резервная копия будет создаваться в удалённом каталоге хоста alfa2.alldba.ru. Чтобы изменить расположение файла резервной копии по умолчанию, используем опцию format команды backup database. В опции укажем путь к удалённому каталогу вместе с маской имени файла резервного набора. Теперь, по команде backup database, RMAN должен создать в указанном удалённом каталоге два резервных набора:
RMAN> backup database format=’/mnt/export/backup_%U.bkp’; Starting backup at 07-MAR-12 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset input datafile fno=00001 name=/u02/oradata/orcl/system01.dbf input datafile fno=00003 name=/u02/oradata/orcl/sysaux01.dbf input datafile fno=00002 name=/u02/oradata/orcl/undotbs01.dbf input datafile fno=00005 name=/u02/oradata/orcl/example01.dbf input datafile fno=00004 name=/u02/oradata/orcl/users01.dbf channel ORA_DISK_1: starting piece 1 at 07-MAR-12 channel ORA_DISK_1: finished piece 1 at 07-MAR-12 piece handle=/mnt/export/backup_6mn59518_1_1.bkp tag=TAG20120307T111448 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:17:44 channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current control file in backupset including current SPFILE in backupset channel ORA_DISK_1: starting piece 1 at 07-MAR-12 channel ORA_DISK_1: finished piece 1 at 07-MAR-12 piece handle=/mnt/export/backup_6nn5962g_1_1.bkp tag=TAG20120307T111448 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:01:28 Finished backup at 07-MAR-12
Выведем отчёт RMAN по созданным резервным копиям:
RMAN> list backup; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 115 Full 592.59M DISK 00:17:42 07-MAR-12 BP Key: 126 Status: AVAILABLE Compressed: NO Tag: TAG20120307T111448 Piece Name: /mnt/export/backup_6mn59518_1_1.bkp List of Datafiles in backup set 115 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- --------- ---- 1 Full 666037 07-MAR-12 /u02/oradata/orcl/system01.dbf 2 Full 666037 07-MAR-12 /u02/oradata/orcl/undotbs01.dbf 3 Full 666037 07-MAR-12 /u02/oradata/orcl/sysaux01.dbf 4 Full 666037 07-MAR-12 /u02/oradata/orcl/users01.dbf 5 Full 665577 07-MAR-12 /u02/oradata/orcl/example01.dbf BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 116 Full 6.83M DISK 00:01:28 07-MAR-12 BP Key: 127 Status: AVAILABLE Compressed: NO Tag: TAG20120307T111448 Piece Name: /mnt/export/backup_6nn5962g_1_1.bkp Control File Included: Ckp SCN: 666216 Ckp time: 07-MAR-12 SPFILE Included: Modification time: 07-MAR-12 -MAR-12
В отчёте видно, что резервные наборы действительно были созданы в удалённом каталоге /mnt/export и теперь, резервная копия целевой базы данных у нас находится на хосте вспомогательного экземпляра alfa2.alldba.ru.
Создание резервной копии архивных файлов
И так, почти всё готово к дублированию, за исключением наличия архивных журналов на хосте alfa2.alldba.ru. В нашем примере журналов всего три:
[oracle@alfa 2012_03_07]$ ls -l итого 16324 -rw-r----- 1 oracle oinstall 6091776 Мар 7 11:45 o1_mf_1_24_7og80z9q_.arc -rw-r----- 1 oracle oinstall 5272064 Мар 7 11:45 o1_mf_1_25_7og814k8_.arc -rw-r----- 1 oracle oinstall 5292544 Мар 7 11:46 o1_mf_1_26_7og838pv_.arc
По правилам базового дублирования их необходимо перенести на хост вспомогательного экземпляра с соблюдением имени и пути расположения файлов. Для этого можно использовать утилиту ftp или команды операционной системы для копирования файлов через удалённый каталог. Но, при больших изменениях, в базе данных может образоваться значительное количество журнальных файлов. Их перенос на другой хост может затянуться во времени и быть трудоёмким, ведь необходимо выбрать с помощью маски только нужные файлы, при этом, не пропустив не одного. И хотя этот процесс можно осуществлять и параллельно дублированию, всё же хотелось бы избавиться от этих рутинных операций. Как это сделать? Обратимся снова к RMAN.
В RMAN имеется команда backup archivelog, которая может создавать резервные наборы архивных файлов. В этой команде можно задавать различные условия, по которым в этот набор будут попадать архивные журнальные файлы. В этой же команде можно задать и место расположения файла резервного набора, а это, как раз то, что нам нужно.
Для начала, определимся какие архивные файлы необходимо копировать в набор. Есть различные опции команды, но мы будем осуществлять выбор по серийному номеру изменения (SCN) . Для этого, среди отчёта RMAN о резервных копиях (list backup) в колонке «Ckp SCN» найдём наименьший SCN. В команде backup archivelog укажем опцию "from scn=" и найденный нами номер SCN. Для того чтобы резервный набор у нас сформировался в удалённом каталоге хоста alfa2.alldba.ru используем опцию format, известную по предыдущему созданию резервной копии. В результате, при выполнении команды, на удалённом хосте должна образоваться резервная копия, включающая архивные файлы, имеющие SCN больший или равный значению, указанному в опции "from scn":
RMAN> backup archivelog from scn=665577 format='/mnt/export/arch_%U.arc'; Starting backup at 07-MAR-12 current log archived using channel ORA_DISK_1 channel ORA_DISK_1: starting archive log backupset channel ORA_DISK_1: specifying archive log(s) in backup set input archive log thread=1 sequence=24 recid=76 stamp=777296719 input archive log thread=1 sequence=25 recid=77 stamp=777296724 input archive log thread=1 sequence=26 recid=78 stamp=777296792 input archive log thread=1 sequence=27 recid=79 stamp=777297033 channel ORA_DISK_1: starting piece 1 at 07-MAR-12 channel ORA_DISK_1: finished piece 1 at 07-MAR-12 piece handle=/mnt/export/arch_6on59749_1_1.arc tag=TAG20120307T115033 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:09 Finished backup at 07-MAR-12
Выведем в RMAN информацию обо всех резервных наборах данных сделанных нами:
RMAN> list backup; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 115 Full 592.59M DISK 00:17:42 07-MAR-12 BP Key: 126 Status: AVAILABLE Compressed: NO Tag: TAG20120307T111448 Piece Name: /mnt/export/backup_6mn59518_1_1.bkp List of Datafiles in backup set 115 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- --------- ---- 1 Full 666037 07-MAR-12 /u02/oradata/orcl/system01.dbf 2 Full 666037 07-MAR-12 /u02/oradata/orcl/undotbs01.dbf 3 Full 666037 07-MAR-12 /u02/oradata/orcl/sysaux01.dbf 4 Full 666037 07-MAR-12 /u02/oradata/orcl/users01.dbf 5 Full 665577 07-MAR-12 /u02/oradata/orcl/example01.dbf BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 116 Full 6.83M DISK 00:01:28 07-MAR-12 BP Key: 127 Status: AVAILABLE Compressed: NO Tag: TAG20120307T111448 Piece Name: /mnt/export/backup_6nn5962g_1_1.bkp Control File Included: Ckp SCN: 666216 Ckp time: 07-MAR-12 SPFILE Included: Modification time: 07-MAR-12 BS Key Size Device Type Elapsed Time Completion Time ------- ---------- ----------- ------------ --------------- 117 15.93M DISK 00:00:07 07-MAR-12 BP Key: 128 Status: AVAILABLE Compressed: NO Tag: TAG20120307T115033 Piece Name: /mnt/export/arch_6on59749_1_1.arc List of Archived Logs in backup set 117 Thrd Seq Low SCN Low Time Next SCN Next Time ---- ------- ---------- --------- ---------- --------- 1 24 665577 07-MAR-12 666563 07-MAR-12 1 25 666563 07-MAR-12 666679 07-MAR-12 1 26 666679 07-MAR-12 666794 07-MAR-12 1 27 666794 07-MAR-12 666880 07-MAR-12
В отчёте видно, что у нас появился новый резервный набор arch_6on59749_1_1.arc. RMAN включил в него все архивные журнальные файлы удовлетворяющие нашим условиям (с наименьшего SCN). Список этих журналов приведён в самом низу отчёта. Кстати, архивных журналов уже стало не три, а четыре. Это произошло из-за того, что команда backup archive перед созданием копии делает переключение оперативных журналов, тем самым образовывая новый архивный журнал.
Выполнение дублирования
Проверим наличие файлов резервных наборов на хосте вспомогательного экземпляра alfa2.alldba.ru:
[oracle@alfa2 export]$ ls -l итого 630780 -rw-r----- 1 oracle oinstall 16702976 Мар 7 03:54 arch_6on59749_1_1.arc -rw-r----- 1 oracle oinstall 621379584 Мар 7 03:44 backup_6mn59518_1_1.bkp -rw-r----- 1 oracle oinstall 7176192 Мар 7 03:44 backup_6nn5962g_1_1.bkp
Все файлы резервных копий присутствуют. Можно начинать дублирование:
RMAN> duplicate target database to orcl nofilenamecheck;
Для краткости приведена только часть вывода выполняемой команды.
Starting Duplicate Db at 07-MAR-12 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: sid=156 devtype=DISK
Стартует восстановление файлов. Как видим, RMAN обратился к контрольному файлу целевой базы данных и нашёл там запись о сделанной нами последней резервной копии базы данных:
Starting restore at 07-MAR-12 using channel ORA_AUX_DISK_1 using channel ORA_AUX_SBT_TAPE_1 channel ORA_AUX_DISK_1: starting datafile backupset restore channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set restoring datafile 00001 to /u02/oradata/orcl/system01.dbf restoring datafile 00002 to /u02/oradata/orcl/undotbs01.dbf restoring datafile 00003 to /u02/oradata/orcl/sysaux01.dbf restoring datafile 00004 to /u02/oradata/orcl/users01.dbf restoring datafile 00005 to /u02/oradata/orcl/example01.dbf channel ORA_AUX_DISK_1: reading from backup piece /mnt/export/backup_6mn59518_1_1.bkp channel ORA_AUX_DISK_1: restored backup piece 1 piece handle=/mnt/export/backup_6mn59518_1_1.bkp tag=TAG20120307T111448 channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:56 Finished restore at 07-MAR-12
Файлы данных восстановлены. Теперь идёт восстановление базы данных до актуального состояния с помощью архивных файлов:
Starting recover at 07-MAR-12 allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: sid=155 devtype=DISK starting media recovery channel ORA_AUX_DISK_1: starting archive log restore to default destination channel ORA_AUX_DISK_1: restoring archive log archive log thread=1 sequence=24 channel ORA_AUX_DISK_1: restoring archive log archive log thread=1 sequence=25 channel ORA_AUX_DISK_1: restoring archive log archive log thread=1 sequence=26 channel ORA_AUX_DISK_1: restoring archive log archive log thread=1 sequence=27 channel ORA_AUX_DISK_1: reading from backup piece /mnt/export/arch_6on59749_1_1.arc channel ORA_AUX_DISK_1: restored backup piece 1 piece handle=/mnt/export/arch_6on59749_1_1.arc tag=TAG20120307T115033 channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_24_7ofdvz gn_.arc thread=1 sequence=24 channel clone_default: deleting archive log(s) archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_24_7ofdvz gn_.arc recid=2 stamp=777268912 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_25_7ofdvz kn_.arc thread=1 sequence=25 channel clone_default: deleting archive log(s) archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_25_7ofdvz kn_.arc recid=4 stamp=777268912 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_26_7ofdvz hk_.arc thread=1 sequence=26 channel clone_default: deleting archive log(s) archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_26_7ofdvz hk_.arc recid=3 stamp=777268912 archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_27_7ofdvz ly_.arc thread=1 sequence=27 channel clone_default: deleting archive log(s) archive log filename=/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_03_07/o1_mf_1_27_7ofdvz ly_.arc recid=1 stamp=777268911 media recovery complete, elapsed time: 00:00:06 Finished recover at 07-MAR-12
Как видно из отчёта, RMAN использовал для догонки базы данных последний сделанный нами резервный набор архивных журнальных файлов. Вначале, он восстановил архивные файлы из резервной копии в их местоположение по умолчанию (в нашем случае в флэш-область). Затем применил их, и произвёл их удаление. В результате база данных была доведена до актуального состояния. Последний скрипт открывает её с опцией RESETLOGS:
contents of Memory Script: { Alter clone database open resetlogs; } executing Memory Script database opened Finished Duplicate Db at 07-MAR-12
Дублирование завершено. Осталось только пересоздать файлы временного табличного пространства и дублированная база готова к использованию. Резервные копии, находящиеся в каталоге export можно удалить. Правда, делать это лучше с помощью RMAN командой DELETE BACKUPSET на хосте целевой базы данных (не забываем, что эти резервные копии относятся к экземпляру целевой базы, несмотря на их расположение на удалённом хосте).
Что ещё можно сделать для оптимизации
Несмотря на то, что оптимизировать процесс дублирования кажется уже некуда, есть ещё несколько моментов, которые могут помочь ускорить этот процесс или сэкономить при этом дисковое пространство. Как было сказано ранее, в больших базах данных и резервная копия получается большого размера. И хотя в нашем примере мы создаём резервную копию прямо на хосте вспомогательного экземпляра, бывает, что и на нём может не хватать дискового пространства. В этом случае нам может помочь сжатие резервного набора налету, то есть непосредственно в момент образования резервной копии. Чтобы создать такую копию необходимо определить её как сжатый резервный набор. Делается это, с помощью добавления в команду backup database служебных слов as compressed backupset.
Попробуем создать такую резервную копию на удалённом хосте:
RMAN> backup as compressed backupset database format=’/mnt/export/backup_%U.bkp’; Starting backup at 16-MAR-12 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=158 devtype=DISK channel ORA_DISK_1: starting compressed full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset input datafile fno=00001 name=/u02/oradata/orcl/system01.dbf input datafile fno=00003 name=/u02/oradata/orcl/sysaux01.dbf input datafile fno=00002 name=/u02/oradata/orcl/undotbs01.dbf input datafile fno=00005 name=/u02/oradata/orcl/example01.dbf input datafile fno=00004 name=/u02/oradata/orcl/users01.dbf channel ORA_DISK_1: starting piece 1 at 16-MAR-12 channel ORA_DISK_1: finished piece 1 at 16-MAR-12 piece handle=/mnt/export/backup_6un60k7h_1_1.bkp tag=TAG20120316T085512 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:02:57 channel ORA_DISK_1: starting compressed full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current control file in backupset including current SPFILE in backupset channel ORA_DISK_1: starting piece 1 at 16-MAR-12 channel ORA_DISK_1: finished piece 1 at 16-MAR-12 piece handle=/mnt/export/backup_6vn60kd2_1_1.bkp tag=TAG20120316T085512 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03 Finished backup at 16-MAR-12
Не забудем сделать и сжатую резервную копию архивных журналов:
RMAN> backup as compressed backupset archivelog from scn=669981 format='/mnt/export/arch_%U.arc'; Starting backup at 16-MAR-12 current log archived using channel ORA_DISK_1 channel ORA_DISK_1: starting compressed archive log backupset channel ORA_DISK_1: specifying archive log(s) in backup set input archive log thread=1 sequence=28 recid=80 stamp=778064576 channel ORA_DISK_1: starting piece 1 at 16-MAR-12 channel ORA_DISK_1: finished piece 1 at 16-MAR-12 piece handle=/mnt/export/arch_70n60km1_1_1.arc tag=TAG20120316T090256 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02 Finished backup at 16-MAR-12
Посмотрим размер резервных наборов в операционной системе:
[oracle@alfa2 export]$ ls -l итого 746852 -rw-r----- 1 oracle oinstall 16702976 Мар 7 03:54 arch_6on59749_1_1.arc -rw-r----- 1 oracle oinstall 2085888 Мар 16 00:34 arch_70n60km1_1_1.arc -rw-r----- 1 oracle oinstall 621379584 Мар 7 03:44 backup_6mn59518_1_1.bkp -rw-r----- 1 oracle oinstall 7176192 Мар 7 03:44 backup_6nn5962g_1_1.bkp -rw-r----- 1 oracle oinstall 115482624 Мар 16 00:31 backup_6un60k7h_1_1.bkp -rw-r----- 1 oracle oinstall 1146880 Мар 16 00:31 backup_6vn60kd2_1_1.bkp
В отчёте команды ls видно, что размер нового файла резервного набора (backup_6un60k7h_1_1.bkp) сократился в пять раз. Экономия дискового пространства на лицо. Правда, несмотря на кажущуюся выгодность сжатия резервной копии, этот метод имеет большой недостаток. В первую очередь это большая нагрузка на процессор при операциях сжатия и распаковки. Поэтому к использованию сжатия резервных наборов надо подходить индивидуально, в зависимости от производительности и занятости процессорных ресурсов.
Экономия дисковых ресурсов это конечно хорошо, но хотелось бы ускорить и сам процесс дублирования. Один из вариантов, это не копировать при дублировании табличные пространства имеющие статус только для чтения. При необходимости их всегда можно добавить позже.
Рассмотрим этот вариант на примере. В качестве табличного пространства «только для чтения» у нас будет выступать табличное пространство EXAMPLE. Для этого, переведём его в статус READ ONLY на экземплярах целевой базы данных и вспомогательного экземпляра:
SQL> alter tablespace EXAMPLE read only; Tablespace altered.
Теперь табличное пространство EXAMPLE в статусе «только для чтения»:
SQL> SELECT tablespace_name, status FROM dba_tablespaces; TABLESPACE_NAME STATUS --------------- --------- SYSTEM ONLINE UNDOTBS1 ONLINE SYSAUX ONLINE TEMP ONLINE USERS ONLINE EXAMPLE READ ONLY
Добавим к команде дублирования DUPLCATE опцию SKIP READONLY. Теперь при дублировании все табличные пространства только для чтения будут пропущены. Выполним команду:
RMAN> duplicate target database to orcl nofilenamecheck skip readonly; Starting Duplicate Db at 16-MAR-12 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: sid=155 devtype=DISK
RMAN явно написал, что файл номер 5 табличного пространства EXAMPLE не участвует в процессе, потому что имеет статус «только для чтения»:
datafile 5 not processed because file is read-only
В дальнейшем он будет исключён из всех скриптов дублирования до его окончания.
После создания дублированной базы данных и её открытия в журнале сообщений alert, появиться интересная запись:
Dictionary check beginning Tablespace 'EXAMPLE' #6 found in data dictionary, but not in the controlfile. Adding to controlfile. File #5 found in data dictionary but not in controlfile. Creating OFFLINE file 'MISSING00005' in the controlfile.
Oracle сообщает, что табличное пространство найдено в словаре базы данных, но информация о нём отсутствует в контрольном файле. Объясняется это просто. Словарь данных при дублировании у нас переноситься вместе с табличным пространством SYSTEM, а вот контрольный файл пересоздаётся заново. С учётом того, что при дублировании табличное пространство EXAMPLE было пропущено, запись о его файлах в контрольный файл так и не попала.
Впрочем, Oracle сразу же исправляет это несоответствие, занося в контрольный файл имя нового виртуального файла данных табличного пространства EXAMPLE:
SQL> SELECT file_name, tablespace_name, online_status FROM dba_data_files FILE_NAME TABLESPACE_NAME ONLINE_STATUS ---------------------------------------------------- --------------- ------------- /u02/oradata/orcl/system01.dbf SYSTEM SYSTEM /u02/oradata/orcl/undotbs01.dbf UNDOTBS1 ONLINE /u02/oradata/orcl/sysaux01.dbf SYSAUX ONLINE /u02/oradata/orcl/users01.dbf USERS ONLINE /u01/app/oracle/product/10.2.0/db_1/dbs/MISSING00005 EXAMPLE OFFLINE
Подведение итогов
Посмотрим, насколько нам удалось упростить процесс дублирования по сравнению с предыдущим вариантом. Первое, резервная копия базы данных теперь создаётся у нас в удалённом каталоге хоста вспомогательного экземпляра. Вместе с экономией дискового пространства на хосте целевой базы данных, у нас экономится и время. Теперь не надо дожидаться окончания резервного копирования для дальнейшего переноса резервной копии на удалённый хост. Две операции совмещены в одну. Во-вторых, больше не надо выбирать нужные файлы архивных журналов и переносить их в место предназначения на удалённом хосте. С помощью RMAN в удалённом каталоге создаётся резервная копия файлов архивных журналов по заданным нами условиям. В дальнейшем RMAN сам найдет эту резервную копию и использует её файлы для процесса дублирования. Операцию ручного переноса удалось сократить.
Если теперь объединить эти две операции создания резервных копий в один блок, например с помощью команды RUN, то можно ещё более упростить процесс дублирования. Например, если запустить этот блок команд в вечернее, менее загруженное время, то к утру можно получить уже готовый к дублированию набор резервных копий, тем самым сэкономив время, которое было бы затрачено при последовательном их создании.
P.S.
Может получиться так, что восстановление дублированной базы данных до актуального состояния с помощью архивных файлов скопированных вручную не происходит из-за следующей ошибки:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORA-01194: file 1 needs more recovery to be consistent ORA-01110: data file 1: '/oradata/orcl/System01.dbf'
Можно конечно вручную догнать базу с помощью команды RECOVERY, а затем открыть её с помощью RESETLOGS. Но, ошибка эта обычно устойчивая и создает определённые неудобства. Восстановление на определённый момент времени с помощью RMAN кляузы UNTIL ошибку не устаняло. Положение спасло только создание архивной копии архивных файлов с помощью RMAN (в статье это описано). Ошибка больше не возникала.
Комментариев нет:
Отправить комментарий