Восстановление базы данных на том же хосте с помощью 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_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 instance started.
Total System Global Area 2516581464 bytes
Fixed Size 8899672 bytes
Variable Size 536870912 bytes
Database Buffers 1962934272 bytes
Redo Buffers 7876608 bytes

SQL> show parameter pfile

NAME TYPE VALUE
————————————————————–
spfile string /u01/sw/dbs/spfiletestcopy.ora


Восстанавливаем controlfile:

Подключаемся к RMAN и восстанавливаем controlfile.
Примечание. Мы можем найти резервную копию controlfile, подключившись к «original» базе данных, или базе данных для копирования, в нашем случае 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 FILE ‘/data/test/TEST/onlinelog/o1_mf_3_hz8q3jd1_.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q3jd1_.log’;
ALTER DATABASE RENAME FILE ‘/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_3_hz8q4lbd_.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_3_hz8q4lbd_.log’;
ALTER DATABASE RENAME FILE ‘/data/test/TEST/onlinelog/o1_mf_2_hz8q3jcc_.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q3jcc_.log’;
ALTER DATABASE RENAME FILE ‘/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_2_hz8q4qgp_.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_2_hz8q4qgp_.log’;
ALTER DATABASE RENAME FILE ‘/data/test/TEST/onlinelog/o1_mf_1_hz8q3jbo_.log’ TO ‘/data/testcopy/TESTCOPY/redolog/o1_mf_1_hz8q3jbo_.log’;
ALTER DATABASE RENAME FILE ‘/u01/app/oracle/fast_recovery_area/TEST/onlinelog/o1_mf_1_hz8q4lfp_.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-SEP-23
использование управляющего файла целевой базы данных вместо каталога восстановления
выделен канал: ORA_DISK_1
канал ORA_DISK_1: SID=237, тип устройства=DISK
канал ORA_DISK_1: начинается восстановление набора резервных копий файлов данных
канал ORA_DISK_1: указание файлов данных для восстановления из набора резервных копий
канал ORA_DISK_1: восстановление файла данных 00004 в /data/tescopy/TESCOPY
.
.
начало восстановления носителя
архивный журнал для потока 1 с последовательностью 23 уже находится на диске как файл /u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc
имя файла архивного журнала=/u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc поток=1 последовательность=23
невозможно найти архивный журнал
архивный журнал поток=1 последовательность=24
RMAN-00571: ===========================================================
RMAN-00569: =============== ДАЛЕЕ ТЕКСТ СООБЩЕНИЯ ОБ ОШИБКЕ ===============
RMAN-00571: ===========================================================
RMAN-03002: сбой команды recover 09/13/2023 13:15:18
RMAN-06054: восстановление носителя запрашивает неизвестный архивный журнал для потока 1 с последовательностью 24 и начальным SCN 313766

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

SQL> alter database open resetlogs;
База данных изменена.

Проверяем, что все в порядке:

SQL> select name from v$datafile;

/data/tescopy/TESCOPY/data_D-TEST_TS-SYSTEM_FNO-1
/data/tescopy/TESCOPY/data_D-TEST_TS-SYSAUX_FNO-3
/data/tescopy/TESCOPY/data_D-TEST_TS-UNDOTBS1_FNO-4
/data/tescopy/TESCOPY/data_D-TEST_TS-USERS_FNO-7

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

В этом последнем пункте у нас уже будет восстановлена база данных, в этом случае может быть интересно изменить имя базы данных, поскольку DBID и DB_NAME исходной базы данных и копии будут одинаковыми. Для этого я рекомендую делать это с помощью инструмента NID, а не вручную.

Прокрутка к началу