My開発メモ

Oracleデータベースのリカバリのやり方

『機能で学ぶ Oracle Database 入門』に、 リカバリの基本的な手順が載っていたので、それをメモしておく。

p238からの手順の記録である。

1) アーカイブログの出力先の確認

sysでログインしたのち、以下のコマンドで調べることができる。

SQL> show parameter db_recovery_file_dest
NAME                        TYPE              VALUE
-------------------------- ----------------- -----------------------------------------
db_recovery_file_dest      string            C:\oraclexe\app\oracle\fast_recovery_area
db_recovery_file_dest_size big integer       10G

あるいは

SQL> select name from v$recovery_file_dest
NAME
-----------------------------------------
C:\oraclexe\app\oracle\fast_recovery_area

これは、本のp.238のやり方では確認できなかった。 参考にしたのは、以下。

Oracle 11gでアーカイブログの出力先を確認する

2) データベースを停止して、データファイルのコピーを別の場所に保存する

データファイルの場所は、以下のコマンドで確認できる。

SQL> select ts.name, df.name from v$tablespace ts, v$datafile df where ts.ts#=df.ts#;

NAME                 NAME
-------------------- ----------------------------------------------
SYSTEM               C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSTEM.DBF

SYSAUX               C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF

UNDOTBS1             C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF

NAME                 NAME
-------------------- ----------------------------------------------

USERS                C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF

sysユーザーで、

SQL> shutdown immediate

システムが停止したら、

上のデータファイルを別の場所にコピーする。

3) データの追加・削除のコマンドを実行する。

一般ユーザーでログインして、テーブルを作成する。

SQL> create table test (
  2  col_a varchar2(3)
  3  );

以下のような PL/SQL を実行する。

begin
  for i in 1..100000 loop
    insert into test values('ABC');
    update test set col_a='DEF';
    delete test;
    commit;
  end loop;
end;
/

こののち、先ほどコピーしておいたので、元の場所のファイルを4つほど削除する。
つまり、データファイルをコピー(バックアップ)したのち、データベースに変更を加えたのである。
この変更は、アーカイブログファイルに記録されている。
このファイルはもちろん、バックアップしていない。

4) データベースを起動する。

SQL> startup mount

マウント自体は無事におこなわれるはずである。

SQL> alter database open;

データベースをオープンしようとすると、エラーが起こって、起動できない。

5) エラーを確認する

以下のコマンドでの出力を見てみる。

SQL> select ts.name, df.name, r.*
  2  from v$recover_file r, v$datafile df, v$tablespace ts
  3  where r.file# = df.file#
  4  and df.ts# = ts.ts#;

FILE NOT FOUND という表示がされるはずである。

また、以下のコマンドでも確認できる。

SQL> select tablespace_name, name, error from v$datafile_header;

6) コピーしておいたデータファイルを元の場所に戻す

さきほどの4つのファイルを、元あった場所にコピーする。

しかし、そのあとにおこなった作業がある。

7) データベースを停止すうる時点までのデータ操作をログから適用する

現在、停止していることが必要である。

SQL> shutdown immediate

a) まず、マウント状態にする.

SQL> startup mount

b) 自動実行モードにする

SQL> set autorecovery on

c) リカバリを実行する

SQL> recover database

いろいろとメッセージが出るが、 最終的に以下のメッセージが出れば成功である。

ログが適用されました。
メディア・リカバリが完了しました。

8) データファイルが正常かを確認する

4) のところで行なったコマンドを再度実行して、復旧されたことを確認する。

SQL> select ts.name, df.name, r.*
  2  from v$recover_file r, v$datafile df, v$tablespace ts
  3  where r.file# = df.file#
  4  and df.ts# = ts.ts#;
SQL> select tablespace_name, name, error from v$datafile_header;

参考

一志達也・著 翔泳社 2011年9月8日 初版第1刷

カテゴリー: memo, OracleDB

タグ: oracle, オラクル, リカバリ

カウント: 226