deinstall.bat 不支持 force 参数,“强制删除”实为停服务、清 inventory、用响应文件静默执行及手动清理注册表和服务的组合操作。
deinstall.bat 不能“强制删除”——它压根不支持 force 参数,所谓“强制”其实是绕过校验、跳过交互、手动补位的组合操作。
deinstall.bat 运行失败或直接退出的常见原因
脚本不是独立可执行程序,它严重依赖当前环境状态和注册信息:
- 没停服务就运行:
OracleServiceORCL、OracleOraDB19Home1TNSListener等仍在运行,脚本检测到活动进程会静默退出 - 路径进错了目录:必须
cd进入C:\app\oracle\product\19.0.0\dbhome_1\deinstall(或你实际的%ORACLE_HOME%\deinstall),进错一级就找不到配置模板 - 环境变量污染:
ORACLE_HOME指向了另一个版本(比如 12c),或PATH里混着旧版 Oracle 的 bin,会导致脚本读取错误的 inventory - 权限不足:未以管理员身份运行命令提示符,连
sc delete都会被拒绝,后续步骤全卡住
绕过 deinstall.bat 校验失败的实操方式
当 deinstall.bat -checkonly 报 “No database instance found” 或 “Listener not detected”,说明 inventory 已损坏或实例注册丢失。此时不能硬等它识别成功,得人工干预:
- 先手动停服务:
net stop OracleServiceORCL、net stop OracleOraDB19Home1TNSListener,再用sc queryex确认状态为STOPPED - 删掉
%ORACLE_HOME%\inventory\ContentsXML\comps.xml(备份后再删),让 deinstall 重建 inventory 视图 - 改用响应文件模式:复制
%ORACLE_HOME%\deinstall\response\deinstall.rsp.tmpl为deinstall.rsp,填入真实值:ORACLE_HOME="C:\app\oracle\product\19.0.0\dbhome_1"、ORACLE_BASE="C:\app\oracle"、INSTALL_LOCATION="C:\app\oracle\product\19.0.0\dbhome_1" - 执行:
deinstall.bat -paramfile deinstall.rsp -silent,跳过所有交互和动态检测
注册表残留导致 deinstall 后重装报 INS-35955 的关键项
INS-35955 错误本质是新安装器在注册主目录时发现已有同名键冲突。光删 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle 不够,以下四类注册表项必须手动清:
-
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:删所有以Oracle、Ora、Orcl开头的子项(如OracleServiceORCL、OraDB19Home1MTSRecoveryService) -
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application:删所有Oracle开头的日志源(否则事件查看器持续刷旧日志) -
HKEY_CLASSES_ROOT:搜索Ora和Oracle,删对应 CLSID(尤其Oracle.DataAccess.Client类型,Java/.NET 应用连库失败多源于此) -
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI:只留Microsoft ODBC for Oracle,其余含Oracle的驱动节全删(避免 ODBC 数据源列表里出现灰色不可用项)
删完仍启动不了监听器?检查 Windows 服务残留注册
哪怕 deinstall.bat 显示“successfully removed”,Windows 服务管理器里可能还挂着已卸载的服务名。这些“幽灵服务”不会显示在 services.msc 图形界面,但会阻塞新监听器注册:
- 运行
sc queryex type= service state= all | findstr /i "oracle",列出所有含 oracle 的服务状态 - 对状态为
4_WIN32_OWN_PROCESS但STATE是STOPPED的项,执行sc delete "OracleOraDB19Home1TNSListener" - 特别注意
ControlSet001和ControlSet002下重复注册的服务键——它们不会随 CurrentControlSet 删除而消失 - 删完重启,再运行
lsnrctl start才可能真正成功
真正麻烦的从来不是删软件本身,而是那些没被任何脚本触碰的注册表硬依赖和服务句柄。每删一项前,建议导出对应注册表分支备份;删完别急着重装,先 reboot 再验证 services.msc 和 sc query 是否真干净——否则 INS-35955 和 ORA-00600 会立刻回来。











