ablog

不器用で落着きのない技術者のメモ

ORA-01242 の対処法の検証

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

必要なREDO情報がなくなっているためリカバリできなくなる。

リカバリできなくなったデータファイルを 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.