小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


【Oracle】REDOログを削除して作り直す

はじめに

Oracle 11gでREDOログを削除して、作り直してみました。

環境
  • Windows Server 2008 R2
  • Oracle 11g Enterprise(11.2.0.1.0)
REDOファイルの確認

以下のクエリをsysユーザで実行すると、REDOログファイルの格納場所が分かります。

SELECT * FROM v$logfile;

f:id:replication:20150503235826p:plain
MEMBER#カラムに表示されているのがREDOログファイルです。メンバーはグループ(GROUP#)に所属しています。

REDOロググループの確認

REDOロググループの情報を表示するには、以下のクエリをsysユーザで実行します。

SELECT * FROM V$LOG;

f:id:replication:20150504000726p:plain

REDOロググループの削除

REDOロググループを削除するには、以下のクエリを実行します。

alter database drop logfile group n;

nの部分にはGROUPの番号を指定します。
REDOロググループは、削除できないケースがあります。

●次の場合、REDOロググループの削除はできない

・REDOロググループの削除によってインスタンス内のロググループが一つになってしまう場合
・アクティブなREDOロググループを削除しようとした場合
・アーカイブモードで稼動しているデータベースで、アーカイブされていないREDOロググループを削除しようとした場合
REDOログファイルのメンテナンス はてなブックマーク - REDOログファイルのメンテナンス

REDOロググループは、必ず2つ以上必要になり、削除することによってREDOロググループが1つになってしまう場合は、ORA-01567のエラーとなります。

ORA-01567:
ログ2を削除すると、インスタンスorcl(スレッド1)内の残りログ・ファイルが1つ以下になります

REDOログの追加

REDOロググループを追加するには、以下のクエリを実行します。
以下の例では、REDOロググループの4を追加しています。

alter database add logfile group 4

追加したばかりのロググループは、SEQUENCE#が0で、STATUSがUNUSEDになります。
f:id:replication:20150503215727p:plain

次のようなシチュエーションで、REDOロググループ6を追加して、REDOロググループ3を削除したいと思います。
f:id:replication:20150503220919p:plain

ステータスがCURRENTのREDOロググループを削除しようとすると、ORA-01623のエラーになります。

alter database drop logfile group 3;

ORA-01623: ログ3はインスタンスorcl(スレッド1)の現在のログです - 削除できません

この場合は、ログファイルをスイッチングしてCURRENTを切り替えます。

alter system switch logfile;

f:id:replication:20150503221826p:plain
REDOロググループ3を削除しようとしてみましたが、ORA-01624のエラーになってしまいました。
ACTIVE状態のREDOロググループは削除できないようです。

alter database drop logfile group 3;

ORA-01624: ログ3はインスタンスorcl(スレッド1)のクラッシュ・リカバリに必要です。

もういちどスイッチングします。

alter system switch logfile;

f:id:replication:20150503223137p:plain
REDOロググループ3のステータスがINACTIVEになりました。
この状態で、再度REDOロググループ3を削除すると、成功します。

SQL> alter database drop logfile group 3;
>データベースが変更されました。
SQL> alter database add logfile group 6;
データベースが変更されました。

f:id:replication:20150503223348p:plain