今日もなんだかいい天気♪

アクセスカウンタ

help リーダーに追加 RSS カレントじゃないオンラインREDOログファイルのリカバリ。

<<   作成日時 : 2008/08/20 22:47   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

カレントじゃなければ何も怖くない。
不完全リカバリもいらない。

これが障害前の状態。
================================================================================
SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
1 1 2 52428800 1 YES INACTIVE 946094 08-08-19
2 1 4 52428800 1 NO CURRENT 946644 08-08-19
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19
================================================================================

ちょこっと更新を加えておく。
これらの更新は、順序番号4のログに記録されることになるね。

================================================================================
SQL> insert into test99.test99 values(50000,'YYYYY',sysdate);

1行が作成されました。

SQL> insert into test99.test99 values(60000,'ZZZZZ',sysdate);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> alter system archive log current;

システムが変更されました。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
1 1 5 52428800 1 NO CURRENT 947765 08-08-19
2 1 4 52428800 1 YES ACTIVE 946644 08-08-19
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19
================================================================================

んじゃ、障害を起こします。
ちょっとデータベースをシャットダウンしておいて・・・。

================================================================================
SQL> shutdown immediate;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
================================================================================

redo02.logをなくしてしまいます。
なぜredo02.logかといえば、今はロググループ1(redo01.log)がカレントだけど、
もし次にログスイッチが発生しても、次にカレントになるのはロググループ3だから。
ロググループ2がカレントになることはないだろう、と思ったから。

================================================================================
[oracle@localhost onlinelog]$ ls -l
合計 153780
-rw-r----- 1 oracle dba 52429312 8月 19 23:18 redo01.log
-rw-r----- 1 oracle dba 52429312 8月 19 23:15 redo02.log
-rw-r----- 1 oracle dba 52429312 8月 19 22:41 redo03.log
[oracle@localhost onlinelog]$ mv redo02.log redo02.bak
[oracle@localhost onlinelog]$ ls -l
合計 153780
-rw-r----- 1 oracle dba 52429312 8月 19 23:18 redo01.log
-rw-r----- 1 oracle dba 52429312 8月 19 23:15 redo02.bak
-rw-r----- 1 oracle dba 52429312 8月 19 22:41 redo03.log
================================================================================

さて、データベース起動。
ここでエラーが起こる。

================================================================================
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area 146800640 bytes
Fixed Size 1257668 bytes
Variable Size 71307068 bytes
Database Buffers 71303168 bytes
Redo Buffers 2932736 bytes
データベースがマウントされました。
ORA-00313: ログ・グループ2(スレッド1)のメンバーをオープンできません。
ORA-00312: オンライン・ログ2 スレッド1: '/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/onlinelog/redo02.log'
================================================================================

めでたしめでたし。
で、REDOログの状態を確認。

================================================================================
SQL> select * from v$log;


GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
1 1 5 52428800 1 NO CURRENT 947765 08-08-19
2 1 4 52428800 1 YES INACTIVE 946644 08-08-19
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19

SQL> select group#,status,type,member from v$logfile;

GROUP# STATUS TYPE MEMBER
---------- ------- ------- ---------------------------------------------------------------------------
1 ONLINE /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/onlinelog/redo01.log
2 ONLINE /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/onlinelog/redo02.log
3 ONLINE /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/onlinelog/redo03.log
================================================================================

これをみても、障害を確認することはできないんだね。
障害の内容を確認するには、アラートログを見た方がいい。

以下がアラートログの内容。
================================================================================
Tue Aug 19 23:22:50 2008
Errors in file /usr/lib/oracle/xe/app/oracle/admin/XE/bdump/xe_lgwr_22303.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/on
linelog/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Tue Aug 19 23:22:50 2008
Errors in file /usr/lib/oracle/xe/app/oracle/admin/XE/bdump/xe_lgwr_22303.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/on
linelog/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
================================================================================

で、障害のあるREDOロググループ2を削除する。

================================================================================
SQL> alter database drop logfile group 2;

データベースが変更されました。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19
1 1 5 52428800 1 NO CURRENT 947765 08-08-19
================================================================================

そして、REDOロググループ2を追加する。

================================================================================
SQL> alter database add logfile group 2 '/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/onlinelog/redo02.log' size 50m;

データベースが変更されました。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
1 1 5 52428800 1 NO CURRENT 947765 08-08-19
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19
2 1 0 52428800 1 YES UNUSED 0
================================================================================

新品のロググループ2(STATUSがUNUSED)ができている。
ファイルもちゃんとできている。

================================================================================
[oracle@localhost onlinelog]$ ls -l
合計 205040
-rw-r----- 1 oracle dba 52429312 8月 19 23:22 redo01.log
-rw-r----- 1 oracle dba 52429312 8月 19 23:15 redo02.bak
-rw-r----- 1 oracle dba 52429312 8月 19 23:53 redo02.log
-rw-r----- 1 oracle dba 52429312 8月 19 22:41 redo03.log
================================================================================

↓順序番号4の変更もちゃんと残っている。いい感じだ。

================================================================================
SQL> select * from test99.test99 where col1 >= 40000;

COL1 COL2 COL3
---------- -------------------- --------
40000 XXXXX 08-08-19
50000 YYYYY 08-08-19
60000 ZZZZZ 08-08-19
================================================================================

でも、オンラインREDOログには順序番号4がない。
でも、順序番号4はアーカイブされている。
だから、リカバリには支障がないはず。

================================================================================
SQL> select recid,sequence#,name from v$archived_log where name is not null order by 1;

RECID SEQUENCE# NAME
---------- ---------- ------------------------------------------------------------------------------------
94 4 /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_4_663201099.dbf
================================================================================

ログスイッチを起こすと、どうなるんだろう。

================================================================================
SQL> alter system switch logfile;

システムが変更されました。

SQL> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TI
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------
1 1 5 52428800 1 YES ACTIVE 947765 08-08-19
2 1 6 52428800 1 NO CURRENT 948380 08-08-20
3 1 3 52428800 1 YES INACTIVE 946563 08-08-19
================================================================================

やっぱり4番がない(当たり前)。
なんだか気持ち悪い。

これでちゃんとリカバリできるのか、ためしてみた。

================================================================================
RMAN> shutdown immediate;

データベースがクローズしました
データベースがディスマウントされました。
Oracleインスタンスがシャットダウンしました

RMAN> startup mount

ターゲット・データベースに接続しました(起動していません)。
Oracleインスタンスが起動しました
データベースがマウントされました。

システム・グローバル領域の合計は、 146800640バイトです。

Fixed Size 1257668バイト
Variable Size 71307068バイト
Database Buffers 71303168バイト
Redo Buffers 2932736バイト

RMAN> restore database;

restoreが開始されました(開始時間: 08-08-20)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: sid=36 devtype=DISK

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています。
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
データファイル00001を/usr/lib/oracle/xe/oradata/XE/system.dbfへリストア
データファイル00002を/usr/lib/oracle/xe/oradata/XE/undo.dbfへリストア
データファイル00003を/usr/lib/oracle/xe/oradata/XE/sysaux.dbfへリストア
データファイル00004を/usr/lib/oracle/xe/oradata/XE/users.dbfへリストア
データファイル00005を/usr/lib/oracle/xe/oradata/XE/rman01.dbfへリストア
データファイル00006を/usr/lib/oracle/xe/oradata/XE/imptsp01.dbfへリストア
データファイル00007を/usr/lib/oracle/xe/oradata/XE/usrtsp_01.dbfへリストア
チャネルORA_DISK_1: バックアップ・ピース/usr/lib/oracle/xe/oradata_bak/rman/bk0_119_1_663201466から読取り中です
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
ピース・ハンドル=/usr/lib/oracle/xe/oradata_bak/rman/bk0_119_1_663201466 タグ=TAG20080819T223745
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:02:57
restoreが完了しました(完了時間: 08-08-20)

RMAN> recover database until sequence 7 thread 1;

recoverが開始されました(開始時間: 08-08-20)
チャネルORA_DISK_1の使用

メディア・リカバリを開始しています

アーカイブ・ログ・スレッド: 1、順序: 4は、ファイル: /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_4_663201099.dbfとしてディスクに存在します
アーカイブ・ログ・スレッド: 1、順序: 5は、ファイル: /usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_5_663201099.dbfとしてディスクに存在します
チャネルORA_DISK_1: デフォルトの宛先へのアーカイブ・ログのリストアを開始しています
チャネルORA_DISK_1: アーカイブ・ログをリストアしています
アーカイブ・ログ・スレッド=1 順序=3
チャネルORA_DISK_1: バックアップ・ピース/usr/lib/oracle/xe/oradata_bak/rman/arc_121_1_663201676から読取り中です
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
ピース・ハンドル=/usr/lib/oracle/xe/oradata_bak/rman/arc_121_1_663201676 タグ=TAG20080819T224116
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:01
アーカイブ・ログ・ファイル名=/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_3_663201099.dbf スレッド=1 順序=3
アーカイブ・ログ・ファイル名=/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_4_663201099.dbf スレッド=1 順序=4
アーカイブ・ログ・ファイル名=/usr/lib/oracle/xe/app/oracle/flash_recovery_area/XE/archivelog/1_5_663201099.dbf スレッド=1 順序=5
アーカイブ・ログが見つかりません
アーカイブ・ログ・スレッド=1 順序=6
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recoverコマンドが08/20/2008 00:32:53で失敗しました
RMAN-06054: メディア・リカバリが不明なログをリクエストしています: スレッド: 1 seq: 6 lowscn: 948380

RMAN> alter database open resetlogs;

データベースがオープンしました。

RMAN> exit
================================================================================

5番までしかアーカイブされていないのに、6番までリカバリするように指定した(until sequence 7)もんだからエラーが出た(汗)。
でも大丈夫。
ログを見てわかるとおり、5番まではちゃんと適用されているのだ。
・・・でも、単に4番を使ってリカバリできるかどうかのチェックなんだから、不完全リカバリする必要はまったくなかったな。
まぁいいや。

↓ちゃんとリカバリされているのは確認できた。

================================================================================
SQL> select * from test99.test99 where col1 >= 40000;

COL1 COL2 COL3
---------- -------------------- --------
40000 XXXXX 08-08-19
50000 YYYYY 08-08-19
60000 ZZZZZ 08-08-19
================================================================================

さて、resetlogsしたから、またフルバックアップとっておかなくちゃ。

設定テーマ

注目テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文