One is too many

『ひとつでは多すぎる』をモットーに色々挑戦したい。 ライフログ(旅・自然)メイン

【対処】ORA-01652:一時セグメントを拡張できません

今日はOracleでつまづいた点のメモです。

 テーブルにデータをINSERTする処理で、

「ORA-01652:一時セグメントを拡張できません SYS_LOB:XXXX tablespace in hoge:」

のようなエラーメッセージが発生しました。

 

結論:Insertしようとしたテーブルの領域オーバー

対処(仮):レコードは8000件程度でしたが、

 取り急ぎ消しても問題ないレコード200件を削除したらエラーなく動きました。

本対処は未定ですが、テーブルの領域を拡張するのが望ましいと思います。

調べた手順

 一時セグメント?となり、とりあえず表領域が足りないのかなと思い

まずは使用率を確認しました。SQLは下記を参考にしました。

sql-oracle.com

 

 該当テーブルがあるテーブルスペースの使用率:99.6%  ^^;

かなり使っていましたが直接的な原因ではないと思い、

他に何かないかさらに調べました。

 

 エラーメッセージにLOBという単語があったため、それを検索キーにググってみると

次の記事を見つけました。LOBセグメントという領域があるのを初めて知りました。

codeday.me

 

 とりあえず前方一致でLOBを表示してみました。

SELECT owner, table_name, column_name
FROM dba_lobs
WHERE segment_name LIKE 'SYS_LOB%'

     AND OWNER = 'hoge'

 

 すると、Oracleのエラーメッセージと一致するSYS_LOBをもつ表が

INSERTしようとしていたテーブルでした。

 このテーブルがいっぱいになった?という仮説を確かめるため

レコードを消してみる→エラーなし となりました。

 

 そんなギリギリな領域しかないテーブルにめぐりあうことはほとんどないと

思いますが勉強になりました。

 

※2019/08/16 追記

一時表領域が足りない場合に、題記のエラーが発生するようです。

DB設計、テーブル設計する際にはどの程度の容量が必要か見積もりが大事ですね。