insert into scott.tab2 select * from scott.tab1; insert into scott.tab1 select * from scott.tab2; insert into scott.tab1 select * from scott.tab2; insert into scott.tab2 select * from scott.tab1; insert into scott.tab1 select * from scott.tab2;
Сделаем здесь первый commit и проверим, не появились ли к этому моменту в папке D:\oracle\product\10.2.0\flash_recovery_ area\ORCL\дата_архивации, первые архивные файлы. Следует обратить внимание на место папки архивации. Oracle создает ее в месте, которое по умолчанию (реализуемому при установке Oracle) предусмотрено для архивирования, причем название той папки, куда непосредственно ложатся архивные файлы, совпадает с текущей датой:
commit;
insert into scott.tab1 select * from scott.tab2; insert into scott.tab2 select * from scott.tab1; insert into scott.tab1 select * from scott.tab2; insert into scott.tab2 select * from scott.tab1; insert into scott.tab1 select * from scott.tab2;
Сделаем здесь второй commit и посмотрим в папке D:\oracle\ product\10.2.0\flash_recovery_area\ORCL\дата_архивации, возмож-
но, появившиеся архивные файлы: insert into scott.tab3 values(1); insert into scott.tab4 values(1);
insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3;
Сделаем здесь третий commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы: commit;
476
insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3;
Сделаем здесь четвертый commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы: commit;
insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4; insert into scott.tab4 select * from scott.tab3; insert into scott.tab3 select * from scott.tab4;
Сделаем здесь пятый commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы: commit;
insert into scott.tab5 values(1); insert into scott.tab6 values(1);
insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6;
Сделаем здесь шестой commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы: commit;
Выведем количество строк во всех таблицах после этого
«commit»:
477
select count (*) from scott.tab1; select count (*) from scott.tab2; select count (*) from scott.tab3; select count (*) from scott.tab4; select count (*) from scott.tab5; select count (*) from scott.tab6;
insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6;
Сделаем здесь седьмой commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы. commit;
Выведем количество строк во всех таблицах после этого
«commit»:
select count (*) from scott.tab1; select count (*) from scott.tab2; select count (*) from scott.tab3; select count (*) from scott.tab4; select count (*) from scott.tab5; select count (*) from scott.tab6;
insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6; insert into scott.tab6 select * from scott.tab5; insert into scott.tab5 select * from scott.tab6;
Сделаем здесь восьмой commit и посмотрим в папке
D:\oracle\product\10.2.0\flash_recovery_area\ORCL\дата_архивации,
возможно, появившиеся архивные файлы. commit;
Выведем количество строк во всех таблицах после этого
«commit»:
478
select count (*) from scott.tab1; select count (*) from scott.tab2; select count (*) from scott.tab3; select count (*) from scott.tab4; select count (*) from scott.tab5; select count (*) from scott.tab6;
insert into scott.tab1 select * from scott.tab2; insert into scott.tab4 select * from scott.tab3; insert into scott.tab6 select * from scott.tab5;
Здесь commit не будем делать, чтобы лишний раз убедиться, что незавершенная транзакция не восстанавливается.
Выведем количество строк во всех таблицах после этой незавершенной транзакции:
select count (*) from scott.tab1; select count (*) from scott.tab2; select count (*) from scott.tab3; select count (*) from scott.tab4; select count (*) from scott.tab5; select count (*) from scott.tab6;
БД сильно отличается от «холодной» копии, так как добавились новые транзакции. Закроем командой shutdown abort базу данных без завершения (без commit) транзакции.
shutdown abort
Теперь имитируем потерю log файлов ‒ удалим их (Redo01.log, Redo02.log, Redo03.log) средствами ОС Windows из папки «D:\oracle\product\10.2.0\oradata\orcl».
Так как log файлы «потеряны», приступим к восстановлению (неполному, так как полное невозможно). Незавершенные транзакции, конечно, не будут восстановлены, так как повторного их выполнения не произойдет. Но, возможно, будут потеряны и некоторые из завершенных транзакций, так как эти завершенные транзакции могут находиться только в файлах журнализации (которые и «потеряны»), но еще не переместятся в архивные файлы.
Для восстановления перезапишем (поверх существующих) из папки «d:\h_copy» в папку «d:\oracle\product\10.2.0\oradata\orcl»
файлы «холодной» копии БД, в которых отсутствуют созданные и
479
заполненные после копирования файлов БД таблицы tab1 - tab6. Теперь эти таблицы и заполнившие их строки могут находяться только в архивных файлах.
Монтируем БД, так как открытия все равно не получится.
Connect sys/admin1 as sysdba startup mount
Oracle зарегистрировал расхождение в номере последней транзакции в файлах данных из «холодных» копий и в управляющем файле БД, зарегистрировавшем номер последней транзакции ‒ до-
бавление записей в scott.tab1 - scott.tab6.
Теперь «попросим» Oracle выполнить следующий шаг восстановления:
recover database until cancel;
При отработке этой команды Oracle предложит восстановить информацию из архивного файла с указанием адреса его расположения и номеров SCN (System Change Number) транзакций в этом архивном файле. Если такой архивный файл в папке D:\oracle \product\10.2.0\flash_recovery_area\ORCL\дата_архивации сущест-
вует, мы нажимаем клавишу «Enter» с тем, чтобы продолжить восстановление. Такое предложение (восстановить информацию из архивного файла) может повториться несколько раз ‒ по числу архивных файлов и еще один раз. «Enter» надо вводить до тех пор, пока Oracle не предложит нам вводить информацию из архивного файла, которого в вышеназванной папке уже нет. В этом случае и надо ввести «cansel». Именно «cansel», но не «cansel;».
cansel
Следующий шаг ‒ нижеприводимая команда, открывающая БД с созданием новых log файлов.
alter database open resetlogs;
Посмотрим, до какого состояния мы восстановили информацию в таблицах tab1 и tab2:
select count (*) from scott.tab1; select count (*) from scott.tab2; select count (*) from scott.tab3; select count (*) from scott.tab4; select count (*) from scott.tab5; select count (*) from scott.tab6;
480