Хотя обычно базу данных приходится восстанавливать на другом хосте, в некоторых случаях может возникнуть необходимость восстановить новую базу данных на том же компьютере, где находится исходная база данных. Именно этому посвящена данная статье описаны шаги, необходимые для восстановления базы данных на том же хосте. В данном случае мы не используем 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 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’
*.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 started.
Общая системная глобальная область 2516581464 байт
Фиксированный размер 8899672 байт
Переменный размер 536870912 байт
Буферы базы данных 1962934272 байт
Буферы повтора 7876608 байт
SQL> show parameter pfile
ИМЯ ТИП ЗНАЧЕНИЕ
————————————————————–
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 FILEoracle.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 FILEoracle.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 FILEoracle.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: SID=237 тип устройства=DISK
канал ORA_DISK_1: запуск восстановления набора резервных копий файлов данных
канал ORA_DISK_1: указание файлов данных для восстановления из набора резервных копий
канал ORA_DISK_1: восстановление файла данных 00004 в /data/tescopy/TESCOPY
.
.
starting media recovery
archived log for thread 1 with sequence 23 is already on disk as fileoracle.arc
archived log fileoracle.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, лучше, чем вручную.





