ORA-01242: data file suffered media failure: database in NOARCHIVELOG mode - ablog
について実機検証してみた。
まとめると、データファイルへの書込み権限が剥奪されたなどの理由で一時的にデータファイルへの書込みができなくなった場合は、対処後にインスタンスを起動すれば復旧可能。データファイルが破損した場合は、オフラインバックアップから障害発生までのREDO情報がオンラインREDOログに残っていれば復旧できるが、何回もログスイッチが行われて必要なREDO情報が消失してしまっているとそのデータファイルは復旧できない。データロストが発生する。
0. 事前準備
- ノーアーカイブログモードに変更する。
$ sqlplus / as sysdba SQL> startup mount SQL> alter database noarchivelog; SQL> archive log list Database log mode No Archive Mode ... SQL> alter database open SQL> exit
1. 一時的にデータファイルに書込みできないケースの検証
- データファイルへの書込み権限を剥奪する。
$ su - # cd /u01/app/oracle/oradata/orcl # chown root:root user01.dbf # su - oracle
- チェックポイントを発生させる。
$ sqlplus / as sysdba SQL> alter system checkpoint; alter system checkpoint * ERROR at line 1: ORA-03113: end-of-file on communication channel SQL> exit
- アラートログを確認する。
$ less /u01/app/oracle/product/10.2.0/db_1/rdbms/log/alert_orcl.log Errors in file /u01/app/oracle/product/10.2.0/db_1/rdbms/log/orcl_ckpt_4495.trc: ORA-01242: data file suffered media failure: database in NOARCHIVELOG mode ORA-01116: error in opening database file 4 ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/user01.dbf' ORA-27041: unable to open file Linux Error: 13: Permission denied Additional information: 3 Tue Jan 5 17:48:10 2010 CKPT: terminating instance due to error 1242
- データファイルへの書込み権限を付与する。
$ su - # cd /u01/app/oracle/oradata/orcl # chown oracle:oinstall user01.dbf # su - oracle
- インスタンスを起動する。
$ sqlplus / as sysdba
SQL> startup
ORACLE instance started.
...
Database opened.
2. データファイルが破損したケースの検証
オフラインバックアップを取得する
$ sqlplus / as sysdba SQL> shutdown immediate SQL> exit $ cd /u01/app/oracle/oradata/orcl $ cp -p user01.dbf user01.dbf.back $ sqlplus / as sysdba SQL> startup SQL> set linesize 200 SQL> select * from v$log; -- カレントのREDOログ・グループを確認する。 GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 12 104857600 2 NO CURRENT 316523 05-JAN-10 2 1 9 104857600 2 NO INACTIVE 249058 27-NOV-09 3 1 11 104857600 2 NO INACTIVE 296372 05-JAN-10 4 1 10 10485760 2 NO INACTIVE 275245 30-NOV-09 SQL> exit
ログスイッチ前のデータファイル破損からのリカバリ
- データファイルを壊す。
$ echo > users01.dbf
- データベースを停止する。
$ sqlplus / as sysdba SQL> shutdown abort ORACLE instance shut down. SQL> exit
- データファイルをリストアする。
$ cp -p user01.dbf.back user01.dbf
- インスタンスを起動する。
$ sqlplus / as sysdba SQL> startup ... Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/user01.dbf'
- ログスイッチしてないことを確認する。
SQL> set linesize 200 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 12 104857600 2 NO CURRENT 316523 05-JAN-10 4 1 10 10485760 2 NO INACTIVE 275245 30-NOV-09 3 1 11 104857600 2 NO INACTIVE 296372 05-JAN-10 2 1 9 104857600 2 NO INACTIVE 249058 27-NOV-09
- データベースをリカバリする。
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.
オフラインバックアップ後に2回ログスイッチした後のデータファイル破損からのリカバリ
- REDOログ・グループ3をカレントにする
SQL> set linesize 200 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 12 104857600 2 NO INACTIVE 316523 05-JAN-10 2 1 13 104857600 2 NO CURRENT 336798 05-JAN-10 3 1 11 104857600 2 NO INACTIVE 296372 05-JAN-10 4 1 10 10485760 2 NO INACTIVE 275245 30-NOV-09 SQL> alter system switch logfile; SQL> alter system switch logfile; SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 12 104857600 2 NO INACTIVE 316523 05-JAN-10 2 1 13 104857600 2 NO ACTIVE 336798 05-JAN-10 3 1 15 104857600 2 NO CURRENT 336927 05-JAN-10 4 1 14 10485760 2 NO ACTIVE 336924 05-JAN-10 SQL> exit
- データファイルを壊す。
$ echo > users01.dbf
- データベースを停止する。
$ sqlplus / as sysdba SQL> shutdown abort SQL> exit
- データファイルをリストアする
$ cp -p user01.dbf.back user01.dbf
- インスタンスを起動する。
$ sqlplus / as sysdba SQL> startup ... Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/user01.dbf' SQL> set linesize 200 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 12 104857600 2 NO INACTIVE 316523 05-JAN-10 2 1 13 104857600 2 NO ACTIVE 336798 05-JAN-10 3 1 15 104857600 2 NO CURRENT 336927 05-JAN-10 4 1 14 10485760 2 NO ACTIVE 336924 05-JAN-10 SQL> recover database; Media recovery complete. SQL> alter database open; Database altered.
オフラインバックアップ後に必要なREDOログ・グループが消失した後のデータファイル破損からのリカバリ
- カレントのREDOログ・グループを確認する。
SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 16 104857600 2 NO CURRENT 356929 05-JAN-10 2 1 13 104857600 2 NO INACTIVE 336798 05-JAN-10 3 1 15 104857600 2 NO INACTIVE 336927 05-JAN-10 4 1 14 10485760 2 NO INACTIVE 336924 05-JAN-10 SQL> exit
- データファイルを壊す。
$ echo > user01.dbf
- データベースを停止する。
$ sqlplus / as sysdba SQL> shutdown abort SQL> exit
- データファイルをリストアする。
$ cp -p user01.dbf.back user01.dbf
- インスタンスを起動する。
$ sqlplus / as sysdba SQL> startup ... Database mounted. ORA-01113: file 4 needs media recovery ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/user01.dbf' SQL> set linesize 200 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------- 1 1 16 104857600 2 NO CURRENT 356929 05-JAN-10 4 1 14 10485760 2 NO INACTIVE 336924 05-JAN-10 3 1 15 104857600 2 NO INACTIVE 336927 05-JAN-10 2 1 13 104857600 2 NO INACTIVE 336798 05-JAN-10 SQL> recover database; ORA-00279: change 316714 generated at 01/05/2010 17:55:23 needed for thread 1 ORA-00289: suggestion : /u01/app/oracle/product/10.2.0/db_1/dbs/arch1_12_699805707.dbf ORA-00280: change 316714 for thread 1 is in sequence #12 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} AUTO ORA-00308: cannot open archived log '/u01/app/oracle/product/10.2.0/db_1/dbs/arch1_12_699805707.dbf' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3 ORA-00308: cannot open archived log '/u01/app/oracle/product/10.2.0/db_1/dbs/arch1_12_699805707.dbf' ORA-27037: unable to obtain file status Linux Error: 2: No such file or directory Additional information: 3
リカバリできなくなったデータファイルを drop してデータベースをオープンする
- データファイルを drop する。
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' offline drop; Database altered.
- データベースをオープンする。
SQL> alter database open;
Database altered.
- インスタンスを停止してみる。
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
- インスタンスを起動してみる。
SQL> startup ORACLE instance started. ... Database mounted. Database opened.