确认Oracle服务是否删干净需执行三步:先用sc queryex命令扫描所有Oracle相关服务并sc delete彻底删除;再检查注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下残留空壳键并手动清除;最后处理tnslsnr.exe监听器残留,包括停用、删服务及清理listener.ora配置。

怎么确认Oracle服务是否真的被删干净了
卸载后安装新实例失败,报错 INS-35075 或 “指定的 Oracle 系统标识符 (SID) 已在使用”,大概率是服务没清完。Windows 服务管理器(services.msc)里看不到 Oracle 条目,不代表服务注册已清除——很多残留服务处于“已禁用”或“损坏”状态,不显示在图形界面,但仍在注册表中占位。
用 sc query 扫描所有 Oracle 相关服务名
图形界面有盲区,得靠命令行穷举。以管理员身份打开命令提示符,运行:
sc queryex type= service state= all | findstr /i "oracle ora OraDb"
这条命令会列出所有服务状态(包括已停止、已禁用、甚至残缺的服务),输出里出现类似 OracleServiceORCL、OracleOraDb11g_home1TNSListener、OraOLEDB19 这样的名字,就说明服务注册还在。
- 每个匹配到的服务名,记下来(比如
OracleServiceXE) - 对每个服务名执行
sc delete <服务名>,例如:sc delete OracleServiceXE - 如果提示“拒绝访问”或“服务不存在”,说明该服务已被移除,跳过即可
- 不要用
net stop或服务管理器“停止”,那只是暂停运行;sc delete才是真正从系统服务数据库中抹除
为什么 sc delete 后还要检查注册表里的 SERVICES 键
sc delete 通常能清除服务,但若服务曾被异常中断(如强制关机、卸载中途退出),注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 下可能还挂着空壳子键,名字和原服务一致,但缺失 ImagePath 或 DisplayName 值。这类“幽灵键”不会启动,但 Oracle 安装程序会扫描整个 Services 分支,一看到带 Oracle 字样的键就报冲突。
- 打开
regedit,导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ - 按 Ctrl+F 搜索
Oracle、Ora、ORCL、XE等关键词 - 逐个点开疑似键,看右侧是否有
ImagePath值且指向一个真实存在的可执行文件;如果没有,或者路径指向已删除的目录(如C:\app\oracle\product\11.2.0\dbhome_1\...),就可以安全删除该键 - 特别注意:不要删
CurrentControlSet的软链接(如Clone、ControlSet001),只操作CurrentControlSet及其下的Services
监听器服务残留的特殊处理
tnslsnr.exe 对应的服务(如 OracleOraDb11g_home1TNSListener)经常清理不净,因为它可能被多个 Oracle Home 共享。即使你删了服务,下次运行 lsnrctl start 仍可能自动注册一个同名服务。
- 先确认监听器是否还在跑:
lsnrctl status,如果返回“TNS-12541: TNS:no listener”,说明没在运行;如果返回具体监听信息,先lsnrctl stop - 再查服务名:
lsnrctl service不管用,改用sc queryex | findstr /i "tns" - 删除服务后,手动删掉监听配置残留:
del /f /q "%ORACLE_HOME%\network\admin\listener.ora"(如果%ORACLE_HOME%还存在的话) - 更彻底的做法:把整个
%ORACLE_HOME%\network\admin\目录重命名备份,让新安装程序重建干净配置
服务残留最难缠的地方,不是它还在运行,而是它“曾经存在过”的痕迹还在注册表里躺着。哪怕只剩一个空壳键,Oracle 安装器也会把它当真——所以扫 sc + 查 regedit + 删空键,三步缺一不可。


















