数据库基础系列之六:因空间不足导致IMP失败

今天在oracle9i上用imp命令导入一个数据备份时,遇到这样的错误:

IMP-00017: 由于 ORACLE 603 错误,以下的语句失败

 "CREATE UNIQUE INDEX ……(大意是创建唯一索引云云)

IMP-00003: 遇到 ORACLE 错误 603

ORA-00603: ORACLE 服务器会话因致命错误而终止

IMP-00017: 由于 ORACLE 3114 错误,以下的语句失败

 "ALTER TABLE ……(大意是向某张表添加主键约束云云)

IMP-00003: 遇到 ORACLE 错误 3114

 

祸不单行,发现sys用户已经连接不上数据库,出现这样的错误:

ORA-09925: Unable to create audit trail file

SVR4 Error: 28: No space left on device

Additional information: 9925

ORA-01031: insufficient privileges

 

万幸的是错误信息很明显,由于缺乏剩余磁盘空间,无法为sys用户创建“审计”文件,导至无法登录。顺便说一下“审计”,如果对sys开启审计功能,则系统会记录sys的登录操作等信息,这些记录默认保存在rdbms/audit目录下,查看“审计”设置:

SQL>show parameter audit;

NAME                          TYPE                     VALUE

------------------------------------ ------- ------------------

audit_file_dest            string                   ?/rdbms/audit

audit_sys_operationsboolean               FALSE

audit_trail                   string                   NONE

transaction_auditing   boolean               TRUE

 

既然提示磁盘空间不足,眼见为实,登录到服务器上,执行df命令一行,果然空间已用100%!事到如今,先挤出点空间再说,查看各表空间数据文件信息(注意对临时表空间的查看方法略不有同,所以分成两部分再union all)

select * from(

select b.file_id 文件ID, b.tablespace_name 表空间,

b.file_name 物理文件名, b.bytes 总字节数,

(b.bytes-sum(nvl(a.bytes,0))) 已使用, sum(nvl(a.bytes,0)) 剩余,

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)

union all

(select b.file_id 文件ID, b.tablespace_name 表空间,

b.file_name 物理文件名, b.bytes 总字节数,

sum(nvl(a.blocks,0)) 已使用, (b.bytes-sum(nvl(a.blocks*8192,0))) 剩余,

(b.bytes-sum(nvl(a.blocks*8192,0)))/(b.bytes)*100 剩余百分比

from v$sort_usage a,dba_temp_files b

where a.tablespace=b.tablespace_name

group by b.tablespace_name,b.file_name,b.file_id,b.bytes

)

 

挑剩余较多的,同时不太可能再有太多新数据的表空间,缩小一下它们的数据文件:

alter database datafile '…….dbf' resize 300M;

 

马上,sys可以正常登录了。眼前的问题是解决了,考虑以后空间的增长,其实最好还是转移一些数据文件到其它剩余空间较多的分区,上面unix上的库由于用的人比较多,停数据库有点麻烦,暂未实践,只能通知其他人在创建用户时指定表空间,别全建在system里了,查看用户的默认表空间:

SQL> select username,default_tablespace from dba_users;

USERNAME                         DEFAULT_TABLESPACE

------------------------------ ------------------------------

SYS                                    SYSTEM

SYSTEM                              TOPO_ALL

IT                                       IT

IPV6_DEMO                        SYSTEM

IPV6TEST                           SYSTEM

AQZX_TEST                        SYSTEM

 

windows上试了一把移动数据文件,文件较多时不太方便:

1)查看数据库文件位置:

SQL>select file_name from dba_data_files;

2)关闭数据库:

sqlplus "username/password@servername as sysdba"

SQL> shutdown immediate;

3)直接将数据文件剪切到你希望的位置

4)启动数据库并用rename进行修改:

sqlplus "username/password@servername as sysdba"

SQL> startup mount;

SQL> alter database rename file 'C:\……\PERF01.ORA' to 'G:\……\PERF01.ORA';(注意加单引号)

SQL> alter database open;

 

另外,除了一些正常的数据量增长外,还有一些设置也会渐渐地“吃掉”磁盘空间:

1)临时表空间数据文件的自动扩展,通常的建议是为临时表空间分配一定空间后,关闭自动扩展属性,临时表空间在不用时,是会自动回收的:

select file_name,tablespace_name,bytes,status from dba_temp_files;(查看临时表空间信息)

select file#,status,bytes,name from v$tempfile; (查看临时表空间信息)

alter database tempfile  '……/temp01.dbf' autoextend off;(关闭临时表空间的“自动扩展”)

 

2)归档环境下归档文件过多,归档模式有利于数据备份恢复,查看实例是否运行在归档模式下:

SQL> select name,log_mode from v$database;

NAME            LOG_MODE

----------------------------------

VDB               NOARCHIVELOG(非归档模式)

修改归档或非归档模式:

shutdown immediate;

startup mount;

alter database noarchivelog(archivelog);

alter database open;

 

3)开了审计功能,上面提到过了。能过以下命令关闭(需要重启数据库)

alter system set audit_trail='FALSE' scope=spfile;

 

原文地址:https://www.cnblogs.com/morvenhuang/p/818392.html