大規模な書き込み(テーブルの挿入と作成)の負荷がかかっているときに、Oracle RACがテーブルスペースを拡張する必要がある場合、すべての書き込みアクティビティは、拡張が完了するまでにかかる時間(数十分)の間ブロックされ、すべてのセッションが「データファイルの初期化」によってブロックされます。書く"。ファイルをプロアクティブに拡張するようにOracleを構成して、実行中に物事が動き続けることができるようにする方法はありますか?
1TBの30分はごく普通です。表領域の容量が完全になくなった場合も、すべての書き込みが停止するのは正常です。書き込みに行く場所がない場合、RESIZE操作が完了するのを待つ必要があります。データファイルにまだスペースがあるときにデータファイルを拡張しても、データベースI/Oは停止しません。
なぜそんなに大量に延長したのですか?これで、これらの+ 1TBがRMANバックアップに追加されます。もちろん、それらは十分に圧縮されますが、それでも100%ではなく、RMANはこれらすべてのブロックを読み取るのに時間がかかります。
これらのテーブルスペースで自動拡張を設定します。
ALTER DATABASE DATAFILE '+DG/sid/datafile/datafile_01.dbf' AUTOEXTEND ON NEXT 10G MAXSIZE 30G
そうすれば、テーブルスペースのスペースが無駄になることはなく、データが急速に増大して自動拡張操作に追いついた場合でも、10GBのフォーマットに長い時間がかからないため、書き込みの遅延はわずかです。
また、Oracleは表領域をプロアクティブに自動拡張します。最後のブロックがいっぱいになるのを待ちません。
以前の会社では、取引時間外にcronジョブをスケジュールして、テーブルスペースが1日の平均成長率の標準偏差の数以内に収まったときにテーブルスペースを拡大することでこれを解決しました。当時私はそれを広範囲に調査しましたが、Oracleがそれを行うときのしきい値を調整する方法はありません(そして、間違った時間にあなたを槌で打たないことを保証できなかったので、とにかくそうしたくないでしょう。 )。このメカニズムを排他的に使用して自動拡張を完全にオフにすることもできましたが、日中に自動拡張を一時停止する方が、少なくともスペースが不足するよりはましだと考えました。 Oracleは自動拡張イベントをどこにも記録しないため、客観的に判断するのは難しい場合があります(少なくとも、当時の10gの時点では)。
別のジョブは、すべての自動拡張DBFの最大サイズをチェックし、それをディスク上の実際に空き領域と比較して、オーバーコミットしていないことを確認しました。