有一次朝表中插入10万条数据,插入失败,提示空间不足,发现是undotbs01.dbf这个文件太大了。ORA-01654
登录到oracle服务器, 查看磁盘空间命令:df -h ,我这里的结果为 /oradata 使用100%,查看/oradata里面文件,undotbs01.dbf,大小为32G。既然已经定位到问题,想法就是把undotbs01.dbf减小;
1.以dba用户登录oracle,
export ORACLE_SID=DB
sqlplus / as sysdba
2.我的oracle数据目录下就一个undotbs文件,所以基本确认使用的undo空间就是undotbs01,为了保险起见,还是查一下;
show parameter undo_tablespace;
查询结果为:
name type value
undo_tablespace string undotbs1
3.查看表空间和文件的对应关系
select file_name, tablespace_name, online_status from dba_data_files where tablespace_name='UNDOTBS1';
查询结果为:
file_name tablespace_name online_status
/oradata/DB/undotbs01.dbf UNDOTBS1 ONLINE
4.查询当前回退表空间状态
select tablespace_name, status from dba_rollback_segs;
查询结果为:10条UNDOTBS1,状态全部为ONLINE;
5.undo_tablespace 是一个必须一直存在的表空间,要想删除当前的,我们必须设置一个临时空间供undo_tablespace 使用;
create undo tablespace UNDOTBS2 datafile '/oradata2/DB/undotbs02.dbf' size 100M;
alter system set undo_tablespace=UNDOTBS2;
6.重新查询当前回退表空间状态
select tablespace_name, status from dba_rollback_segs;
查询结果为:10条UNDOTBS1,状态全部为OFFLINE;10条UNDOTBS2,状态全部为ONLINE;证明回退表空间已经设置到UNDOTBS2;
7.删除回退表空间UNDOTBS1
drop tablespace UNDOTBS1 including contents and datafiles;
此时已经删除掉了文件,其他教程中说此处不需要重启oracle服务,但是我重新查看磁盘空间,发现文件已经不存在,但是空间是没有释放,因此我对oracle进行了重启;在sqlplus中执行命令:(关闭->启动)
shutdown immediate;
startup;
因为我是将数据文件放在了其他盘符下,作为一个强迫症患者,我还是将回退表空间重新设置回来了;重复以上命令,不再解释
create undo tablespace UNDOTBS1 datafile '/oradata/DB/undotbs1.dbf' size 100M autoextend on maxsize 25G;
alter system set undo_tablespace=UNDOTBS1;
select tablespace_name, status from dba_rollback_segs;
drop tablespace UNDOTBS2 including contents and datafiles;
shutdown immediate;
startup;