ablog

不器用で落着きのない技術者のメモ

ORA-01659 の対処法

表領域に空きはあるが、断片化している。DB を使っている人がいるから exp & imp とかできない場合。

現象

import 実行したら、

ORA-01659: unable to allocate MINEXTENTS beyond ... in tablespace ...

って怒られた。

対処法

$ export LANG=C
$ export NLS_LANG=American_America.JA16SJIS
  • show=y つきで imp コマンドを実行して、DDL をログに出力する。
$ imp scott/tiger file=scott_ddl.dmp log=scott.log show=y
  • DDL を実行できるよう加工する。
$  perl -ple '/^ "/ or s/.*//;s/^ "(.+)"$/$1/;s/^(CREATE|ALTER|ANALYZE|GRANT|COMMENT|AUDIT)/\/\n\n$1/i;END{print "\/"}' scott_ddl.log > create_objects.sql
  • INITIAL エクステントを小さくする。
$ perl -i -ple 's/STORAGE\((\s+)?INITIAL\s+[0-9]+/STORAGE\(INITIAL 1/gi' create_objects.sql
  • 表領域の指定を環境に合わせて変更する。
$ perl -i -ple 's/TABLESPACE\s+\"[a-zA-Z_]+\"/TABLESPACE \"USERS\"/gi' create_objects.sql
  • オブジェクトを作成する。
$ sqlplus scott/tiger create_table_newsys.sql <<EOF
exit
EOF
  • データを import する。
$ nohup imp scott/tiger commit=y ignore=y buffer=65530 tables=(emp,dept) file=scott.dmp log=imp_scott.log &
$ tail -f nohup.out