查看: 1173|回复: 0

[Oracle数据库] oracle 12c因误删pdb数据文件导致整个数据库打不开的解决方法

发表于 2018-3-28 08:00:06

前言

最近因为一位同事误删了某个插件数据库(PDB)的数据文件,结果整个数据库,包括容器数据库(CDB),以及其他插件数据库都用不了了。无奈。。。通过尝试各种方法最终解决了,觉着有必要将解决的过程分享出来,方法大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

方法如下:

1、用sys账号进入实例,可见容器数据库处于mounted状态;插在上面的所有PDB当然也都是mounted。

  1. sqlplus sys/pwd@orcl12c as sysdba;
复制代码

2、试图打开CDB,提示有数据库文件未能加载。

  1. SQL> alter database open;
  2. alter database open
  3. *
  4. 第 1 行出现错误:
  5. ORA-01157: 无法标识/锁定数据文件 101 - 请参阅 DBWR 跟踪文件
  6. ORA-01110: 数据文件 101:
  7. 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF'
复制代码

又关闭又启动,来回折腾,都是如此:

  1. SQL> shutdown immediate
  2. ORA-01109: 数据库未打开
  3. 已经卸载数据库。
  4. ORACLE 例程已经关闭。
  5. SQL> startup
  6. ORACLE 例程已经启动。
  7. Total System Global Area 2147483648 bytes
  8. Fixed Size 3834152 bytes
  9. Variable Size 671092440 bytes
  10. Database Buffers 1459617792 bytes
  11. Redo Buffers 12939264 bytes
  12. 数据库装载完毕。
  13. ORA-01157: 无法标识/锁定数据文件 101 - 请参阅 DBWR 跟踪文件
  14. ORA-01110: 数据文件 101:
  15. 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF'
复制代码

3、查阅网上资料,应该是将此遗失文件标为脱机、删除。但提示找不到该文件!

  1. SQL> alter database datafile 101 offline;
  2. alter database datafile 101 offline
  3. *
  4. 第 1 行出现错误:
  5. ORA-01516: 不存在的日志文件, 数据文件或临时文件 "101"
复制代码

这就奇怪了,明明是你提示了该文件的,现在又说不知道这个文件。

4、估计是当前所在数据库是CDB,而这个文件属于PDB,所以应该切换到相关PDB,再进行文件脱机。

  1. SQL> alter session set container=PDBDTJK;
  2. 会话已更改。
  3. SQL> show pdbs;
  4. CON_ID CON_NAME OPEN MODE RESTRICTED
  5. ---------- ------------------------------ ---------- ----------
  6. 13 PDBDTJK MOUNTED
复制代码

5、脱机(offline,drop),成功!

  1. SQL> alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline;
  2. alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline
  3. *
  4. 第 1 行出现错误:
  5. ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机
  6. SQL> alter database datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL12C\PDBDTJK\NMEMC.DBF' offline drop;
  7. 数据库已更改。
复制代码

6、切换回CDB,打开,成功!

  1. SQL> alter session set container=CDB$ROOT;
  2. 会话已更改。
  3. SQL> alter database open;
  4. 数据库已更改。
复制代码

哎,我的天呐!呐啊~~~

7、总结

1)一个PDB损坏,导致整个CDB以及其他PDB都不能用,乃至于无法恢复?不应该啊,这可是oracle啊,不可能这么弱智的

还真是。听说oracle 12c r1版本就是,PDB宕机,CDB也会陪着一起宕;到r2就好一点,只宕PDB。

2)本次恢复,从CDB切换到PDB是关键。网上给出的答案,都是11g或以前的,一个实例对应一个数据库,所以没有数据库切换的概念,文件说脱机就脱机了。

3)只要数据库实例能启动,不管CDB是否已打开,sys都能进去:

  1. sqlplus sys/pwd@servername as sysdba;
复制代码

而PDB则不行。在未打开的情况下,你用 conn user/pwd@servername 这种方式已经进不去了,但切换会话还可以:

  1. SQL> alter session set container=PDBDTJK;
  2. 会话已更改。
复制代码

这是孙悟空的一根救命毫毛。

4)以上问题的解决,现在看起来一步一步的,清晰明了,但这中间经过了多少煎熬和痛苦。昨天傍晚出现的问题,搞到21点,还没搞定。回家继续查资料到晚上快24点。早上七点醒来,才查了一下会话切换。早上是人最清醒的时候。

我都不清楚这个文件是怎么删除的。在继续使用的情况下,删除文件系统会提示被锁定,估计是停掉数据库再删除,叉啊,这不是找死吗。我都不敢想象,如果今天数据库没起来,会有一翻怎样的折腾。虽然是开发数据库,但好多项目在使用,各有各的PDB。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对程序员之家的支持。



回复

使用道具 举报