表領域に空きはあるが、断片化している。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