ablog

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

ユーザ管理の完全リカバリ

Oracle Database でユーザ管理、つまり rman を使わないでデータファイル障害から完全リカバリする手順のまとめ。

リカバリ方法の種類

1. クローズデータベースのリカバリ
    • SYSTEM表領域、UNDO表領域に属するデータファイルをリカバリする場合
2.1. オープンデータベースのリカバリ(障害発覚時にインスタンスは起動)
    • SYSTEM表領域、UNDO表領域以外に属するデータファイルをリカバリする場合
    • データベースがオープンしている場合
2.2. オープンデータベースのリカバリ(障害発覚時にインスタンスは停止)
    • SYSTEM表領域、UNDO表領域以外に属するデータファイルをリカバリする場合
    • データベースが停止している場合

リカバリ手順

0. リカバリが必要なデータファイルを確認する
$ sqlplus / as sysdba
SQL> startup mount
SQL> set linesize 200
col df# format 999
col df_name format a50
col tbsp_name format a7
col status format a7
col error format a20
col change# format 99999999
select r.file# as df#, d.name as df_name, t.name as tbsp_name,
       d.status, r.error, r.change#, r.time
from v$recover_file r, v$datafile d, v$tablespace t
where t.ts# = d.ts#
and d.file# = r.file#;

 DF# DF_NAME                                            TBSP_NA STATUS  ERROR                  CHANGE# TIME
---- -------------------------------------------------- ------- ------- -------------------- --------- ----------
   1 /u01/app/oracle/oradata/orcl/system01.dbf          SYSTEM  SYSTEM  FILE NOT FOUND               0
   2 /u01/app/oracle/oradata/orcl/undotbs01.dbf         UNDOTBS ONLINE  FILE NOT FOUND               0
1. クローズデータベースのリカバリ
SQL> shutdown immediate
  • リカバリが必要なデータファイルをリストアする。
$ cp  /u01/app/oracle/oradata/orcl.org/system01.dbf  /u01/app/oracle/oradata/orcl/
$ cp  /u01/app/oracle/oradata/orcl.org/undotbs01.dbf  /u01/app/oracle/oradata/orcl/
  • データベースをマウントする。
$ sqlplus / as sysdba
SQL> startup mount
  • 全てのデータファイルをオンラインにする。
    • NORMALモードでオフラインにされたオフライン表領域、読取り専用表領域に属するデータファイル以外を全てオンラインにする。
$ sqlplus -s / as sysdba <<EOF
set pagesize 0
set head off
set feed off
spool onlineall.sql
select 'alter database datafile '''||name||''' online;' from v\$datafile;
spool off
EOF
$ sqlplus / as sysdba
SQL> @onlineall
SQL> set autorecovery on
SQL> recover database
  • データベースをオープンする。
SQL> alter database open;
2.1. オープンデータベースのリカバリ(障害発覚時にインスタンスは起動)
  • 破損したデータファイルをオフラインにする。
$ sqlplus / as sysdba
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' offline;
  • データファイルがオフラインになっていることを確認する。
SQL> set linesize 200
SQL> col name for a60
SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
/u01/app/oracle/oradata/orcl/system01.dbf                    SYSTEM
/u01/app/oracle/oradata/orcl/undotbs01.dbf                   ONLINE
/u01/app/oracle/oradata/orcl/sysaux01.dbf                    ONLINE
/u01/app/oracle/oradata/orcl/user01.dbf                      RECOVER
  • リカバリが必要なデータファイルをリストアする。
$ cp /u01/app/oracle/oradata/orcl.org/user01.dbf /u01/app/oracle/oradata/orcl/
  • リストアしたデータファイルをリカバリする。
$ sqlplus / as sysdba
SQL> set autorecovery on
SQL> recover datafile '/u01/app/oracle/oradata/orcl/user01.dbf';
  • データファイルをオンラインに戻す。
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' online;
  • データファイルがオンラインになっていることを確認する。
SQL> set linesize 200
SQL> col name for a60
SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
/u01/app/oracle/oradata/orcl/system01.dbf                    SYSTEM
/u01/app/oracle/oradata/orcl/undotbs01.dbf                   ONLINE
/u01/app/oracle/oradata/orcl/sysaux01.dbf                    ONLINE
/u01/app/oracle/oradata/orcl/user01.dbf                      ONLINE
2.2. オープンデータベースのリカバリ(障害発覚時にインスタンスは停止)
  • データベースをマウントする。
$ sqlplus / as sysdba
SQL> startup mount
  • 破損したデータファイルををオフラインにする。
$ sqlplus / as sysdba
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' offline;
  • データファイルがオフラインになっていることを確認する。
SQL> set linesize 200
SQL> col name for a60
SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
/u01/app/oracle/oradata/orcl/system01.dbf                    SYSTEM
/u01/app/oracle/oradata/orcl/undotbs01.dbf                   ONLINE
/u01/app/oracle/oradata/orcl/sysaux01.dbf                    ONLINE
/u01/app/oracle/oradata/orcl/user01.dbf                      RECOVER
  • データベースをオープンする。
SQL> alter database open;
  • リカバリが必要なデータファイルをリストアする。
$ cp /u01/app/oracle/oradata/orcl.org/user01.dbf /u01/app/oracle/oradata/orcl/
  • リストアしたデータファイルをリカバリする。
$ sqlplus / as sysdba
SQL> set autorecovery on
SQL> recover datafile '/u01/app/oracle/oradata/orcl/user01.dbf';

「Specify log: {=suggested | filename | AUTO | CANCEL}」と言ってきたら、「AUTO」と入力する。

  • データファイルをオンラインに戻す。
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/user01.dbf' online;
  • データファイルがオンラインになっていることを確認する。
SQL> set linesize 200
SQL> col name for a60
SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
/u01/app/oracle/oradata/orcl/system01.dbf                    SYSTEM
/u01/app/oracle/oradata/orcl/undotbs01.dbf                   ONLINE
/u01/app/oracle/oradata/orcl/sysaux01.dbf                    ONLINE
/u01/app/oracle/oradata/orcl/user01.dbf                      ONLINE