超簡単!ORA-12954エラー解消方法

ORA-12954エラー

エラーメッセージは以下。

ORA-12954: The request exceeds the maximum allowed database size of 12 GB.

12GBの容量オーバー?に見えるが、実はこれ相当ミスリード


エラーの原因

OracleDBの無料版では全体の容量が12GBとなっており、あたかもそれを超えたように読める。

もちろんその場合にもこのエラーが発生するが、このエラーはテーブルスペース(表領域)が割り当て上限(デフォルトでは200MB)を超えた場合にも発生し、このケースの方が圧倒的に多い。

というのも、このようにテーブルスペースに制限がかかっているため、いきなり全体の12GBという制限に達することは無いためである。

本番環境であれば、以下の対処が一般的

  • ディスク領域の拡張(たいてい有料)

  • バッチ処理などによる不要レコードの定期削除

しかし、開発環境ではそこまで厳密な運用は不要なため、テーブルスペースの最大サイズを調整する方向で対応する。

特に開発環境では、レコードを少ししか必要としない表領域も多くあり、それらに対しても、まるまる200MB確保している。

真面目にレコードを削除するより、こちらの方が圧倒的に理にかなった運用である。


対応方法

  1. 使用されていないテーブルスペースの容量を縮小する

  2. 縮小して浮いた容量を、容量不足のテーブルスペースへ再割り当てする

対応内容は上記だが、SQL だけで実施しようとするとかなり大変。

GUI ツールの A5SQL を利用する。

A5SQLの管理者ツールを使用すると、各表領域の空き状況をステータスバーで見ることができる(神)。


A5SQLでの作業手順

DBA ユーザーでログイン

A5SQL に DBA 権限のあるユーザーでログイン。

管理画面を開く

管理者ツール

または

ナビゲーションバーの『データベース』 → コントロールパネルを表示

「表領域とデータファイル」タブを開く

ここで、各表領域の使用状況を視覚的に確認できる。

容量の少ない表領域を調整

  1. あまり利用されていない表領域を選択

  2. 対応するデータファイル(例:/opt/oracle/…/xxx.dbf)を選択

  3. 「サイズ変更」→ 容量を縮小

4.5 不足している表領域へ容量を追加

縮小して確保した容量を、容量不足のテーブルスペースへ割り当てる。


SQL による確認方法

テーブルスペース一覧の取得

以下の SQL を実行することで、DB内のテーブルスペース一覧を取得。

SELECT tablespace_name FROM dba_tablespaces;

テーブルスペース名はプロジェクトで設定しているはずなので、該当するものがどれかを確認し、テーブルスペース名を控えておく。

容量上限の確認

以下の 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;

容量が残っていなければ、先に話したように最大値を上げるか、レコードを物理削除する必要がある。

レコードを削除する場合は、これらのテーブルから候補を出し、削除する。

※一般的にはトランザクションテーブルのレコードを、バッチ等を作成して一定期間ごとに削除する。

コメント

タイトルとURLをコピーしました