今天在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;