UNDO表空间损坏导致数据库无法OPEN,undoopen
在数据库undo表空间文件损坏,或者undo表空间文件缺失的情况下,无法打开数据库。 这两种情况都可以视为一种情况处理,解决方法一样。场景:在23:10的时候新建一个undo表空间undotbs02,并切换至该undo表空间。
此时再闪回数据库至23:10。
由于闪回数据库时使用的是undotbs02,而23:10时使用的是undotbs01,
会造成undo表空间缺失,无法打开数据库。(注:闪回数据库之后需要resetlogs)
从上面的错误就可以看出来,此时undotbs02不存在,无法打开数据库。
解决思路很简单:新建一个undo表空间,然后将undo_tablespace
指向新的undo表空间。
但是....新建表空间只能在数据库open状态下才能进行。
所以:
因为Oracle system 表空间还有回滚段,因此我们先可以让Oracle使用system表空间回滚段
打开数据库,然后就可以新建表空间了。
新建表空间:

启动数据库。 这时可以新建一个undo表空间,然后将undo_tablespace参数指向过去 注:一定要把undo_management 参数修改为AUTO

通过以上步骤就可以完成undo表空间损坏或缺失导致的数据库无法打开问题。
总结: 需要注意的问题: 1. 在闪回数据库之后,打开数据库时需要使用 alter database open resetlogs; 命令重置重置日志 2. 要闪回数据库,数据库要装载但不能打开(mount状态下闪回数据库) 3. 记得将undo_management 参数修改回来。使用:alter system set undo_management=auto scope=spfile;
下面是利用system表空间回滚段新建undo表空间的步骤: 1. 将数据库启动到mount 2. alter system set undo_management=manual scope=spfile; -- 设置undo表空间的管理方式 3. shutdown immediate; 4. startup 然后新建一个undo表空间 undotbs03; 5. 修改undo_tablespace 参数指向新建的undo表空间 undotbs03; ** 6. 记得将undo_management 参数修改回来。 alter system set undo_management=auto scope=spfile; 7. SQL> alter system set undo_management=manual scope=spfile; auto表示:该表空间是由Oracle来管理的(自动分配给不同事物使用) manual表示:该表空间的block是通过freelist来管理如何存储数据的。 8. 打开数据库 ** 9. 打开数据库后一定要把undo_management 参数修改回来。 alter system set undo_management=auto scope=spfile;
首先,undo表空间满是正常的,oracle自然会重用或者扩展它,一般不用管它。
然后,现在要解决的话,需要先把undo tablespace设置成手动,启动数据库,创建新的undo tablespace。把新的设置成默认的。
假设你的库现在是mounted状态
1 创建PFILE(如果已有就是更新)
SQL>create pfile from spfile;
2 关闭数据库
SQL>shutdown immediate
3 在你的$ORACLE_HOME/dbs目录下面找个叫做
init<数据库>.ora的文件,把其中有undo_management=AUTO的一行改成
undo_management=MANUAL
如果没有就在文件末尾填一行
4 以sysdba身份连接数据库
SQL>connect "/ as sysdba"
用刚才改过的文件启动数据库
SQL> startup pfile=<刚才的文件全路径和名字>
这步是最关键的,如果成功,后面就没问题了
5 drop掉原来的表空间
SQL> drop tablespace <原来的undo表空间名字> including contents;
6 创建新的undo表空间
SQL> create UNDO tablespace undotbs2 datafile '/u01/app/oracle/oradata/orcl/undotbs02.dbf' size 100M autoextend on;
7 关闭数据库,
SQL>shutdown immediate
在开始那个init文件里设置UNDO_MANAGEMENT=AUTO
和 UNDO_TABLESPACE=UNDOTBS2
8 再做一次第四步
9 更新spfile
SQL>create spfile from pfile;
10 关闭数据库,正常重新启动
SQL>shutdown immediate
SQL>startup
11 去网上教你删undo那个地方骂它。非常想当然的做法。没有任何理由这么做
12 让你的工程师去学oracle 培训
以上步骤的中的第5步可能会出问题。我不确认。。。 但是即使第5步不成功,问题应该也不大
UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据。你听说UNDO也是临时表可能是因为这两个表空间都不会永久保存数据的原因。
-------------------------------------------------------------------------
oracle undo表空间
undo表空间用于存放undo数据,当执行DML操作(insert、update、delete)时,oracle会将这些操作的旧数据写入到undo段。
undo数据的作用
1.回退事务
当执行DML操作修改数据后,旧数据被存放在undo段中。只要数据为提交、回滚段未写满或者回滚段为超时的情况下,旧数据都能被回滚回来。
2.读一致性
通过DML操作后的数据没有提交之前,其他用户读取的数据都是回滚段里面的旧数据。
使用undo参数
1.undo_management
该初始化参数用于指定undo数据的管理方式。如果要使用自动管理模式,必须设置为auto,如果使用手工管理模式必须设置该参数为manual,使用自动管理模式时,oracle会使用undo表空间管理,使用手工管理模式时,oracle会使用回滚段管理undo数据。需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。
2,UNDO_TABLESPACE
该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间.
在RAC(Real Application Cluster)结构中,因为一个UNDO表空间不能由多个例程同时使用,所有必须为每个例程配置一个独立的UNDO表空间.
3,UNDO_RETENTION
该初始化参数用于控制UNDO数据的最大保留时间,其默认值为900秒,从9i开始,通过配置该初始化参数,可以指定undo数据的保留时间,从而确定倒叙查询特征(Flashback Query)可以查看到的最早时间点.
手工管理回滚段的规划:
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> show parameter transactions;
NAME TYPE VALUE
------------------------------------ ----------......余下全文>>