2007/11/12

RMAN: 制御ファイルが壊れてしまった場合のリカバリ方法 (8.0/8.1)

文書番号 15912 最終更新日 2005-04-21
製品名(バージョン)[コンポーネント] Oracle Server - Enterprise Edition (8.0 - ) [Recovery Manager]
プラットフォーム(バージョン) すべてのプラットフォーム ( - )
関連文書 15854  
概要 RMAN: 制御ファイルが壊れてしまった場合のリカバリ方法 (8.0/8.1)
内容:

[Problem]
制御ファイルが壊れてしまいました。
他のデータファイルやオンラインREDOログファイルは壊れていません。
RMANでバックアップを取得しています。
RMANによる復旧方法について教えてください。

[To reproduce]
制御ファイルが壊れた場合、このようなエラーが発生します。

SVRMGR> select * from v$datafile;
FILE# CREATION_C CREATION_ TS# RFILE# STATUS ENABLED CHECKPO
INT CHECKPOIN UNRECOVERA UNRECOVER LAST_CHANG LAST_TIME OFFLINE_CH ONLINE_CHA ON
LINE_TI BYTES BLOCKS CREATE_BYT BLOCK_SIZE NAME
PLUGGED_IN
---------- ---------- --------- ---------- ---------- ------- ---------- -------
--- --------- ---------- --------- ---------- --------- ---------- ---------- --
------- ---------- ---------- ---------- ---------- ----------------------------
---------------------------------------------------- ----------
ORA-00210: 指定された制御ファイルをオープンできません。
ORA-00202: 制御ファイル: '/rman/oradata/tar816/control01.ctl'
ORA-27041: ファイルをオープンできません。
SVR4 Error: 2: No such file or directory
Additional information: 3
SVRMGR>

[Action]
以下は、データベースの制御ファイルのみが壊れてしまった場合の対処方法です。
制御ファイル以外のデータファイルやオンラインREDOファイルが壊れていない
ということが前提となっています。ご注意ください。

1. データベースをshutdownします。
制御ファイルが壊れているので、shutdown normalはできません。
shutdown abortをします。

2. データベースをnomount状態にします。
SVRMGR> startup nomount

3. RMANを起動しカタログとターゲットに接続します。
% rman target system/manager@target catalog rman/rman@catalog

Recovery Manager: リリース 8.1.6.0.0 - Production

RMAN-06006: ターゲット・データベース: tar816(マウントされていません)に接続されました。
RMAN-06008: リカバリ・カタログ・データベースに接続されました。

RMAN>

nomount状態なので、上記のような出力になります。

4. RMANで制御ファイルをrestoreし、データベースをmountします。
RMAN> run {
2> allocate channel ch1 type disk;
3> restore controlfile;
4> sql 'alter database mount';
5> }

実行ログの一部:
===============================================================================
RMAN-03022: コンパイル・コマンド: restore

RMAN-03022: コンパイル・コマンド: IRESTORE
RMAN-03023: 実行コマンド: IRESTORE
RMAN-08016: チャネル ch1: データファイル・バックアップ集合の復旧を開始しています。
RMAN-08502: set_count=3 set_stamp=405026127 creation_time=20000807 19:15:27
RMAN-08021: チャネル ch1: 制御ファイルをリストアしています。
RMAN-08505: 出力ファイル名=/rman/oradata/tar816/control01.ctl
RMAN-08023: チャネル ch1: バックアップ部分: 1がリストアされました。
RMAN-08511: 部分ハンドル=/rman/backup/fullTAR816_3_1 タグ=null パラメー
タ=NULL
RMAN-08024: チャネル ch1: リストア完了
RMAN-08058: 制御ファイルをレプリケートしています。
RMAN-08506: 入力ファイル名=/rman/oradata/tar816/control01.ctl
RMAN-08505: 出力ファイル名=/rman/oradata/tar816/control02.ctl
RMAN-08505: 出力ファイル名=/rman/oradata/tar816/control03.ctl
===============================================================================

Oracle8.1.xでは、restore controlfile; と実行するだけで、
initパラメータファイルの control_files に書かれているすべてのファイルを
指定された位置にリストアします。
Oracle8.0.xをお使いの場合には、restore controlfile to xxx と
replicate controlfile from xxxx を実行する必要があります。
replicate controlfile コマンドを実行するためにはTYPE DISKのチャネルを
追加して下さい。

5. バックアップから戻した制御ファイルのためにリカバリを行うのですが、
その前にリカバリのための準備(リカバリカタログにアーカイブログファイルを登録)
をします。

まず、確認のために以下のコマンドを実行します。

RMAN> change archivelog all crosscheck;

実行ログの一部:
===============================================================================
RMAN-03022: コンパイル・コマンド: change
RMAN-06158: アーカイブログの妥当性チェックが正常に終了しました。
RMAN-08514: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_3.
arc レコードID=28 スタンプ=405273299
===============================================================================

Oracle8.1.x では、crosscheckですが、Oracle8.0.x では、
RMAN> change archivelog all validate;
とします。
このコマンド実行時に、ある条件を満たしていないと RMAN-6038、RMAN-20242 が発生します。
エラーの発生についての詳細は Krown#26779をご覧下さい。
また Oracle8.1.6.0-8.1.6.2 をお使いの場合には、このコマンドが正常に機能しないことが
あります。詳細については、Krown#26779 と Krown#18715 をご参照ください。

ここで、出力があったアーカイブログファイルについては、
log_archive_dest に存在し、かつ、リカバリカタログに情報が格納されています。
次に initパラメータ log_archive_dest で指定されているディレクトリを確認してください。
log_archive_destにあるが、
RMAN> change archivelog all crosscheck;
で出力がなかったファイルについては、リカバリカタログに登録されていません。
それらのアーカイブログファイルは、catalogコマンドでリカバリカタログに登録しなくて
はいけません。

catalogコマンドの使用例)

RMAN> catalog archivelog '/rman/admin/tar816/arch/arch_1_4.arc';

このコマンドで、log_archive_destにあるアーカイブログファイル arch_1_4.arc を
リカバリカタログに登録します。

・この実行がどのような役割を示しているかですが:
RMANでは、制御ファイルとリカバリカタログが同期を取ることにより、
ターゲットデータベースの情報をリカバリカタログに格納します。
そのためのRMANコマンドが resync catalog; です。
制御ファイルが壊れた場合、壊れる前の最後にresyncを行なった時からの後の
ターゲットデータベースの情報がまだリカバリカタログに入っていない状態になっています。
この状態のまま、RMANでrecoverコマンドを実行すると、
RMAN-08060: アーカイブログが見つかりません。
RMAN-08510: アーカイブログ・スレッド=1 順序=4
というエラーになり、recoverが途中で終了してしまいます。

log_archive_destにあるが、RMANのリカバリカタログにないというアーカイブログファイル
については、すべてcatalogコマンドを実行してください。
(ここで登録するファイルがたくさんあった場合には、resyncを定期的に行なっていなかった
ということになります。今後はresyncをまめに実行するようにしましょう。)

6. RMANでrecoverコマンドを実行し、データベースをopenします。
RMAN> run {
2> allocate channel ch1 type disk;
3> recover database;
4> sql 'alter database open resetlogs';
5> }

実行ログの一部:
===============================================================================
RMAN-03022: コンパイル・コマンド: allocate
RMAN-03023: 実行コマンド: allocate
RMAN-08030: チャネル ch1が割り当てられました。
RMAN-08500: チャネル ch1: sid=8 devtype=DISK

RMAN-03022: コンパイル・コマンド: recover

RMAN-03022: コンパイル・コマンド: recover(1)
RMAN-03023: 実行コマンド: partial resync
RMAN-08003: リカバリ・カタログの部分再同期を開始します。
RMAN-08005: 部分再同期完了

RMAN-03022: コンパイル・コマンド: recover(2)

RMAN-03022: コンパイル・コマンド: recover(3)
RMAN-03023: 実行コマンド: recover(3)
RMAN-08054: メディアのリカバリを開始します。

RMAN-03022: コンパイル・コマンド: recover(4)
RMAN-06050: アーカイブログ・スレッド 1、順序 3は、ファイル /rman/admin/t
ar816/arch/arch_1_3.arcとしてディスクにあります。
RMAN-06050: アーカイブログ・スレッド 1、順序 4は、ファイル /rman/admin/t
ar816/arch/arch_1_4.arcとしてディスクにあります。
RMAN-06050: アーカイブログ・スレッド 1、順序 5は、ファイル /rman/admin/t
ar816/arch/arch_1_5.arcとしてディスクにあります。
<< 中略 >>
RMAN-06050: アーカイブログ・スレッド 1、順序 33は、ファイル /rman/admin/
tar816/arch/arch_1_33.arcとしてディスクにあります。
RMAN-06050: アーカイブログ・スレッド 1、順序 34は、ファイル /rman/oradat
a/tar816/redo03.logとしてディスクにあります。
RMAN-06050: アーカイブログ・スレッド 1、順序 35は、ファイル /rman/oradat
a/tar816/redo02.logとしてディスクにあります。
RMAN-06050: アーカイブログ・スレッド 1、順序 36は、ファイル /rman/oradat
a/tar816/redo01.logとしてディスクにあります。
RMAN-03023: 実行コマンド: recover(4)
RMAN-08017: チャネル ch1: デフォルトの宛先へのアーカイブログの復旧を開始しています。
RMAN-08022: チャネル ch1: アーカイブログをリストアしています。
RMAN-08510: アーカイブログ・スレッド=1 順序=2
RMAN-08023: チャネル ch1: バックアップ部分: 1がリストアされました。
RMAN-08511: 部分ハンドル=/chiyoda/rman/backup/arcTAR816_8_1 タグ=null パラメータ
=NULL
RMAN-08024: チャネル ch1: リストア完了
RMAN-08515: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_2.
arc スレッド=1 順序=2
RMAN-08515: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_3.
arc スレッド=1 順序=3
RMAN-08515: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_4.
arc スレッド=1 順序=4
RMAN-08515: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_5.
arc スレッド=1 順序=5
<< 中略 >>
RMAN-08515: アーカイブログ・ファイル名=/rman/admin/tar816/arch/arch_1_33
.arc スレッド=1 順序=33
RMAN-08515: アーカイブログ・ファイル名=/rman/oradata/tar816/redo03.log
スレッド=1 順序=34
RMAN-08515: アーカイブログ・ファイル名=/rman/oradata/tar816/redo02.log
スレッド=1 順序=35
RMAN-08515: アーカイブログ・ファイル名=/rman/oradata/tar816/redo01.log
スレッド=1 順序=36
RMAN-08055: メディアのリカバリが完了しました。

RMAN-03022: コンパイル・コマンド: sql
RMAN-06162: SQL文: alter database open resetlogs
RMAN-03023: 実行コマンド: sql
RMAN-08031: チャネル ch1をリリースしました。

RMAN>
===============================================================================

ログより、オンラインのREDOログについても適用できていることがわかります。

7. データベースをresetlogsオプションをつけてopenしたため、
リカバリカタログにもそれを通知します。

RMAN> reset database;

8. 今後の障害のために、必ずバックアップを取得してください。

9. ローカル管理一時表領域を使用している場合には、TEMPファイルの追加が必要です。

補足:
RMANを使用しない制御ファイルの復旧方法については、Krown#15854にあります。
Oracle9iでは、リカバリカタログに最新のアーカイブログ情報がなかったとしても、
catalogコマンドでアーカイブログファイルを登録する必要はありませんので、
上記の手順とは異なります。

[更新履歴]
2003/10/06 Oracle9iについて補足事項を追記


キーワード:

制御ファイル 破壊 RMAN リカバリ RESTORE CONTROLFILE

No comments: