社内SEの徒然なる日記

OracleのインサートでORA-01653発生、対応!

■ ORA-01653

夜間処理が異常終了したから何かと思ったら、OracleのINSERT文でORA-01653が発生していました。

ORA-01653: 表*****.*****を拡張できませ


なお、*の部分は ユーザー名.テーブル名 です。流石に公開できないので隠しました。そして、最後が「せ」で終わっているのは、ログがそうなっていたからです。多分「ん」が続くのでしょうが、何故か消えていました。

Oracleのエラーメッセージを確認すると、こんな感じ。

ORA-01653
状況 表string.string を拡張できません( string 分、表領域string)。
原因 表領域の表セグメントへのエクステントの割当てに失敗しました。
処置 ALTER TABLESPACE ADD DATAFILE 文を使用して、指定された表領域に1 つ以上のファイルを追加してください。


■ 状況確認

データファイルを追加するってのは分かりますが、そのままやって大丈夫なのかが気になります。こういうのって実際にやったら別の問題が発生するってのが結構あるから、心配です。

まず、OS(Windows2008)のディスクの空きを見たのですが、空きは残っています。ってことは、ディスクがパンクしたって訳じゃなさそう。なら、Oracle側の話ですね。
OracleのインサートでORA-01653発生、対応! - 1


ってことで、問題のテーブルがどのテーブルスペースにいるのか確認します。
/*
* テーブルの一覧(テーブルスペース付き)
*/
-- 普通のテーブルの一覧

SELECT
A.TABLESPACE_NAME AS テーブルスペース
,A.TABLE_NAME AS "テーブル名(英語)"
FROM
USER_TABLES A
WHERE
NOT EXISTS
(
SELECT '1'
FROM dba_part_tables Z
WHERE Z.TABLE_NAME = A.TABLE_NAME
)


さらに、テーブルスペースの容量をデータファイル別に確認します。
/*
* テーブルスペースの容量確認
* (データファイル別)
*/

SELECT
SYSDATE
,A.TABLESPACE_NAME AS テーブルスペース
,A.FILE_NAME AS データファイル
,A.TTL_SIZE AS "総容量(MB)"
,A.TTL_SIZE - NVL(B.FREE_SIZE, 0) AS "使用量(MB)"
,NVL(B.FREE_SIZE, A.TTL_SIZE) AS "空容量(MB)"
,ROUND((1 - (NVL(B.FREE_SIZE, A.TTL_SIZE) / A.TTL_SIZE)) * 100) AS "使用率(%)"
FROM
( SELECT
FILE_ID
,FILE_NAME
,TABLESPACE_NAME
,ROUND(SUM(BYTES) / (1024 * 1024)) AS TTL_SIZE
FROM
DBA_DATA_FILES
GROUP BY
FILE_ID
,FILE_NAME
,TABLESPACE_NAME
) A,
( SELECT
FILE_ID
,TABLESPACE_NAME
,ROUND( SUM(BYTES) / (1024 * 1024) ) AS FREE_SIZE
FROM
DBA_FREE_SPACE
GROUP BY
FILE_ID
,TABLESPACE_NAME
) B
WHERE
A.FILE_ID = B.FILE_ID(+)
ORDER BY
A.TABLESPACE_NAME
,A.FILE_NAME


・・・うん、空きが無いですね。
OracleのインサートでORA-01653発生、対応! - 2

最後に、データファイルの設定情報を確認します。これは、ObjectBrowserで確認しました。コマンドでも確認できるのでしょうが、ツールがあると思わず使っちゃいます。
OracleのインサートでORA-01653発生、対応! - 3

しかし、自動拡張が10MBでUNLIMITED(無制限)になってる。何で自動拡張がされなかったんだろう?

と、一瞬思ったのですが、そういえば、データファイルって上限サイズがあったはず。確か、OracleのブロックサイズとOSによって上限が変わった気がするけど、この環境(ブロックサイズ8KB、Windows2008 R2)だと上限は32GBなんだね。

■ データファイル追加

ここまでの確認で、OS側に空きがあり、Oracleのデータファイルは拡張限界まで使っていることは分かりました。どうやら、素直に追加して問題なさそうです。

ってことで、ALTER TABLESPACE を発行!
ALTER TABLESPACE <テーブルスペース名> 
ADD DATAFILE 'D:¥ORACLE¥******¥***2.DBF'
SIZE 500M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;


サイズは500MBで、自動拡張は10MB。ここは結構適当。実は、もうそろそろサーバの保守限界で移行計画が進んでいるので、あと数ヶ月持てば良いのです。

これで大丈夫だと思うけど、今まであったデータファイルが気になります。既存の2つのデータファイルに対して自動拡張する処理が走ったら、また同じことになるかもしれません。

なので、データファイルの自動拡張を停止しました。
ALTER DATABASE DATAFILE 'D:¥ORACLE¥*****¥***.DBF' AUTOEXTEND OFF;


データファイルは2つあったので、もう一個も停止します。
ALTER DATABASE DATAFILE 'D:¥ORACLE¥*****¥***1.DBF' AUTOEXTEND OFF;


結果を、ObjectBrowserで確認。
OracleのインサートでORA-01653発生、対応! - 4

うん、これで大丈夫かな?

■ 後書き

この後、異常終了した処理を実行したら正常終了したので、多分大丈夫でしょう。

それにしても、この日は色々と辛かったです。

夜間処理が異常終了したメールが届くのですが、どうもiPhoneになってからメールがなっても目が覚めない。上司のモーニングコールで起こされて、自宅から遠隔操作(緊急用に管理サーバーに接続出来る)しようとしたら弾かれる。

マジかよって出社したら会社のカギを忘れて(これも緊急用に預かっているだけなので、普段は持ち歩かない)、事務所の清掃を委託している会社の方が到着するまで待機(10月末の札幌は寒かった)。

もう、散々でしたよ。

ちなみに、管理サーバーに接続できなかったのは、ちょうどそのタイミングで再起動(会社のポリシーで、早朝に再起動している)していたから。これ、後で冷静になってから気が付きました。

どうやら、自分で思っているより動揺していたようです。

最新の記事:http://harikofu.blog.fc2.com/
投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end --- スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する