Oracle卸载必须按顺序停库、停监听、停HTTP服务,删除/etc/oratab和/oraInst.loc,清理oraInventory、/usr/local/bin脚本、用户组及systemd服务,否则重装必失败。

直接删 /u01/app/oracle 目录根本不算卸载,只会留下一堆让重装失败的隐性残留。Oracle 的“卸载”本质是清理注册锚点、释放系统资源、切断环境链路,而不是文件搬家。
必须按顺序停库、停监听、停 HTTP(如果启用)
不按顺序停服务,deinstall 脚本会卡住,手动删目录也会遇到共享内存段被占用、锁文件无法删除等问题。
- 先用
sqlplus / as sysdba连入数据库,执行shutdown immediate—— 这一步不能跳,kill -9进程会导致控制文件状态异常 - 再切换到
$ORACLE_HOME/bin下运行lsnrctl stop—— 注意路径,用错$ORACLE_HOME会停掉别的监听器 - 如果启用了 Oracle HTTP Server 或 EM Express,还要执行
service httpd stop或查ps -ef | grep -i http手动 kill
删 /etc/oratab 和 /etc/oraInst.loc 是硬性前提
这两个文件是 Oracle 安装清单的“根证书”,不删它们,哪怕你重装新版本,runInstaller 仍会读到旧记录,报 [INS-35955] 或 ORA-27125。
-
/etc/oratab记录了所有已注册的实例和对应ORACLE_HOME,内容类似/u01/app/oracle/product/19c/dbhome_1:ORCL:N -
/etc/oraInst.loc指明全局 Inventory 路径,通常指向/u01/app/oraInventory,删它才能让新安装从零建清单 - 必须用 root 权限执行:
rm -f /etc/oratab /etc/oraInst.loc,删完用cat /etc/oratab验证返回 “No such file”
oraInventory 和 /usr/local/bin 下脚本必须手动清
$ORACLE_HOME/deinstall/deinstall 只能清理当前 Home,但全局 oraInventory 独立存在,且 /usr/local/bin 下的环境切换脚本会持续污染新会话。
- 先确认 Inventory 路径:
cat /etc/oraInst.loc(若已删,查默认位置/u01/app/oraInventory) - 用 root 执行:
rm -rf /u01/app/oraInventory(路径依实际而定,别只删$ORACLE_HOME/inventory) - 删三个关键脚本:
rm -f /usr/local/bin/dbhome /usr/local/bin/oraenv /usr/local/bin/coraenv - 删完验证:
which oraenv应无输出;echo $ORACLE_HOME应为空(前提是没在 shell 配置里硬编码)
用户、组、systemd 服务残留常被忽略
删完文件不代表卸载完成。Oracle 用户和组残留会导致权限混乱;systemd 服务单元文件未删,重启后会自动尝试启动并刷爆 /var/log/messages。
- 执行
userdel -r oracle和groupdel oinstall dba——-r很关键,否则家目录和邮件池还在 - 检查 systemd 服务:
systemctl list-unit-files | grep -i oracle,常见残留有dbora.service、oracle-rdbms.service - 手动删服务文件:
rm /etc/systemd/system/dbora.service,然后执行systemctl daemon-reload - 最后扫一遍符号链接:
find /usr -lname '*oracle*' -delete 2>/dev/null,避免orapwd等命令仍指向旧路径
最常被跳过的其实是 /etc/oraInst.loc 和 /usr/local/bin/oraenv —— 它们不占磁盘空间,却能让整个重装流程静默失败:你看到的是“安装成功”,实际 sqlplus 连不上、tnsping 报 TNS-12162,排查起来反而更费时间。


















