Восстановление базы данных на том же хосте с помощью Rman
Хотя восстановление базы данных на том же сервере встречается реже, чем на другом хосте, в этой статье опишем шаги, необходимые для восстановления базы данных на том же хосте; в данном случае мы не используем ASM хранилища. Исходная база данных называетсяtest, а наша копия будет называться «testcopy».
Для этого мы исходим из резервной копии, сделанной ранее.
В нашем случае мы запустили следующее:
RMAN> run {
allocate channel t1 type disk;
allocate channel t2 type disk;
allocate channel t3 type disk;
allocate channel t4 type disk;
backup format ‘/u01/backup/%U’ (base de datos);
backup format ‘/u01/backup/%U’ (archivelog all);
backup format ‘/u01/backup/%U’ current controlfile;
}
Прежде чем приступить к работе, давайте создадим статье файле oratab для новой базы данных.
Редактируем файл oratab и добавляем новую базу данных:
vi /etc/oratab
test:/u01/sw:N
testcopy:/u01/sw:N
Первым делом необходимо скопировать файл pfile из текущей базы данных — в нашем случаеtest, с помощью которого мы запустим нашу базу данных; для этого достаточно минимального набора параметров. Файл init с минимальными параметрами будет выглядеть примерно так, как я покажу ниже.
Очень важно обратить внимание на параметр «db_create_create_file_dest», в котором мы указываем, где будут храниться наши данные; в данном сценарии это крайне важно, поскольку мы восстанавливаем базу данных на том же хосте, где находится исходная база данных. Также очень важен параметр «db_unique_name», который позволит отличить нашу копию от оригинала.
[oracle@localhost dbs]$ cat inittestcopy.ora
*.compatible=’19.0.0′
*.db_block_size=8192
*.db_create_file_dest=’/data/testcopy/’
*.db_name=’test’
*.db_unique_name=’testcopy’
*.diagnostic_dest=’/u01/app/oracle’
*.open_cursors=300
*.pga_aggregate_target=797m
*.processes=300
*.remote_login_passwordfile=’EXCLUSIVE’
*.sga_target=2388m
*.undo_tablespace=’UNDOTBS1′
Создаем spfile для нашей новой базы данных через pfile.
SQL> create spfile from pfile=’inittestcopy.ora’;
File created.
Проверяем, что spfile был создан правильно:
SQL> startup nomount
Экземпляр ORACLE запущен.
Общая системная глобальная область 2516581464 байт
Фиксированный размер 8899672 байт
Переменный размер 536870912 байт
Буферы базы данных 1962934272 байт
Буферы повторного выполнения 7876608 байт
SQL> show parameter pfile
ИМЯ ТИП ЗНАЧЕНИЕ
————————————————————–
spfile string /u01/sw/dbs/spfiletestcopy.ora
Восстанавливаем controlfile:
Мы подключаемся к RMAN и восстанавливаем файл управления.
Примечание. Мы можем найти резервную копию файла управления, подключившись к «исходной» базе данных, то есть к той, которую нужно скопировать; в нашем случае test , и выполним следующую команду.
RMAN> list backup of controlfile;
Подключившись к базе данных testcopy через rman, восстанавливаем копию controlfile, которую мы нашли ранее.
RMAN> restore controlfile from ‘/u01/backup/0e267imt_1_1’;
Starting restore at 12-SEP-23
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=17 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
output file name=/data/testcopy/TESTCOPY/controlfile/o1_mf_lj1qob64_.ctl
Finished restore at 12-SEP-23
Монтируем базу данных:
RMAN> alter database mount;
released channel: ORA_DISK_1
Statement processed
Перед запуском восстановления базы данных убедимся, что файлы redo logs находятся в нужном месте. Это можно сделать с помощью следующего запроса:
set lines 200
col member format a60
select a.thread#,a.group#,b.type,b.member,a.bytes/1048576
from v$log a,v$logfile b
where a.group#=b.group# order by a.group#;
Если redo logs указывают на старую базу данных, необходимо изменить их на местоположение, которое они будут иметь в нашей новой базе данных. Для этого запускаем следующую команду:
SQL> alter database rename file ‘<old file location and name>’ to ‘<new location and name>’;
Вы можете использовать запрос, подобный следующему, чтобы сделать это автоматически:
select ‘ALTER DATABASE RENAME FILE »’||member||»’ TO »<localización destino> ||substr(member,INSTR(member,’\’,-1,1),length(member)) ||»’;’ from v$logfile;
Выполняем переименование файлов данных и проверяем это с помощью запроса, запущенного ранее, чтобы убедиться, что изменение местоположения выполнено правильно:
ALTER DATABASE RENAME FILETEST.log’ TO‘/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q3jd1_.log’;
ALTER DATABASE RENAME FILETEST.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q4lbd_.log’;
ALTER DATABASE RENAME FILETEST.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q3jcc_.log’;
ALTER DATABASE RENAME FILETEST.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q4qgp_.log’;
ALTER DATABASE RENAME FILETEST.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q3jbo_.log’;
ALTER DATABASE RENAME FILETEST.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q4lfp_.log’;
SQL> set lines 200
col member format a60
select a.thread#,a.group#,b.type,b.member,a.bytes/1048576
from v$log a,v$logfile b
where a.group#=b.group# order by a.group#;SQL> SQL> 2 3
THREAD# GROUP# TYPE MEMBER A.BYTES/1048576
1 1 ONLINE /data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q4lfp_.log
Выполняем восстановление базы данных с помощью резервной копии RMAN.
С базой назначения (testcopy), смонтированной, запускаем следующую команду:
run{
set newname for database to ‘/data/tescopy/TESCOPY/%U’;
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}
Команда «set newname for database to» указывает, где мы хотим, чтобы хранились наши файлы нашей новой базы данных. Это можно сделать вручную, переименовав каждый файл данных, или способом, описанным в этом документе.
Если все правильно, то будет получен результат, аналогичный этому:
Начало восстановления 13 сентября 2023 г.
с использованием контрольного файла целевой базы данных вместо каталога восстановления
выделенный канал: ORA_DISK_1
канал ORA_DISK_1: SID=237 тип устройства=DISK
канал ORA_DISK_1: запуск восстановления набора резервных копий файлов данных
канал ORA_DISK_1: указание файлов данных для восстановления из набора резервных копий
канал ORA_DISK_1: восстановление файла данных 00004 в /data/tescopy/TESCOPY
.
.
запуск восстановления с носителей
архивированный журнал для потока 1 с последовательностью 23 уже находится на диске в виде файлаTEST.arc
имя архивного файлаTEST.arc поток=1 последовательность=23
не удалось найти архивный журнал
архивный журнал поток=1 последовательность=24
RMAN-00571: ===========================================================
RMAN-00569: =============== СЛЕДУЕТ СТЕК СООБЩЕНИЙ ОБ ОШИБКЕ ===============
RMAN-00571: ===========================================================
RMAN-03002: сбой команды восстановления 13.09.2023 в 13:15:18
RMAN-06054: при восстановлении носителя запрошен неизвестный архивированный журнал для потока 1 с последовательностью 24 и начальным SCN 313766
В этом выводе указывается, что база данных успешно восстановлена и применен последний доступный архив.
В этот момент мы можем открыть нашу базу данных.
SQL> alter database open resetlogs;
База данных изменена.
Проверяем, что все в порядке:
SQL> select name from v$datafile;
TEST
TEST
/data/tescopy/TESCOPY/data_DTEST
TEST
SQL> Select member from v$logfile;
/data/testcopy/TESTCOPY/onlinelog/o1_mf_3_lj37cp5g_.log
/data/testcopy/TESTCOPY/onlinelog/o1_mf_2_lj37cp4r_.log
/data/testcopy/TESTCOPY/onlinelog/o1_mf_1_lj37cp41_.log
En este último punto, ya tendríamos la base de datos recuperada, en este caso puede ser interesante cambiar renombrar la base de datos, ya que el DBID y el DB_NAME de la base de datos original y la copia será el mismo. Para ello recomiendo realizarlo con la herramienta NID, mejor que de forma manual.

