Oracle-トランザクション、ロールバックセグメント、およびundo_retentionパラメーターの仕組み

StackOverflow https://stackoverflow.com/questions/190693

  •  07-07-2019
  •  | 
  •  

質問

私はDBAではなく、Oracleのトランザクション管理プロセスを理解するのに少し苦労しています。

インターネット上の信頼できる外観のページを読んで理解したことから(最も注目すべきは、この AskTom note -ただし、コメントを気にしないでください)、トランザクションがコミットされると、新しいデータは not 報告されますまだ実際のデータブロックにありますが、ロールバックセグメントに記録されたままです。誰かがデータに対してSELECTを発行したとき、またはUNDO_RETENTION秒が経過したとき(これら2つのイベントのどちらか早い方)、データブロックに新しいデータが書き込まれます(その後のみ)。

しかし、おそらく知っていると思われる当社の誰かが最近私に反対を言った:彼によると、トランザクションがコミットされると、新しいデータはすぐにデータブロックに書き込まれ、 ロールバックセグメント/ UNDOテーブルスペースは、UNDO_RETENTION秒の間、古いデータを保持します。この古いデータは、トランザクションの前にSCNで起動されたクエリによるアクセスのために、この間利用可能なままです。

では、Oracleの内部で実際に何が起きているのでしょうか。また、返信をバックアップするためのリファレンスを提供できますか?

Oracle 9.2.0.8を使用しています。

事前に感謝します。

役に立ちましたか?

解決

ここで詳しく説明します!会社の人は基本的に正しいです。ただし、変更は、コミット前であっても、変更が行われるとメモリ内のデータブロックに書き込まれます。また、コミット時とは完全に独立してディスクに書き出されます(コミット操作の前、場合によっては後、コミット操作の一部としてではありません)。

1)UNDO_RETENTIONは、変更がメモリまたはディスクのいずれかのデータブロックに書き込まれる場合には関係ありません。 UNDO_RETENTIONは、変更をコミットした後、変更を元に戻すために必要なデータが保持される期間を制御します。目的は、コミット前に開始された他のクエリまたはシリアル化可能なトランザクションがそのデータを引き続き必要とする可能性があることです。参照: http://download.oracle.com /docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477

2)更新を行うと、メモリ内のデータブロックが変更されます。ディスクに書き込まれる場合と書き込まれない場合があります(コミットする前であっても)。これはバックグラウンドプロセスによって行われます。また、REDO情報はREDOログバッファに書き込まれます。元に戻すが生成され、元に戻すセグメントに保存されます。

3)コミットすると、OracleはREDO情報がディスクに書き込まれていることを確認し、UNDOデータをコミット済みとしてマークします。ただし、メモリ内の変更されたデータブロックをディスクに書き込むことも、戻って各ブロックをコミット済みとしてマークすることもありません。これは、コミットをできるだけ早くするためです。参照: http://download.oracle.com /docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628

4)メモリ内のデータブロックは、バックグラウンドプロセスによってディスクに書き出されるとき、または(SELECTまたはその他の操作によって)次回使用されるときに、コミット済みとしてマークされます。それがAskTomメモが議論していることです。これは、データへの変更がブロックに書き込まれるかどうかに関するものではありません。ブロック自体でコミット済みとしてマークされているかどうかについてです。

他のヒント

私の理解は(基本的に)後者であり、このリンクに詳細があります。

データブロックを書き込む必要はなく、バッファ内で更新するだけで、ディスクに書き込む場合と書き込まない場合があります。ただし、コミットを続行するには、REDOをディスクに書き込む必要があります。


に基づいて2番目のバージョンにも投票します このリンク(Oracle 10.2 9.2にも適用されると思います)。

言う: "トランザクションがコミットされた後、ロールバックまたはトランザクション回復の目的でUNDOデータは不要になりました。ただし、読み取りの一貫性を保つために、長時間実行されるクエリでは、データブロックの古いイメージを生成するために、この古い取り消し情報が必要になる場合があります。

and

"自動UNDO管理が有効な場合、常に現在のUNDO保存期間があります。これは、Oracle Databaseが古いUNDO情報を上書きする前に保持しようとする最小時間です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top