クラウドで 伸びる人沈む人 |
|
|
|
OracleのREDOログファイル
<概要> REDOログファイルは、オラクルの作業記録を記したファイルです。 オラクルがやった作業を、どんどんこのファイルに追記していきます。まずは、そう覚えましょう。 作業記録がどんどん追記されるということは、ファイルサイズが大きくなりすぎて困ってしまうのでは? そのへんの制御はどうするのでしょうか。 また、作業記録が残るということは、当然リカバリーに必要なファイルとうことです。 消失したら困ります。ミラーリング(二重運用)して万全を期したいですが、そのへんはどうするのでしょうか。 このように、ちょっと考えただけでも、REDOログファイルは、ファイルサイズとミラーリングの問題がありそうですね。 でも、大丈夫。オラクルはうまい方法を考えてあります。ここでは、そのアーキテクチャを存分に理解してください。 では、いってみます。 <1.ローテーション(グループ)> REDOログファイルはオラクルの作業記録がどんどん追記されるのですが、 永遠にファイルに追記されていったら、ファイルサイズが大きくなりすぎて手に負えません。 そこで、ローテーションを組んで、ファイルが大きくなりすぎない仕組みになっています。 ファイルがある一定の大きさになったら、書き込みを次のファイルに移すのです。 このローテーションの単位をグループと呼びます。 下図をみてください。グループ1に作業記録が追記されて、満杯になったらグループ2にスイッチ。 同様に、グループ3、グループ4、グループ5と。で、一巡して、またグループ1に戻ってきて、 ひたすら作業記録を上書きしていきます。 ちょっと待てよ?! 一巡したら、昔の作業記録が消失してしまうじゃねえか? そう思った方いますよね。(私もそう思った) でも、そのとおりなのです。一巡すると昔の作業記録は、REDOログファイルから無くなります。 ですが、大丈夫です。REDOログファイルから無くなりますが、アーカイブログとういファイルに別途保存されていくのです。 (詳細な説明は、アーカイブの章に譲ります) ここでは、REDOログはローテーションで追記されていく。そして、そのローテーションの単位をグループと呼びます。 そう覚えておきましょう。 ちなみに、現在、書き込み中のREDOログファイルのグループは、以下のSQLでわかります。 STATUS='CURRENT'がそうです。 SQL> select group#, status from v$log 2 / GROUP# STATUS ---------- ---------------- 1 INACTIVE 2 CURRENT 3 INACTIVE 4 INACTIVE 5 INACTIVE <2.ミラーリング(メンバー)> さて、上で「ローテーションの単位をグループと呼びます」と言いましたが、 ところで、グループっていわれても、いまいちピンとこないのではないでしょうか。 下図で説明していきましょう。グループには、メンバーが登録されていますね。 メンバーというと、さらにわからなくなりそうですが、メンバーとは要するにファイルのことです。 上の例で言うと、「グループ1には、ファイルが3つあります」そういうことを表しています。 もちろん、このファイル(メンバー)は、3つでも4つでもOKです。その数字は、変更できます。 で、この3つのファイル内容は全く同一のものなのです。ただ、格納場所(ディレクトリ)が違うだけ。 そういうことなのです。 ファイル内容が同一で格納場所が違う。つまり、ミラーリングですね。グループには複数のファイルが登録されていて、 そのファイルをメンバーと言う。これが、REDOログファイルのアーキテクチャです。 <3.REDOログファイルの場所> グループとメンバー、そしてローテーション。この概念をしっかり覚えたならば、 実際にそのファイル(メンバー)は、どこに格納されているのか? それをみていきしょう。まずは、以下のSQLをたたいてみましょう。 SQL> select GROUP#, MEMBER from v$logfile GROUP# MEMBER --------------------------------------------------------------- 1 C:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO01.LOG 1 D:\ORACLE\REDO_BACK\REDO01.LOG 2 C:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO02.LOG 2 D:\ORACLE\REDO_BACK\REDO02.LOG 3 C:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\REDO02.LOG 3 D:\ORACLE\REDO_BACK\REDO03.LOG おわかりですね。各グループに所属するメンバー(ファイル)がわかりましたよね。 上の例では、グループは3つ。各グループには、2メンバー(ファイル)です。 <4.ローテーションのカレントをずらしてみる> REDOログは複数のグループがあって、その複数のグループでローテーションを行い、書き込みをしているわけです。 (グループに所属しているメンバー(メンバー)の中身は、全く同じです) だから、ひとつのグループが仕事中で、残りのグループが休み。仕事をしているグループをカレントといいます。 で、そのカレントをずらしたい場合なんかがあります。 例えば、グループのメンバー(ファイル)をひとつ削除したい場合などは、カレントだと削除できません。 そんなとき、つまりカレントをずらしたい場合は、以下のSQLを実行してください。 SQL> alter system switch logfile カレントがずれたか、確かめてみましょう。 さっきは、グループ2が書き込み中でしたよね。 SQL> select group#, status from v$log 2 / GROUP# STATUS ---------- ---------------- 1 INACTIVE 2 INACTIVE 3 CURRENT 4 INACTIVE 5 INACTIVE 無事、グループ3がカレント(書き込み中)になったようです。 <5.ファイル(メンバー)を登録> ファイル(メンバー)の登録は、以下のSQLです。 alter database add logfile member 'ファイル名' to group グループ番号 例えば、グループ1に、REDO_TEST1.LOGを登録したい場合は、以下です。 SQL > alter database add logfile member 'c:\oracle\product\10.1.0\TEST\REDO_TEST1.LOG' to group 1 ここで、気をつけることがあります。 登録直後に以下のSQLを行ってみてください。 SQL> select group#, status from v$logfile where group#='1' 2 / GROUP# STATUS ---------- ------- 1 1 1 INVALID グループ1のひとつのステータスが、INVALIDになっています。 これは、先ほど追加したファイルが存在していないからです。 追加したディレクトリにファイルを置いておきましょう。(指定したファイルが無いのです) そして、オラクルを再起動すれば解消されます。 えっ?解消されなかった。あ、それは、まだシステムがローテーションの書き込みの順番になっていないからです。 SQL> alter system switch logfile で、カレントをグループ1にすると、解消されます。 <6.ファイル(メンバー)を変更> ファイルの変更は、以下のSQLで実行できます。 ALTER DATABASE RENAME FILE '変更前ののファイル名' TO '変更したいファイル名'; もちろん、5.で述べたように、変更したら、そこにファイル置いて再起動してくださいね。 <7.ファイル(メンバー)を削除> ファイルの削除は、以下のSQLで実行できます。 (削除って、物理的に削除しないで、REDOログファイルのメンバーから外すって意味ね) alter database drop logfile member 'ファイル名' ※注意 上記作業は、カレント(書き込み中)のログには適用できないので、 カレントの場合は、 SQL> alter system switch logfile を実行してくださいね。 |