ORA-12954エラー
エラーメッセージは以下。
ORA-12954: The request exceeds the maximum allowed database size of 12 GB.
12GBの容量オーバー?に見えるが、実はこれ相当ミスリード。
エラーの原因
OracleDBの無料版では全体の容量が12GBとなっており、あたかもそれを超えたように読める。
もちろんその場合にもこのエラーが発生するが、このエラーはテーブルスペース(表領域)が割り当て上限(デフォルトでは200MB)を超えた場合にも発生し、このケースの方が圧倒的に多い。
というのも、このようにテーブルスペースに制限がかかっているため、いきなり全体の12GBという制限に達することは無いためである。
本番環境であれば、以下の対処が一般的
-
ディスク領域の拡張(たいてい有料)
-
バッチ処理などによる不要レコードの定期削除
しかし、開発環境ではそこまで厳密な運用は不要なため、テーブルスペースの最大サイズを調整する方向で対応する。
特に開発環境では、レコードを少ししか必要としない表領域も多くあり、それらに対しても、まるまる200MB確保している。
真面目にレコードを削除するより、こちらの方が圧倒的に理にかなった運用である。
対応方法
-
使用されていないテーブルスペースの容量を縮小する
-
縮小して浮いた容量を、容量不足のテーブルスペースへ再割り当てする
対応内容は上記だが、SQL だけで実施しようとするとかなり大変。
GUI ツールの A5SQL を利用する。
A5SQLの管理者ツールを使用すると、各表領域の空き状況をステータスバーで見ることができる(神)。
A5SQLでの作業手順
DBA ユーザーでログイン
A5SQL に DBA 権限のあるユーザーでログイン。
管理画面を開く
管理者ツール
または
ナビゲーションバーの『データベース』 → コントロールパネルを表示
「表領域とデータファイル」タブを開く
ここで、各表領域の使用状況を視覚的に確認できる。
容量の少ない表領域を調整
-
あまり利用されていない表領域を選択
-
対応するデータファイル(例:
/opt/oracle/…/xxx.dbf)を選択 -
「サイズ変更」→ 容量を縮小
4.5 不足している表領域へ容量を追加
縮小して確保した容量を、容量不足のテーブルスペースへ割り当てる。
SQL による確認方法
テーブルスペース一覧の取得
以下の SQL を実行することで、DB内のテーブルスペース一覧を取得。
テーブルスペース名はプロジェクトで設定しているはずなので、該当するものがどれかを確認し、テーブルスペース名を控えておく。
容量上限の確認
以下の SQL でテーブルスペースの容量上限を確認する:
SELECT
file_name,
tablespace_name,
bytes / 1024 / 1024 AS 最大MB
FROM
dba_data_files
WHERE
tablespace_name = '<テーブルスペース名>';
たいていデフォルトの200MBに設定されているはず。
空き容量の確認
続いて、以下の SQL でテーブルスペースの空き容量を確認する:
SELECT
tablespace_name,
SUM(bytes) / 1024 / 1024 AS free_MB
FROM
dba_free_space
WHERE
tablespace_name = '<テーブルスペース名>'
GROUP BY
tablespace_name
ORDER BY
tablespace_name;
free_MB の値が小さければ空き容量がほとんど残っていない。
容量を浪費しているテーブルを調べる
以下のSQLで、容量を食っているテーブルがどれか一覧化する。
SELECT
segment_name AS table_name,
SUM(bytes) / 1024 / 1024 AS used_mb
FROM
dba_segments
WHERE
tablespace_name = '<テーブルスペース名>'
AND segment_type = 'TABLE'
GROUP BY
segment_name
ORDER BY
used_mb DESC;
容量が残っていなければ、先に話したように最大値を上げるか、レコードを物理削除する必要がある。
レコードを削除する場合は、これらのテーブルから候補を出し、削除する。
※一般的にはトランザクションテーブルのレコードを、バッチ等を作成して一定期間ごとに削除する。

コメント