Несмотря на то, что реже приходится восстанавливать базу данных на той же машине, чем на другом хосте, в этой статье мы укажем необходимые шаги для восстановления базы данных на том же хосте, причем в данном случае мы не используем 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';
Файл создан.
Мы проверяем правильность создания sp-файла:
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
Восстанавливаем файл управления:
Мы подключаемся к RMAN и получаем файл управления.
Примечание. Мы можем найти резервную копию файла управления, подключившись к "оригинальной" базе данных, или базе данных для копирования, в нашем случае test , и выполнив следующую команду.
RMAN> list backup of controlfile;
Подключившись к базе данных testcopy, мы через rman получаем копию файла управления, которую нашли ранее.
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
Завершение восстановления в 12-SEP-23
Мы настроили базу данных:
RMAN> alter database mount;
released channel: ORA_DISK_1
Statement processed
Прежде чем приступить к восстановлению базы данных, убедимся, что файлы redo log находятся в правильном пути. Это можно сделать с помощью следующего запроса:
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 указывают на старую базу данных, то необходимо изменить их расположение на то, которое они будут иметь в нашей новой базе данных. Для этого выполним следующую команду:
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" указывает, где мы хотим хранить новые файлы базы данных. Это можно сделать вручную, переименовывая каждый файл данных, или способом, описанным в этом документе.
Если все сделано правильно, вы получите результат, подобный этому:
Starting restore at 13-SEP-23
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=237 device type=DISK
channel ORA_DISK_1: start datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00004 to /data/tescopy/TESCOPY
.
.
start media recovery
archived log for thread 1 with sequence 23 is already on disk as file /u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc
архивированный файл журнала name=/u01/app/oracle/fast_recovery_area/TEST/archivelog/2023_09_12/o1_mf_1_23_lj1pkgkj_.arc thread=1 sequence=23
unable to find archived log
archived log thread=1 sequence=24
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 09/13/2023 13:15:18
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 24 and starting SCN of 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 /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, лучше, чем вручную.