制御ファイルの再作成方法
今回は、create controlfileを使用した制御ファイルの再作成手順についてご紹介します。
キーワード:制御ファイル 再作成 ORA-01190 ORA-19909
1. 概要
手順概要:
トレースファイルに制御ファイル再作成のスクリプトを作成し、
それを使用して制御ファイルを再作成する。
どういうときに実施するのか:
(A) 制御ファイル(control file)が(複製も含めて全て)破損した場合
(B) 他のデータファイルと比較して、制御ファイルが古い場合
・バックアップ時の手順ミス等により発生
・resetlogsでのopen時に下記エラーが出力
ORA-01190: control file or data file 37 is from before the last RESETLOGS
(ORA-01190 制御ファイルまたはデータ・ファイルnは最後のRESETLOGS以前のものです。)
・recover database実行時に、下記エラーが出力
ORA-19909: datafile 1 belongs to an orphan incarnation
(ORA-19909: データファイル1は孤立したインカネーションに属しています)
(C) 制御ファイルのパラメータを変更する必要がある場合
条件:
データベースがmount可能なこと
環境:
制限は特になし。下記検証は、Oracle Linux6 11.2.0.4で実施
注意:
本手順を試される前に、必ずDBのバックアップを取得下さい。
バックアップ/リカバリは環境によって方法が異なる場合があります。
本手順はあくまで検証用の手順となります。本番環境では実施しないでください。
影響などが発生した場合の責任は取り兼ねます。
参考:
Oracle Database SQL言語リファレンス 11cリリース1 (11.2)CREATE CONTROLFILE
2. 手順
①DBをシャットダウン
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
②制御ファイルのバックアップを取得
$ cp /u01/app/oracle1102/oradata/ora1102/control01.ctl /home/oracle/backup/control01.ctl.bk
③DBをマウント状態にする
SQL> startup mount
ORACLEインスタンスが起動しました。
Total System Global Area 592977920 bytes
Fixed Size 2255392 bytes
Variable Size 163579360 bytes
Database Buffers 419430400 bytes
Redo Buffers 7712768 bytes
データベースがマウントされました。
④制御ファイルを、.trc形式にて作成する
SQL> alter database backup controlfile to trace;
データベースが変更されました。
⑤トレースファイルの名前を確認する
SQL> show parameter user_dump_dest
NAME TYPE VALUE
------------- ---------- ------------------------------
user_dump_des string /u01/app/oracle1102/diag/rdbms/ora1102/ora1102/trace
$ cd $ORACLE_BASE/diag/rdbms/[DB名]/[DB名]/trace/
$ ls -ltr
[中略]
-rw-r----- 1 oracle oinstall 7093 *月 ** **:** 2018 ora1102_ora_5798.trc
※一番下の最新のトレースファイルを確認する
(-t : 更新時間順にソート -r : 逆順にソート)
⑥ ⑤で確認した当該の.trcファイルを下記の部分以外を消す。
$vi ora1102_ora_5798.trc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CREATE CONTROLFILE REUSE DATABASE "ORA1102" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle1102/oradata/ora1102/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle1102/oradata/ora1102/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle1102/oradata/ora1102/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle1102/oradata/ora1102/system01.dbf',
'/u01/app/oracle1102/oradata/ora1102/sysaux01.dbf',
'/u01/app/oracle1102/oradata/ora1102/undotbs01.dbf',
'/u01/app/oracle1102/oradata/ora1102/users01.dbf'
CHARACTER SET AL32UTF8
;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※制御ファイルの設定を変更しない場合は、上記の"CREATE CONTROLFILE"~"CHARACTER SET ****"までを残す
※制御ファイルのパラメータを変更したい場合は、上記作成時にパラメータを変更する
⑦DBをシャットダウンする
SQL> shutdown immediate
ORA-01109: データベースがオープンされていません。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
⑧DBをnomountで起動する
SQL> startup nomount
ORACLEインスタンスが起動しました。
Total System Global Area 592977920 bytes
Fixed Size 2255392 bytes
Variable Size 163579360 bytes
Database Buffers 419430400 bytes
Redo Buffers 7712768 bytes
⑨制御ファイルを再作成
SQL> @ora1102_ora_5798.trc
制御ファイルが作成されました。
※⑥で作成したスクリプトを実行
※制御ファイルを再作成すると、自動的にマウントモードになる
※事前に当該のファイルがあるディレクトリまで移動しておく
⑩DBをrecover
SQL> recover database until cancel using backup controlfile
ORA-00279: ??1801748(04/19/2018 16:51:39???)??????1?????
ORA-00289:
????????????:/u01/app/oracle1102/fast_recovery_area/ORA1102/archivelog/2018_04_1
9/o1_mf_1_1_%u_.arc
ORA-00280: ??1801748(????1)?????1???????
ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle1102/oradata/ora1102/redo01.log
ログが適用されました。
メディア・リカバリが完了しました。
※上記コマンド実行時に、redoのファイルを入力する必要がある。(redoが複数ある場合は順番に入力)
例:/u01/app/oracle1102/oradata/ora1102/redo01.log
⑪DBをopenする
SQL> alter database open resetlogs ;
データベースが変更されました。
⑫一時表領域を追加する
SQL> alter tablespace TEMP add tempfile '/u01/app/oracle1102/oradata/ora1102/temp01.dbf' reuse;
表領域が変更されました。
※制御ファイル再作成後は、必ずバックアップを取得して下さい
以上です。