Oracle11gで一時表領域がいっぱいに

Oracle11gで一時表領域がいっぱいに

あるインスタンスでどうも一時表領域がいっぱいになった模様。autoextendはONになっていますが、サイズがでかすぎてOSの上限に達している。
こんなエラー。

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

でかすぎるので再作成する。

まず一時表領域の使用率とファイル名を調べる。

ここOracle 一時表領域の使用率を調べる - Break Out!? - blog ver.
の引用です。ありがとうございました。

SELECT dt.file_name, dt.tablespace_name,
to_char(dt.bytes / 1024, '99999990.000') file_kbytes,
to_char(t.bytes_cached / 1024, '99999990.000') used_kbytes,
to_char(t.bytes_cached / dt.bytes * 100, '990.00') || '%' capacity
FROM sys.dba_temp_files dt, v$temp_extent_pool t, v$tempfile v 
WHERE t.file_id(+)= dt.file_id AND dt.file_id = v.file#;

別のファイルを一時表領域に追加

sql> alter tablespace temp add  tempfile '/mnt/db/oracle/oradata/hoge/temp02.dbf'

現行利用している一時表領域のファイルをオフラインにする

sql> alter database tempfile '/mnt/db/oracle/oradata/hoge/temp01.dbf' offline

オフラインにしたデータファイルを削除

sql> alter database tempfile '/mnt/db/oracle/oradata/hoge/temp01.dbf' drop including datafiles ;

データファイルをOracleセッションがつかっている場合はこんなエラーがでます。

ORA-25152: TEMPFILE cannot be dropped at this time

参照しているセッションをalter system killで殺していけばいいのですが、数が多いと面倒。
なので、インスタンスをshtudown,startして一度きれいにするといいでしょう。

削除した一時表領域ファイルを再作成する

sql> alter tablespace temp add '/mnt/db/oracle/oradata/hoge/temp01.dbf' size 1024M autoextend on ;

上記で作成したファイルをオンラインにする

たぶんこの手順は不要。作成した時点でオンラインになってるんじゃないかな。

sql> alter database tempfile '/mnt/db/oracle/oradata/hoge/temp01.dbf' online ;

一時的に作成した一時表領域ファイルをオフラインにして削除

sql> alter database tempfile '/mnt/db/oracle/oradata/hoge/temp02.dbf' offline ;
sql> alter database tempfile '/mnt/db/oracle/oradata/hoge/temp02.dbf' drop including datafiles ;