第22回:DATAPUMPによるSYSTEM表領域の肥大化~DATAPUMPにより、SYSTEM表領域の使用量が急激に増加した際の対応方法~

技術者向け・データベースの技術情報発信

お客様からの問い合わせ

ある日、お客様より以下のような問い合わせを頂きました。

『OracleDBのSYSTEM表領域使用率が95%を超えていて、監視ジョブがアラートを出力している』

SYSTEM表領域は自動拡張に設定をしているため、システムが停止してしまう恐れはありませんでしたが、急激に表領域使用量が増えた原因を突き止めるため、現地で調査を実施しました。

調査内容

まず、以下のSQLでSYSTEM表領域内のセグメントを確認し、どの領域が肥大化しているかを確認します。

SQL>select segment_name,segment_type,bytes/1024/1024 MB from dba_segments where tablespace_name='SYSTEM' order by 3 desc;

結果は以下のようになり、今回のケースでは「SYS_EXPORT_FULL_<連番>」というテーブルが多数存在していました。

dbexpt22_01.JPG

この「SYS_EXPORT_FULL_XX」というテーブルは、DATAPUMPでEXPORTした際に自動的に作成されるマスターテーブルですが、通常はEXPORT処理が完了すると削除されるものです。

お客様に連絡してDATAPUMP関連で最近何か問題はなかったかを確認したところ、「数日前に日次で実行しているEXPORTがディスク容量不足で失敗しており、何度かリトライした」との情報を頂きました。

ここでDATAPUMPの処理について、軽く触れておきます。

DATAPUMPでEXPORT(IMPORT)を実行するとデータポンプジョブが開始され、そのジョブに対してマスタープロセスが開始します。マスタープロセスによりジョブ全体が制御され、制御情報を一時的にジョブを実行したユーザのデフォルト表領域にマスターテーブルとして保持しています。

上記にも記載しましたが、通常このマスターテーブルはジョブが正常終了すると削除されますが(※)、何らかの理由でジョブが失敗し、ジョブが終了していない状態だとスキーマ内に残存してしまいます。
※「keep_master」パラメータをYESと設定することで削除されないように設定することも可能。

今回はまさにこのパターンで、SYSユーザにてEXPORTを実行していたためSYSスキーマのデフォルト表領域であるSYSTEM表領域内にマスターテーブルが多数残ってしまっている状態でした。

マスターテーブルを削除することで、DATAPUMPジョブのクリーンアップが可能なので、以下のSQLでジョブの状態を確認後マスターテーブルの削除を行います。

SQL>select owner_name,job_name,operation,state from dba_datapump_jobs;

dbexpt22_02.JPG

対応

以下のSQLでマスターテーブルを削除します。

SQL>drop table <マスターテーブル> cascade constraints;

全ての不要ジョブのマスターテーブルを削除したら、残存ジョブが無いことを確認します。

SQL>select owner_name,job_name,operation,state from dba_datapump_jobs;

これで、DATAPUMPジョブによるSYSTEM表領域のひっ迫は解消されました。

まとめ

SYSTEM表領域はOracleにおいて核ともいえる表領域で、もし一杯になってしまうとDBが停止してしまうような重要な表領域です。

通常運用の中でSYSTEM表領域の使用量が増える要因は、オブジェクト数の増加や監査証跡によるものなどが大半ですが、今回のケースのように意外な原因で増加してしまうこともあるので、定期的な表領域監視をお勧めします。