Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Горбатов Аттестационные испытания автоматизированных систем от 2014

.pdf
Скачиваний:
129
Добавлен:
12.11.2022
Размер:
12.47 Mб
Скачать

Теперь «попросим» Oracle выполнить восстановление, что он и сделает с использованием информации из log файлов:

recover automatic database; alter database open;

select * from scott.dept;

Новая строка в таблице «dept», которой не могло быть в «холодной» копии users01.dbf, появилась из log файла повторным выполнением транзакции.

2. База данных находится в режиме archivelog (архивируется). Формируем «горячую» резервную копию файла users01.dbf базы данных. После формирования «холодной» копии выполняется транзакция в схеме пользователя, данные которого находятся в файле users01.dbf. В ходе работы с БД (после выполненной завершенной транзакции) «утерян» файл данных users01.dbf. Требуется восстановить утерянный файл.

Для того чтобы задействовать архивацию, надо в смонтиованной, но не открытой базе данных выполнить команду, связанную с архивацией

shutdown immediate startup mount

Смонтировали базу данных для обеспечения возможности перевода ее в режим архивирования:

alter database archivelog;

Теперь откроем БД: alter database open;

Получим справку о режиме архивации: archive log list;

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

Восстановим к первоначальному «эталонному» виду схему scott, т.е. удалим две таблицы, которые могли быть созданы при предыдущем выполнении этого раздела лабораторной работы:

drop table scott.tab1 cascade constraint; drop table scott.tab2 cascade constraint; commit;

Теперь сформируем «горячую» копию файлa users01.dbf. Копию именно этого файла мы сделаем потому, что далее именно

471

этот файл будет «испорчен» (на самом деле удален), имитируя неисправность БД, требующую восстановления с использованием «горячей» (полученной в работающей БД) копии БД. С этим файлом связана tablespace users, которая установлена для пользователя scott при его создании.

Создадим директорию для хранения «горячей» копии users01.dbf.host MKDIR d:\g_copy теперь сохраним состояние ба-

зы данных на диск

ALTER SYSTEM CHECKPOINT;

Начинается режим резервного копирования, который разрешается (begin backup) или запрещается (end backup) на уровне отдельного табличного пространства.

ALTER TABLESPACE USERS BEGIN BACKUP; $D:\oracle\product\10.2.0\db_1\BIN\OCOPY

D:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF d:\g_copy\USERS01.DBF

ALTER TABLESPACE USERS END BACKUP;

Выше приведенные строки написаны для Oracle 10g. Для Oracle 11g путь

\oracle\product\10.2.0\db_1\bin\ надо заменить здесь и везде ниже по тексту на %ORACLE_HOME%\bin.

Копия users01.dbf теперь в папке d:\g_copy. Выполним теперь в базе данных изменения: добавим таблицы scott.tab1(at1 number) и scott.tab2(at1 number), новую запись в таблицу scott.tab1 и заФикси-

руем (commit;) в БД это добавление: create table scott.tab1(at1 number); create table scott.tab2(at1 number); insert into scott.tab1 values(1); commit;

select * from scott.tab1;

Теперь БД отличается от «горячей» копии, так как добавились новые таблицы и новая запись, т.е. добавились новые транзакции. Остановим БД, чтобы внести неисправность в нее.

shutdown immediate

Сымитируем неисправность файлов с данными: удалим

USERS01.DBF средствами OC Windows из папки …:\oracle\product\10.2.0\oradata\orcl.

472

После порчи файла данных восстанавливаем его из «горячей» копии в папке «d:\g_copy» простым копированием. Отметим, что мы скопировали файл, в котором нет новых таблиц пользователя scott.Мы не стали здесь стартовать БД, чтобы не тратить время. Ясно, что при попытке старта нам будет выдано сообщение об отсутствии файла данных users01.dbf, после чего нам надо будет останавливать БД и копировать резервную копию файла Users01.dbf. Будем полагать, что мы прошли все эти стадии.

Вот теперь, после такого восстановления файла данных стартуем БД.

startup

Oracle зарегистрировал расхождение в номере последней транзакции в файлах данных из «горячей» копии и в управляющем файле БД, зарегистрировавшем последнюю транзакцию добавление таблиц в схеме scott. Поэтому база данных смонтирована, но не открыта. Теперь «попросим» Oracle выполнить восстановление, что он и сделает с использованием информации из log файлов:

recover automatic database; alter database open;

select * from scott.tab1;

Новая строка появилась при восстановлении из log файла повторным выполнением транзакции.

3. База данных находится в режиме archivelog (архивируется). Выполняется длинная транзакция, в ходе выполнения которой формируется несколько файлов журнализации. Затем происходит внезапная остановка базы данных (shutdown abort), после которой «теряются» незаархивированные оперативные файлы журнализации. Требуется восстановить базу данных с созданием новых файлов журнализации.

connect sys/sys as sysdba

Пересоздадим пользователя scott с другим табличным пространством, специально для него созданным, так как tablespace users мало для емких транзакций, которые нам потребуются, чтобы выполнить наш пример восстановления.

Нижеприведенные строки написаны для Oracle 10g. При работе с Oracle 11g надо заменить путь D:\oracle\product\10.2.0\ на путь

473

D:\app\admin\, при условии, конечно, что сервер Oracle установлен на диске D:

drop user scott cascade;

drop tablespace main_tablespace INCLUDING CONTENTS; host del D:\oracle\product\10.2.0\oradata\orcl\mmain.dbf; drop tablespace maintemp INCLUDING CONTENTS;

host del D:\oracle\product\10.2.0\oradata\orcl\ttemp.dbf;

create tablespace main_tablespace datafile 'D:\oracle\product\10.2.0\oradata\orcl\mmain.dbf' size 300M default storage (initial 1M next 1M minextents 1 maxextents 300);

CREATE TEMPORARY TABLESPACE maintemp TEMPFILE 'D:\oracle\product\10.2.0\oradata\orcl\ttemp.dbf'

SIZE 100M;

create user scott identified by scott default tablespace main_tablespace temporary tablespace maintemp quota 30m on main_tablespace;

grant connect,resource,create view to scott;

Задействуем архивацию: shutdown immediate startup mount

Смонтировали базу данных (startup mount) для обеспечения возможности перевода ее в режим archivelog

alter database archivelog;

Теперь откроем БД: alter database open;

Получим справку о режиме архивации: archive log list;

Теперь средствами ОС Windows сформируем копированием в папку «d:\h_copy» из папки «d:\oracle\product\10.2.0\oradata\orcl» «холодную» копию файлов БД (всех, за исключением управляющих и log файлов). Удалим средствами ОС Windows из папки

«D:\oracle\product\10.2.0\flash_recovery_area\ORCL» все архивные

474

файлы, оставшиеся от предыдущего выполнения лабораторной ра-

боты. Перед копированием остановим инстанцию. shutdown immediate

Запустим базу данных, чтобы затем выполнить в ней «длинную» транзакцию с образованием архивных файлов:

startup

connect scott/scott

create table scott.tab1(at1 number); create table scott.tab2(at1 number); create table scott.tab3 (at1 number); create table scott.tab4(at1 number); create table scott.tab5(at1 number); create table scott.tab6(at1 number);

Начнем наши «длинные» транзакции, чтобы сформировать архивные копии файлов журнализации транзакций:

insert into scott.tab2 values(1); insert into scott.tab1 values(1);

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; 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; 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; 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; 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;

475

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