内容简介:这篇文章主要给大家介绍了关于oracle 12c因误删pdb数据文件导致整个数据库打不开问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
前言
最近因为一位同事误删了某个插件数据库(PDB)的数据文件,结果整个数据库,包括容器数据库(CDB),以及其他插件数据库都用不了了。无奈。。。通过尝试各种方法最终解决了,觉着有必要将解决的过程分享出来,方法大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
方法如下:
1、用sys账号进入实例,可见容器数据库处于mounted状态;插在上面的所有PDB当然也都是mounted。
sqlplus sys/pwd@orcl12c as sysdba;
2、试图打开CDB,提示有数据库文件未能加载。
SQL> alter database open; alter database open * 第 1 行出现错误: ORA-01157: 无法标识/锁定数据文件 101 - 请参阅 DBWR 跟踪文件 ORA-01110: 数据文件 101: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF'
又关闭又启动,来回折腾,都是如此:
SQL> shutdown immediate ORA-01109: 数据库未打开 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 2147483648 bytes Fixed Size 3834152 bytes Variable Size 671092440 bytes Database Buffers 1459617792 bytes Redo Buffers 12939264 bytes 数据库装载完毕。 ORA-01157: 无法标识/锁定数据文件 101 - 请参阅 DBWR 跟踪文件 ORA-01110: 数据文件 101: 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF'
3、查阅网上资料,应该是将此遗失文件标为脱机、删除。但提示找不到该文件!
SQL> alter database datafile 101 offline; alter database datafile 101 offline * 第 1 行出现错误: ORA-01516: 不存在的日志文件, 数据文件或临时文件 "101"
这就奇怪了,明明是你提示了该文件的,现在又说不知道这个文件。
4、估计是当前所在数据库是CDB,而这个文件属于PDB,所以应该切换到相关PDB,再进行文件脱机。
SQL> alter session set container=PDBDTJK; 会话已更改。 SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 13 PDBDTJK MOUNTED
5、脱机(offline,drop),成功!
SQL> alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline; alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 SQL> alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline drop; 数据库已更改。
6、切换回CDB,打开,成功!
SQL> alter session set container=CDB$ROOT; 会话已更改。 SQL> alter database open; 数据库已更改。
哎,我的天呐!呐啊~~~
7、总结
1)一个PDB损坏,导致整个CDB以及其他PDB都不能用,乃至于无法恢复?不应该啊,这可是oracle啊,不可能这么弱智的
还真是。听说oracle 12c r1版本就是,PDB宕机,CDB也会陪着一起宕;到r2就好一点,只宕PDB。
2)本次恢复,从CDB切换到PDB是关键。网上给出的答案,都是11g或以前的,一个实例对应一个数据库,所以没有数据库切换的概念,文件说脱机就脱机了。
3)只要数据库实例能启动,不管CDB是否已打开,sys都能进去:
sqlplus sys/pwd@servername as sysdba;
而PDB则不行。在未打开的情况下,你用 conn user/pwd@servername 这种方式已经进不去了,但切换会话还可以:
SQL> alter session set container=PDBDTJK; 会话已更改。
这是孙悟空的一根救命毫毛。
4)以上问题的解决,现在看起来一步一步的,清晰明了,但这中间经过了多少煎熬和痛苦。昨天傍晚出现的问题,搞到21点,还没搞定。回家继续查资料到晚上快24点。早上七点醒来,才查了一下会话切换。早上是人最清醒的时候。
我都不清楚这个文件是怎么删除的。在继续使用的情况下,删除文件系统会提示被锁定,估计是停掉数据库再删除,叉啊,这不是找死吗。我都不敢想象,如果今天数据库没起来,会有一翻怎样的折腾。虽然是开发数据库,但好多项目在使用,各有各的PDB。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对Codercto.com的支持。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Nature of Code
Daniel Shiffman / The Nature of Code / 2012-12-13 / GBP 19.95
How can we capture the unpredictable evolutionary and emergent properties of nature in software? How can understanding the mathematical principles behind our physical world help us to create digital w......一起来看看 《The Nature of Code》 这本书的介绍吧!