topimg.jpg


REDOログ概要

●REDOログ
・ロールフォワードに使用
・COMMITされた変更履歴データをREDOログファイルとしてデータファイルに保存
・メンバを多重化することによって、冗長化されている
・グループを多重化することによって、LGWRプロセスの書き込み処理が遅延しないようにしている
 (グループが一巡後のREDOログ書き込み時、上書きするREDOログがアーカイブ中だとLGWRはアーカイブが完了するまで待つ)
・UNDO表領域の更新情報も格納されている

REDOログ



●アーカイブログモード
・ARCHIVE LOGモード
オンラインバックアップと合わせて運用されることが多い
・NO ARCHIVE LOGモード
オフラインバックアップと合わせて運用されることが多い。オンラインREDOログの情報のみでロールフォワードできなくなった場合、オフラインバックアップ直後からしかリカバリできない

●UNDO
・ロールバックに使用
・UNDO表領域には複数のUNDOセグメントが作られる。処理中のトランザクションとUNDOセグメントが1:1で対応している。
・UNDOセグメント上の未COMMITのデータは上書きされないが、COMMIT後や一定時間経過後は上書きされる
・未COMMIT時の過去のデータを参照する必要がある場合、UNDOセグメント上のUNDO情報を利用する。ただし、処理中にUNDO情報が上書きされてしまうと、ORA-1555エラーが発生する。対策としては、UNDO情報の保持期間を長く設定する。

参考
6 REDOログの管理
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19224-02/onlineredo.htm
7 アーカイブREDOログの管理
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19224-02/archredo.htm
ORACLE MASTER Silver DBAポイント解説:第3回 制御ファイルとREDOログ・ファイルの管理
http://jibun.atmarkit.co.jp/lskill01/rensai/omsdb03/omsdb01.html

  
  1. 2010/03/07(日) 09:13:07|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0

Oracleの書き込み処理による待機イベント

●ディスクIO処理に起因する主要な待機イベント
・DBWRプロセスが遅延した場合の待機イベント
①free buffer waits(バッファキャッシュに空きがないときに発生する待機イベント)
DBWRプロセスがバッファキャッシュ上のデータを利用中のため、サーバプロセスが新たにディスクから読み込もうとしているデータをバッファキャッシュに載せることができず待ちが発生する
②buffer busy waits(同じブロックに対して同時アクセスがあった場合の競合による待機イベント)
③write complete waits(サーバプロセスがアクセスしようとしたブロックがDBWRプロセスによってディスクへ書き出し中だった際に発生する待機イベント)
DBWRプロセスがダーティバッファ(メモリ上の変更はされているが、ディスクには書き込まれていないバッファ)を書き出している最中に、サーバプロセスからダーティバッファ上のブロックに対してアクセスがあった場合、サーバプロセスはDBWRプロセスが該当ブロックの書き込みが完了するまで待たされる

・LGWRプロセスが遅延した場合の待機イベント
①log file paralle write(LGWRプロセスがディスク上のREDOログへ書き込む際に発生する待機イベント)
LGWRプロセスがディスクへの書き込み処理にかかる時間。サーバプロセスが待った時間ではないことに注意。
②log file sync(サーバプロセスがLGWRプロセスの書き込み処理待ちにより発生する待機イベント)
サーバプロセスがCOMMITする際にLGWRプロセスがディスクへREDOログを書き出している最中だった場合、LGWRプロセスの書き込み処理が完了するまでサーバプロセスは待つことになる。
③log buffer space(REDOログバッファへの書き込み)
サーバプロセスがREDO情報をメモリ上のREDOログバッファへ書き出す際に、REDOログバッファのサイズが不足している場合書き込めず待たされる。通常は10MBくらいあれば十分、らしい。



参考
データベースキャッシュの競合
http://www.slideshare.net/kesnke/ss-455490
第8章 手動によりI/Oを分散してみよう
http://perfopy.ashisuto.co.jp/oracle_performance_educ/8IO.html
  1. 2010/03/07(日) 06:27:32|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0

Oracleのバックアップ

●オンラインバックアップ(ホットバックアップ、非一貫性バックアップ)
・バックアップ時のデータベースの状態
OPEN状態で行う
・データファイルの状態
整合性がとれていないのデータファイル(非一貫性ファイル)
・バックアップ方法
「ALTER DATABASE BEGIN BACKUP,ALTER DATABASE END BACKUP」や「ALTER TABLESPACE [表領域名] BEGIN BACKUP,ALTERTABLESPACE [表領域名] END BACKUP」コマンドでバックアップを実行
・リストア後の流れ
リカバリ(REDOログを利用してCOMMITされた内容をデータファイルに反映)が必須

●オフラインバックアップ(コールドバックアップ、一貫性バックアップ)
・バックアップ時のデータベースの状態
SHUTDOWN状態で行う
・バックアップ対象
チェックポイント済みのデータファイル(一貫性ファイル)
・バックアップ方法
データファイルをそのままコピー
・リストア後の流れ
データファイルの一貫性が保たれているため、そのままデータベースをOPENできる

参考
第6回 運用計画による効果的なバックアップ法
http://www.atmarkit.co.jp/flinux/rensai/oracle06/oracle06.html
  1. 2010/03/07(日) 05:41:06|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0

Oracleの同期IOと非同期IOについて

●同期IO
・例
Oracle内で、
①プロセス1のCPU処理
②プロセス1のIO処理
③プロセス2のCPU処理
④プロセス2のIO処理
の4つの処理あると仮定すると、同期IOでは①→②→③→④の順でしか処理ができない。なぜならば、ディスクへの書き込みが完了するまでプロセスはスリープ状態になり、次のプロセスを開始できないためだ。この方式の場合、CPU、IOの処理に余裕があるときに、一方の処理が開始できないため、効率的にリソースを利用できない。

・特徴
通常のプロセスのディスクへの書き込み処理は、
プロセス→OSのバッファキャッシュ→ファイル
の順で行われ、書き込み処理自体はOSのバッファキャッシュへの書き込みが完了した時点で結果がプロセスへ返される。

Oracleの場合、プロセス(DBWRプロセスやLGWRプロセス)のディスクへの書き込み処理は、
Oracleのバッファキャッシュ→プロセス→OSのバッファキャッシュ→データファイル
の順で行われるが、プロセス(DBWRプロセスやLGWRプロセス)のディスクへの書き込み処理は、データファイルに物理的に書き込みが完了しないと処理が完了しない。

そのため、Oracleのディスク書き込み処理は、通常のプロセスの処理に比べ、時間がかかる方式となっている。このような方式になっている理由は、メモリ上のデータとディスク上のデータの整合性を保つ必要があるからだ。Oracleは、ディスク上のデータファイルをオープンするときO_SYNCフラグ(ファイルを同期IOモードでオープンし、write()処理が完了するまでプロセスに結果を返さない)を用いてwrite()を実行している。




●非同期IO
・例
Oracle内で、
①プロセス1のCPU処理
②プロセス1のIO処理
③プロセス2のCPU処理
④プロセス2のIO処理
の4つの処理あると仮定すると、非同期IOでは①→②、③→④が並行して処理される。非同期IOモードでは、ディスクへの書き込みが完了する前に、次のプロセス処理を先に実行することができる。この方式の場合、CPU、IO処理をそれぞれ連続で実行できるため、効率的にリソースを利用できる。

・特徴
Linux版Oracleは、9i R2より非同期IOのサポートを開始している。デフォルトでは非同期IOを利用する設定になっていない。
(非同期IOの対応・デフォルト設定に関しては、OSやOracleのバージョンによって異なるため、上記は一概には言えない。)

非同期IOによって、IO処理が完了する前にどんどん次の書き込み命令を出すことができるので、プロセスのCPU処理とディスクIO処理を並行して行うことが可能になる。そのため、Oracleの処理全体も効率化され性能の向上につながる。
(非同期IOのメモリとディスクのデータ整合性担保の問題は、どう対応したのだろうか・・・)

当然OS側での非同期IOの対応も必要だが、Oracleインストール時にlibaioパッケージをちゃんと入れているから大丈夫、多分。
(OS側でなんらかの設定変更必要なのだろうか?)

●Direct IO
同期IO処理における、
Oracleのバッファキャッシュ→プロセス→OSのバッファキャッシュ→データファイル
の中で、「OSのバッファキャッシュ」への書き込み(いわゆる、プロセスとOSカーネル間とのデータのやりとり)は余計な部分であり、その分オーバヘッドになっている。
Direct IOモードでは、
Oracleのバッファキャッシュ→プロセス→データファイル
のように、OSのバッファキャッシュへ書き込みをすることなく、プロセスが直接データファイルに書き込み可能になる。それによって、性能の若干の向上と、メモリ使用量の抑制につながる。

Direct IOは、O_DIRECTフラグを使ってファイルをオープンしているので、RAWデバイスのようなOS側での設定変更は不要。

参考
りなっくす奮闘記 その17 非同期I/OとDirectI/Oを使ってみよう
http://www.oracle.co.jp/2shin/ora83/22_23.html
openとO_SYNC
http://rarfaxp.riken.go.jp/~baba/tips/opensync.html
Linux上のOracle Real Application Clustersの記憶領域オプション
http://otndnld.oracle.co.jp/tech/linux_win/pdf/rac_wp.pdf




なお、非同期IOとDirect IOは同時設定可能である。

FILESYTEMIO_OPTIONSは、次のいずれかの値に設定できます。
ASYNCH: ファイル・システム・ファイル上の非同期I/Oを有効にします。非同期I/Oでは、転送に対する時間的な要件はありません。
DIRECTIO: ファイル・システム・ファイル上の直接I/Oを有効にします。直接I/Oでは、バッファ・キャッシュがバイパスされます。
SETALL: ファイル・システム・ファイル上の非同期および直接I/Oを有効にします。
NONE: ファイル・システム・ファイル上の非同期および直接I/Oを無効にします。


引用
Oracle Database パフォーマンス・チューニング・ガイド10gリリース2(10.2)9 オペレーティング・システム・リソース
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/ch23_os.htm
  1. 2010/03/07(日) 05:32:24|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0

Oracleの起動と停止

●Oracleの起動(①~④の順の状態で推移)
①SHUTDOWN 
インスタンス(バックグランドプロセス群+共有メモリ)が停止した状態。
②NOMOUNT 
初期化パラメータファイルを読み込み、インスタンスが立ち上がった状態。SHUTDOWN状態からstartup nomountで起動
③MOUNT 
制御ファイル、データファイル、REDOログファイル等のファイルを読み込んだ状態。NOMOUNT状態からalter database mountで起動。
④OPEN 
データファイル、REDOログの検査が問題なく完了し、SQLを受け付け可能な状態。MOUNT状態からalter database openで起動。通常は、startupでSHUTDOWN状態から一気にOPNE状態になる。


●Oracleの停止
OPEN状態のデータベースをSHUTDOWN状態にするには、shutdownコマンドを実行する。起動時と逆で、データベースがクローズされてからインスタンスが停止する(MOUNT→NOMOUNTの順番)。なお、オプションにabortを付けた場合以外は、インスタンスリカバリ(次回起動時にREDOログを利用してデータファイルに書き込まれなかった変更済みデータを書き込む)によってデータの復旧が行われる。
 ・オプションなし(デフォルト) 全ての接続が終了してからSHUTDOWN状態にする。
 ・transactional トランザクションが終了したら接続を切り、SHUTDOWN状態にする。
 ・immediate 接続の終了を待たずにSHUTDOWN状態にする。そのため、コミットされていないデータは失われる。
 ・abort 接続の終了を待たずにSHUTDOWN状態にする。そのため、コミットされていないデータは失われる。
 

参考
  
  1. 2010/03/01(月) 03:47:23|
  2. oracle
  3. | トラックバック:0
  4. | コメント:0
前のページ 次のページ