当 Oracle 数据库被卸载后
背景
本意是想卸载 Oracle 客户端,然而却从百度搜了一篇卸载 Oracle 的教程
开干了!就这样数据库被卸载了,注册表被清空了,好好的生产系统,就这样挂掉了。
当老大打电话给我说 Oracle 注册表被清空
了,请问有没有办法恢复,当时我是很懵逼的,因为从未遇到过这种问题,个人对写 SQL 都不是很擅长,何况数据库的运维问题。不过考虑到事态比较严重,还是好好想想怎么恢复吧。
寻找解决方案
从个人的角度考虑,如果仅仅是数据库注册表被删除,那么有两种方式可以恢复:
- 找一份一模一样的注册表来恢复(十分困难);
- 备份当前数据库安装文件夹,然后卸载并重新安装数据库(重新安装路径必须和之前一致),最后用之前备份的文件进行覆盖。
从百度搜索结果来看,第一种方案是有案例的,第二种貌似没搜到有人这样做。考虑到第一种实现比较复杂,准备试一下第二种方案。
尝试解决
第二天上午,要到了目标服务器的链接方式,登陆上服务器后却发现,真实的情况是:除了注册表被清了、数据库也被删除了
。还好数据库删除的时候,其数据目录不会被删除(除非手动删除),数据目录路径一般为:XXX\app\oracle\oradata\orcl\
。

那么接下来的第一件事情就是备份
,先把以前的数据文件(app\oracle\oradata\orcl)、外置的数据文件(app\oradata)、安装目录(app\)都进行了单独的备份。
备份完成后,从网上搜索的教程来看现在的方法就是根据数据库文件来恢复数据库了,首先来简单看一下数据库数据文件夹的文件结构:两个 CTL 文件,三个 LOG 文件,五个 DBF 文件。其中 DBF 文件是核心的数据文件(datafile),CTL 是控制文件(controlfile),LOG 文件就是日志文件(logfile)。
在正常运行的数据库中我们可以在 SqlPlus 里面运行以下语句查看这三种文件的配置信息:
CMD> sqlplus /nolog
SQL> conn /as sysdba
SQL> SELECT NAME FROM V$DATAFILE;
NAME
-------------------------------------------
D:\APP\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
D:\APP\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
D:\APP\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
D:\APP\ORACLE\ORADATA\ORCL\USERS01.DBF
D:\APP\ORADATA\LIEMS3.DBF
D:\APP\ORADATA\LIEMS3_1
已选择 6 行。
SQL> SELECT NAME FROM V$CONTROLFILE;
NAME
--------------------------------------------
D:\APP\ORACLE\ORADATA\ORCL\CONTROL01.CTL
D:\APP\ORACLE\ORADATA\ORCL\CONTROL02.CTL
SQL> SELECT * FROM v$logfile;
D:\APP\ORACLE\ORADATA\ORCL\REDO03.LOG
D:\APP\ORACLE\ORADATA\ORCL\REDO02.LOG
D:\APP\ORACLE\ORADATA\ORCL\REDO01.LOG
备份完成后,第二步就是重新安装新的数据库
,因为旧的数据库已经被卸载了,这里就不再详细叙述安装数据库的步骤了,不过在安装新数据库的时候,出现一个问题:安装目录无法选择旧的安装目录(提示在旧的安装目录里面已经存在实例)
,当时没有想太多就换了一个目录进行安装了。
数据库安装完成后,第三步就是替换新数据库的数据目录
。这里需要先备份一下新安装的数据库的数据目录,然后直接将旧的数据目录拷贝过去即可。
这里也同样存在一个新的问题:新建的数据库,数据目录下除了直接截图的文件外还多出了两个文件夹,简单来说就是新安装的数据库的数据目录和以前已经不一样了,当使用旧的数据目录进行替换后,出现下图所示错误。

就这样折腾了多次,数据文件一直挂载不成功,百度谷歌都没有找到办法,此时已经搞了四五个钟头了,已经下午一点多了,赶紧点个外卖垫垫肚子。
解决问题
在点外卖前,我想了一种最坏的方案:不参考教程了,按照我最初的方案(重新安装后直接用原文件覆盖)试一下
。因此现在就需要先把安装的数据库卸载掉,这里声明一下:
卸载数据库只需要
以管理员身份运行 Universal Installer
,然后点击卸载产品
,在弹框中勾选 Oracle 主目录
,最后点击删除
即可。

我在卸载的时候发现居然有两个实例
,一个实例是空实例(安装路径就是旧的安装路径,也就是说旧的实例没有删除干净),此时才明白为什么上午安装的时候无法选择旧的安装路径。
先选择旧的实例,开始删除,删除完成后在删除新的实例,进行删除(删除的时候务必勾选实例的主目录,这样卸载完成后根本不需要去删除注册表什么的,网上彻底删除 Oracle 的教程有些错误指引了
)。
数据库删除后,重新进行安装,安装时安装目录选择最初的安装目录即可,静等安装成功。
安装成功后,按照以下步骤进行即可:
# 打开 SqlPlus:
sqlplus /nolog
# 登陆
SQL> conn /as sysdba
# 关闭数据库
SQL> shutdown immediate
# 此时备份新按照的数据库的数据文件,然后使用最初的数据文件进行替换,替换完成后执行下面语句
SQL> startup

从上图可以看到,数据加载成功啦!赶紧去重启一下网站。

进入系统验证一下。

总结
其实数据库恢复过程遇到的问题还是比较多的,不文就不详细说明了,这里说一下数据库恢复的先决条件:数据文件夹没有被删除。只要数据文件夹还在,那么按照下面的步骤执行就可以以最快的速度恢复数据库:
- 备份数据文件夹;
- 卸载旧的数据库,同时删除旧的数据库安装目录;
- 重新安装数据库,保证安装目录和旧的数据库保持一致;
- 使用 SqlPlus 关闭数据库(shutdown immediate);
- 将新数据库的数据文件夹命名为
XXX-BAK
(就是备份一下); - 使用旧的数据文件夹作为新数据库的数据文件夹(用旧的数据文件夹作为新的数据文件夹);
- 使用 SqlPlus 启动数据库(startup);
- 数据库恢复正常。
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一起前行。

转载自:https://juejin.cn/post/6844903636284211207