今天在impdp时遇到一个小问题,由于之前的其他报错,将我的注意力转移到其他地方了,所以这个平时看来很简单的问题,琢磨了好久才发现问题,贴出来,以备提醒。
C:\Documents and Settings\>impdp
xxx/xxxx @xx
directory=DATA_PUMP_DIR dump
file=xxx.dmp show=true tables=(xxx) sqlfile=20110408.sql
Import: Release 11.2.0.1.0 - Production on 星期五 4月 8 14:25:42 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39006: 内部错误
ORA-39068: 在 PROCESS_ORDER=-4 的行中主表数据无效
ORA-01658: 无法为表空间 tab_1 中的段创建 INITIAL 区
ORA-39097: 数据泵作业出现意外的错误 -1658
解决:是因为表空间tab_1已经满了,导致不能再分配新的空间,添加个新数据文件即可。
这里还有一点提醒的就是在 show=true时,只是伪导入,即没有真正意义的导入数据库,如果表空间满了,也会报这个问题,需注意。
另外,以前曾遇到imp工具本身有问题,也会导致导入报错,具体出错信息已经记不清了。
查看表空间使用情况可以用如下语句:
1.如果你的表空间没有满则可以使用:
SELECT
tbs 表空间名,
sum
(totalM) 总共大小M,
sum
(usedM) 已使用空间M,
sum
(remainedM) 剩余空间M,
sum
(usedM)
/
sum
(totalM)
*
100
已使用百分比,
sum
(remainedM)
/
sum
(totalM)
*
100
剩余百分比
FROM
(
SELECT
b.
file_id
ID,
b.tablespace_name tbs,
b.
file_name
name,
b.bytes
/
1024
/
1024
totalM,
(b.bytes
-
sum
(nvl(a.bytes,
0
)))
/
1024
/
1024
usedM,
sum
(nvl(a.bytes,
0
)
/
1024
/
1024
) remainedM,
sum
(nvl(a.bytes,
0
)
/
(b.bytes)
*
100
),
(
100
-
(
sum
(nvl(a.bytes,
0
))
/
(b.bytes)
*
100
))
FROM
dba_free_space a,dba_data_files b
WHERE
a.
file_id
=
b.
file_id
GROUP
BY
b.tablespace_name,b.
file_name
,b.
file_id
,b.bytes
ORDER
BY
b.tablespace_name
)
GROUP
BY
tbs ;
如果满了,请使用:
SELECT T.TABLESPACE_NAME TABLESPACE_NAME,
T.CONTENTS CONTENTS,
ROUND(SUM(A.BYTES) / 1048576) ALL_MB,
ROUND(SUM(DECODE(MAXBYTES, 0, A.BYTES, MAXBYTES)) /1048576) MAX_MB,
ROUND(SUM(NVL(F.BYTES,0)) / 1048576) FREE_MB,
ROUND((SUM(DECODE(MAXBYTES, 0, 0, MAXBYTES-A.BYTES)) + SUM(NVL(F.BYTES, 0))) / 1048576) FREE_EXT,
ROUND(100 * SUM(NVL(F.BYTES, 0)) / SUM(A.BYTES)) PCT_FREE,
ROUND(100 * (SUM(DECODE(MAXBYTES, 0, 0, MAXBYTES-A.BYTES)) + SUM(NVL(F.BYTES, 0))) / SUM(DECODE(A.MAXBYTES, 0, A.BYTES, A.MAXBYTES))) PCT_FREE_EXT
FROM DBA_DATA_FILES A,
DBA_TABLESPACES T,
(SELECT FILE_ID,SUM(BYTES) BYTES FROM DBA_FREE_SPACE GROUP BY FILE_ID) F
WHERE A.FILE_ID = F.FILE_ID(+)
AND A.TABLESPACE_NAME = T.TABLESPACE_NAME
AND T.CONTENTS != 'TEMPORARY'
GROUP BY T.TABLESPACE_NAME, T.CONTENTS, T.STATUS
ORDER BY ROUND(100 * SUM(NVL(F.BYTES, 0)) / SUM(A.BYTES))
;
解决方法,目前我只知道两种:
一种是为表空间增加数据文件: 代码如下:
alter tablespace users add datafile '/opt/oracle/oradata/esop/so_data02.dbf' size 200M;
另一种方法是增加表空间原有数据文件尺寸: 代码如下:
alter database datafile '/opt/oracle/oradata/esop/so_data01.dbf' resize 200M;