在数据库undo表空间文件损坏。或者undo表空间文件缺失的情况下。无法打开数据库。
此时再闪回数据库至23:10。
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img0.ph.126.net/vEGFwUjl8WNyfJUl2UXf9w==/3757409464210729506.png)
启动数据库。
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img1.ph.126.net/knsaKBicetKG8LSEwXDzqQ==/4874302171798559005.png)
这两种情况都能够视为一种情况处理,解决方法一样。
场景:在23:10的时候新建一个undo表空间undotbs02,并切换至该undo表空间。
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img2.ph.126.net/gBMgZ21xRCndpprRzlbXnA==/1808476725466119980.png)
因为闪回数据库时使用的是undotbs02,而23:10时使用的是undotbs01,
会造成undo表空间缺失。无法打开数据库。(注:闪回数据库之后须要resetlogs)
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img2.ph.126.net/19x2fLQdHb5PT93L8dVHgQ==/3305923601566911992.png)
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img0.ph.126.net/IhAzol0kJj1tQwt0wbxHBw==/788692884843412032.png)
从上面的错误就能够看出来。此时undotbs02不存在,无法打开数据库。
解决思路非常easy:新建一个undo表空间。然后将undo_tablespace
指向新的undo表空间。
可是....新建表空间仅仅能在数据库open状态下才干进行。
所以:
由于Oracle system 表空间还有回滚段。因此我们先能够让Oracle使用system表空间回滚段
打开数据库,然后就能够新建表空间了。
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img2.ph.126.net/ivJIh3Z_pWok2YOUoec_1Q==/783626335262639276.png)
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img0.ph.126.net/HsdBGd2MonFg0UvT6YhVgA==/1840283397834456081.png)
新建表空间:
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img0.ph.126.net/vEGFwUjl8WNyfJUl2UXf9w==/3757409464210729506.png)
启动数据库。
这时能够新建一个undo表空间。然后将undo_tablespace參数指向过去
注:一定要把undo_management 參数改动为AUTO
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img2.ph.126.net/LcvJvVNgue2iDSSWuJWYjw==/2210141517232656392.png)
![UNDO表空间损坏导致数据库无法OPEN - AllenLi - Allen的博客](http://img1.ph.126.net/knsaKBicetKG8LSEwXDzqQ==/4874302171798559005.png)
通过以上步骤就能够完毕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;