在线扩大数据库UNDO表空间,扩大数据库undo表
用oracle账号登陆ORACLE数据库服务器
方法一:
- 查看表空间的名字及文件所在位置:
select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name;
- 修改数据库datafile文件到新的大小
alter database datafile '\oracle\oradata\undotab1.dbf' resize 4000m;
方法二:
启动SQL*Plus session并执行下面命令:
oracle% sqlplus /nolog sql> connect / as sysdba; sql> spool $ORACLE_BASE/admin/oss/scripts/recreate_undo.log; sql> CREATE SMALLFILE UNDO TABLESPACE "UNDOTBS2" DATAFILE '/db/data/undotbs02.dbf' SIZE 30M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 32767M; sql> ALTER SYSTEM SET UNDO_TABLESPACE="UNDOTBS2"; sql> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES; sql> CREATE BIGFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE '/db/data/undotbs01.dbf' SIZE 35M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE 128G; sql> ALTER SYSTEM SET UNDO_TABLESPACE="UNDOTBS1"; sql> DROP TABLESPACE UNDOTBS2 INCLUDING CONTENTS AND DATAFILES; sql> exit oracle%
NOTE!
- 如果看到这个错误:“ORA-30013: undo tablespace 'undotas1' is currently in use”需等待10-30秒,有时会更长些,再重新执行上面命令。也可以执行“UNDOTBS1 / UNDOTBS2”来检查DROP命令是否可以执行 sql>SELECT SEGMENT_NAME, XACTS, V.STATUS FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME = 'UNDOTBS1' AND SEGMENT_ID = USN; 返回结果:
“no rows selected”
- 如果返回的结果是UNDOTBS1还在用的话,那么可能要重启ORACLE服务再执行上面的步骤。
处理方法有两种,
一是添加undo 表空间的数据文件,
二是切换undo tablespace. 这种情况下多用在undo 表空间已经非常大的情况。
1 增加数据文件
sql> alter tablespace undo add datafile 'D:\undo02.dbf' size 100m reuse;
表空间已更改。
2 切换undo 表空间
1、建立新的表空间undotbs2
sql> create undo tablespace undotbs2 datafile 'D:\undo03.dbf' size 100m reuse;
表空间已创建。
2、切换到新建的undo表空间上来,操作如下
sql> alter system set undo_tablespace=undotbs2 scope=both;
系统已更改。
3、将原来的undo表空间,置为脱机:
sql> alter tablespace undo offline;
表空间已更改。
4、删除原来的undo表空间:
sql> drop tablespace undo including contents and datafiles cascade constraints
表空间已删除。
如果只是drop tablespace undo ,则只会在删除控制文件里的记录,并不会物理删除文件。
drop undo表空间的时候必须是在未使用的情况下才能进行。
如果undo表空间正在使用(例如事务失败,但是还没有恢复成功),那么drop表空间命令将失败。在drop表空间的时候可以使用including contents。
在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间的所占用磁盘的物理空间又不会被oracle所释放,如果你用的是PC机很可能会遇到磁盘空间不足的问题,经过个人整理经过如下操作可以重构undo表空间,同样temp表空间也可能在你查询大数据或则创建索引的时候无限扩大导致磁盘空间不足,同样可以用如下方式解决此问题: --查看各表空间名称 select name from v$tablespace --查看某个表空间信息 select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'UNDOTBS1'; --查看回滚段的使用情况,哪个用户正在使用回滚段的资源,如果有用户最好更换时间(特别是生产环境)。 select s.username, u.name from v$transaction t,v$rollstat r, v$rollname u,v$session s where s.taddr=t.addr and t.xidusn=r.usn and r.usn=u.usn order by s.username; --检查UNDO Segment状态 select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; --创建新的UNDO表空间,并设置自动扩展参数; create undo tablespace undotbs2 datafile 'D:\ORACLE\PRODUCT\10.1.0\ORADATA\ORCL\UNDOTBS02.DBF' size 10m reuse autoextend on next 100m maxsize unlimited; -- 动态更改spfile配置文件; alter system set undo_tablespace=undotbs2 scope=both; --等待原UNDO表空间所有UNDO SEGMENT OFFLINE; select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; --再执行看UNDO表空间所有UNDO SEGMENT ONLINE; select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; -- 删除原有的UNDO表空间; drop tablespace undotbs1 including contents; --确认删除是否成功;