ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows 10下彻底卸载Oracle 19c:从deinstall到注册表清理完整指南

Windows 10下彻底卸载Oracle 19c:从deinstall到注册表清理完整指南 如果你在 Windows 上装过 Oracle你一定知道它有多能折腾。装好之后跑得倒是稳可一旦哪天我需要把 Oracle 19c 从 Windows 10 里彻底弄出去你会发现卸载这件事比安装更折磨人。普通软件那种控制面板 → 卸载的思路在这里完全不适用Oracle 的安装体系会把自身拆散到系统的各个角落注册表、服务、环境变量、文件目录到处都是它的痕迹。我最近因为要把一台开发机清出来做别的实验在 Windows 10 上对 Oracle 19c 做了一次完全卸载。刚开始也以为跑一遍官方卸载工具就完事了结果一步步查下来才发现官方工具只是半自动清理后面还有一堆手工活等着你。这篇就把我完整的操作链路、排查过程和踩过的坑写下来给后面要卸 Oracle 19c 的朋友一个参考。文章会覆盖卸载前的准备、deinstall 工具的使用、注册表与服务的清剿、文件与环境变量的扫尾以及卸载之后怎么确认系统真的干净了。1. 为什么 Oracle 19c 在 Windows 上如此难卸载1.1 Oracle 的安装体系远比普通软件复杂Oracle 数据库不像游览器、输入法那样只有一两个可执行文件。它的安装过程会创建完整的 ORACLE_HOME 目录、ORACLE_BASE 目录同时注册 Windows 服务、写入大量注册表配置、开辟独立的监听端口还会往系统 PATH 环境变量里塞好几条路径。装一次 Oracle等于在系统里安插了一整套基础设施而不只是装了一个应用程序。更麻烦的是Oracle 在 Windows 上的很多配置是双层存储的既写在注册表里又会在文件系统里放置同名配置文件比如 listener.ora、tnsnames.ora。卸载的时候如果只清理文件而忽略注册表系统里就会残留大量幽灵配置反过来只清注册表而留下文件重装时又会因为目录冲突导致安装程序报错。这也是为什么 Oracle 卸载不能像普通软件那样一卸了之。1.2 理解残留的三个来源才知道完全卸载要做什么我实际排查下来Oracle 19c 的残留主要集中在三个层面服务层Oracle 安装时会在 Windows 服务管理器里注册 OracleServiceORCL、OracleOraDB19Home1TNSListener、OracleOraDB19Home1MTSRecoveryService 等多个服务。这些服务如果不停掉、不删除开机后会自动启动即使数据库软件已经卸了端口还是会被占用。注册表层HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 下会有安装时写入的完整配置项包括 ORACLE_HOME、ORACLE_SID、NLS_LANG 等键值。卸载工具通常只移除部分键剩下的需要手动清理否则重装时 INS-30131 这类错误会频繁出现。文件系统层默认安装在 C:\app 下的 ORACLE_BASE 目录往往有几个 GB 到几十个 GB里面除了程序文件还有数据库文件、日志、闪回区内容。这些文件不是简单删除文件夹就能解决的因为某些文件被服务进程锁定必须按顺序处理。理解了这三层你就明白所谓完全卸载实际上是一次系统级清理工程而不是某个工具的单一动作。2. 卸载前的必要准备别急着动手2.1 安全评估哪些数据必须保留这一步看起来不起眼但往往是最容易翻车的环节。Oracle 卸载工具 deinstall 执行的时候会连数据库实例一起删如果你数据库里有业务数据一旦执行就回不来了。我给自己定了一个规矩动手卸载之前先做三件事。第一用 expdp 或数据泵把需要的 schema 导出成 dmp 文件。如果只是普通测试库可以用 PL/SQL Developer 这类工具做快速导出但生产习惯向来是用命令行的 expdp因为可重复执行、可脚本化。导出文件记得放到 Oracle 安装目录之外的磁盘位置否则目录一删备份也一起没了。第二记录当前实例的基本信息。打开 cmd 执行sqlplus / as sysdba然后查show parameter db_name和show parameter db_unique_name。这些信息在 deinstall 填写参数时会用到特别是当你的环境里存在多个实例时写错 SID 会让 deinstall 直接失败或者删错对象。第三明确自己到底要保留哪个部分。如果你只是不想让 Oracle 开机自启那停服务就够了完全不需要卸载如果是为了腾空间、准备重装才需要走完整卸载链路。这两种目标的后续操作完全不同别一上来就把卸载工具跑了。2.2 停止 Oracle 服务与监听进程准备工作里最容易忽略的就是服务停止顺序。Oracle 卸载全程都要求相关服务处于停止状态否则服务进程会锁定文件导致删除操作特别慢甚至报文件被占用。正确顺序是先停监听再停数据库实例最后停其他辅助服务。直接在管理员 cmd 里执行:: 停止监听 lsnrctl stop :: 停止数据库实例 sqlplus / as sysdba shutdown immediate; exit; :: 停止 Windows 服务 net stop OracleServiceORCL net stop OracleOraDB19Home1TNSListener这里解释一下为什么必须先停监听Oracle 的监听进程会持续占用 sqlnet.ora、listener.ora 等配置文件同时保持对网络端口的绑定。如果监听没停后续删除注册表时虽不会报错但删除文件时经常出现另一个程序正在使用此文件的干扰让人误以为是系统权限问题。停完服务后最好用netstat -ano | findstr :1521确认一下端口已经释放。如果发现端口还在监听说明某个进程没退干净可以用tasklist | findstr 进程号找到对应进程确认是 Oracle 相关的再处理。千万别在没确认的情况下乱杀进程那样反而可能把系统其他组件搞挂。2.3 确认 deinstall 工具位置与运行前提Oracle 19c 在 Windows 上自带卸载工具 deinstall位置在 ORACLE_HOME 下的 deinstall 目录里默认路径类似D:\app\oracle\product\19.0.0\dbhome_1\deinstall\deinstall.bat这个工具是整个卸载过程的主引擎但它有几个前提条件需要注意。首先必须以管理员身份运行 cmd否则工具在执行到删除服务时会因为权限不足中断。其次工具的配置文件如果默认参数有问题可以直接用命令行参数覆盖这个我后面会详细说。另外一点我在实际操作中发现 deinstall 工具对路径里的空格和特殊字符很敏感。如果你的 ORACLE_HOME 路径里有空格比如装在 C:\Program Files\Oracle 这种目录下deinstall 在解析参数时可能报无效的主目录。这时候不要慌用-home参数显式传入路径并对整个路径加引号即可。3. 核心操作deinstall 工具的正确使用方式3.1 参数说明与命令示例deinstall 的完整参数可以通过deinstall.bat -help查看。常用的几个参数只有一个页面那么多但每个都很关键参数作用使用场景-home指定 ORACLE_HOME 路径多个 Oracle 环境共存时精确锁定要卸载的目录-sid指定数据库实例名环境里有多个实例时避免误删-force跳过某些交互确认自动执行脚本时使用能减少人工干预点-quiet静默模式不输出交互提示适合脚本化批量卸载-checkonly仅检查不实际执行卸载前先评估影响范围我在这次卸载中的实际使用方式是先用-checkonly做一次检查确认工具能正确识别到 ORACLE_HOME 和实例信息然后再正式执行。检查命令如下cd /d D:\app\oracle\product\19.0.0\dbhome_1\deinstall deinstall.bat -home D:\app\oracle\product\19.0.0\dbhome_1 -sid ORCL -checkonly注意到-checkonly输出结果后它会列出工具计划删除的内容包括数据库实例、监听配置、服务项等。这一步是安全网能让你在真正动手之前知道会发生什么。检查结果确认没问题后再执行正式卸载deinstall.bat -home D:\app\oracle\product\19.0.0\dbhome_1 -sid ORCL -force-force参数会跳过一些交互确认适合一个人盯一台机器的情况如果是帮远程服务器清理建议去掉-force多一些确认环节可以防止误删。3.2 执行过程的完整日志分析与常见提示deinstall 执行过程会输出大量日志。刚开始接触它的人常被满屏的路径信息吓到其实只需要关注几个关键节点。第一个节点是Database unique name确认工具会问你确认要删除的数据库名输入y即可。第二个节点是Services清理列表工具会列出所有要删除的 Windows 服务这里要留意是否有非 Oracle 的服务混进去。第三个节点是Configuration files提示工具会显示哪些配置文件将被移除或重命名。如果执行过程中报INS-35180这类错误无法检查可用内存多半是 Windows 系统临时目录权限或空间问题导致的。可以尝试设置TMP和TEMP环境变量指向一个干净的空目录然后重跑 deinstall。我个人遇到过这种问题最后是通过清理%TEMP%下的旧文件解决掉的。deinstall 执行完后日志位置一般在D:\app\oracle\product\19.0.0\dbhome_1\deinstall\logs建议打开最后生成的日志文件搜索Fatal、Error、Warning这几个关键词。deinstall 并不总是成功卸载就真的干净了某些非关键配置清理失败时会只给 Warning继续执行完后也不会影响主流程但这恰恰是残留的入口后面手工清理时必须把这些 Warning 对应的项目单独处理。4. 手工清剿残留注册表、服务、文件与环境变量4.1 注册表清理的重点路径官方 deinstall 工具最大的局限在于它不会把注册表清理干净。我跑完 deinstall 后打开注册表编辑器HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 下仍然存在大量键值。这些残留如果不处理后续重装 Oracle 时会导致配置冲突、安装程序误判已有环境甚至直接罢装。手动清理注册表前务必先备份注册表。在注册表编辑器中选中 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 节点右键导出为 .reg 文件。这样万一误删了系统关键配置还能恢复。备份完成后再按下面的路径依次检查HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE这个键下通常有一个以 HOME 开头的子键记录 ORACLE_HOME 相关配置和一个以 KEY 开头的子键记录产品注册信息。理论上 deinstall 会删除一部分但我实测下来这里还是会有残留需要手动删除整个 ORACLE 项。如果你的系统是 64 位还需要检查HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLEWOW6432Node 是 32 位软件在 64 位系统上的注册表映射位置。Oracle 安装程序在写入注册表时有时候会两边都写deinstall 通常只清理了 64 位那一侧32 位的映射键容易被留下。清理完 ORACLE 键后还需要检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 下所有以 Oracle 开头的服务键这些键对应开机自动启动的服务必须一并删除。查找时可以在注册表编辑器里用 CtrlF 搜索 Oracle每次找到后看清楚是不是 Oracle 相关的键再删除。这里有一个容易忽略的地方注册表里还有一处记录 Oracle ODBC 驱动的键值位于HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI如果里面存在 Oracle 相关的驱动条目同样需要清理否则别的地方用 ODBC 连接数据库时会一直尝试加载一个已经不存在的驱动。4.2 服务项的核对与删除deinstall 完成后部分 Oracle 服务会被移除但我在实测中发现有个别服务没有被正确删除。打开 services.msc按状态排序如果还能看到名称以 Oracle 开头的服务需要手动删除。Windows 下删除服务有两种方式。第一种是用sc命令管理员 cmd 里执行sc delete OracleServiceORCL sc delete OracleOraDB19Home1TNSListener第二种是直接删除注册表里的服务键路径是HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services找到对应的 Oracle 开头服务键后删除然后重启一次系统。我更推荐用sc delete因为注册表直接删除偶尔会出现键值残留影响下一次服务枚举。不过这里有个操作顺序很关键删文件之前先删服务或者删服务之前先把数据库软件目录里的可执行文件停掉。我踩过这个坑——有次我先删了文件目录再回到服务管理器里删服务系统提示服务对应的可执行文件不存在虽然最终还是能删掉但过程中需要额外处理一些异常状态。最稳妥的顺序是停服务 → deinstall → 检查并删除残留服务 → 清理注册表 → 清理文件目录。按这个链路走下来每步之间的互相干扰最小。4.3 文件系统残留的清理顺序deinstall 跑完后C:\app 或 D:\app 下的 ORACLE_BASE 目录并不会被完全清空。它的保留是有原因的闪回区里的归档日志、数据文件备份、还有 diag 诊断目录这些内容 deinstall 会默认保留避免误删用户数据。但如果目标是完全卸载以腾出空间这些遗留文件全都要手动删除。删除文件时的顺序建议是先删数据库文件目录oradata再删闪回区flash_recovery_area 或 fast_recovery_area然后是诊断日志diag最后删整个 ORACLE_BASE 下的上层目录。原因在于诊断日志和闪回区文件数量庞大且分散先删它们会让后续整目录删除更快。如果直接把外层目录拖进回收站Windows 在计算删除时间时会遍历所有子文件速度慢到怀疑人生。另外Oracle 安装时还会在非 ORACLE_BASE 的位置放一些文件这些是我之前没意识到的后来用搜索功能扫出来的C:\Program Files\Oracle一些通用的 OCI 客户端组件和 ODBC 驱动会装到这里尤其在安装了 Instant Client 的情况下C:\Windows\System32\drivers\etc\servicesOracle 安装时会把 1521 端口写入这个系统文件这是文本文件可以用记事本打开找到注释标记为 Oracle 的行删除掉C:\ProgramData\Microsoft\Windows\Start Menu\Programs开始菜单里的 Oracle 快捷方式文件夹网上有人建议直接删整个 C:\app 目录我个人不推荐一上来就删因为如果 Oracle 19c 是仅有的一个数据库环境删整个目录确实可以但如果你机器上还装过 Oracle 11g 或 Instant ClientC:\app 下可能还有它们的独立目录误删会连累别的环境。删之前先展开看看目录结构确认每个子目录的归属再动手。4.4 环境变量与计划任务环境变量是完全卸载里最容易被忽视的环节。Oracle 安装程序会在系统环境变量里加入以下几项ORACLE_HOME指向数据库软件主目录ORACLE_SID实例名ORACLE_BASE基础目录TNS_ADMIN网络配置文件路径如果之前手动设置过PATH在原有值的前部追加D:\app\oracle\product\19.0.0\dbhome_1\bin;之类的目录清理方法很直接右键此电脑 → 属性 → 高级系统设置 → 环境变量把上面这些额外的变量删掉。PATH 变量里需要把 Oracle 相关的路径逐个移除。这里要提醒一句PATH 里可能同时存在bin目录和单独的oci.dll路径两个都要检查不然下次打开命令行窗口时仍然可能因为 PATH 里的旧路径而报找不到 ORACLE_HOME之类的问题。计划任务方面Oracle 19c 通常不会主动创建计划任务但如果你手动配置过自动备份比如用 dbms_scheduler 创建了任务Windows 的任务计划程序库里可能会有对应的记录。打开任务计划程序在任务计划程序库中搜索 Oracle 关键词找到相关任务后禁用或删除即可。检查一遍用不了两分钟但能避免卸载后系统日志里持续出现找不到脚本报错的情况。5. 卸载后的验证清单与重装避坑5.1 从监听端口到系统日志的全量验证清理都做完之后不意味着就结束了。我习惯性地按一套验证清单检查一遍确认系统真的干净了。清单的顺序是从外到内先看网络层再看服务层最后看文件层。网络层敲下面的命令确认 1521 端口已经没有进程监听netstat -ano | findstr :1521如果返回空说明端口已经释放。如果还有结果记下最后一列的 PID再执行tasklist | findstr PID看是什么进程占用的。如果是 Oracle 相关进程说明有服务没删干净或者有残留进程未结束需要回到服务管理器确认。服务层打开服务管理器确认没有任何 Oracle 开头的服务。同时也建议搜一下services.msc里有没有 Oracle 字符串有些服务名不以 Oracle 开头但描述里包含 Oracle比如某些一键备份工具注册的驱动。文件层分别检查 ORACLE_HOME 目录和 ORACLE_BASE 目录是否已删除。如果目录非空多半是文件被某个进程锁定重启一次电脑再删往往就能解决。重启后还是删不掉的可以用一个临时管理员账户登录后再删通常能找到是哪个进程在占用。注册表层再次打开注册表编辑器搜索 Oracle注意把搜索范围从项改为项、值、数据正常情况下只剩一些无关紧要的系统自带键值。如果还能看到 ORACLE_HOME 或 ORA 开头的键按前面的路径继续清理。系统日志层打开事件查看器 → Windows 日志 → 系统检查最近几小时内有没有来源为 Oracle 的报错。如果存在点开详情看看是哪个服务或文件引起的顺着报错路径再排查一次。这套验证清单走完Oracle 19c 在 Windows 10 系统里的痕迹才算真正清除干净。5.2 自己踩过的几个坑deinstall 没删干净的真实经历第一次卸载时我只跑了 deinstall然后重启准备重装新版本。结果安装程序到先决条件检查那一步直接报错提示检测到已有 Oracle 环境。我追查下去才发现注册表里残留了完整的 ORACLE 键安装程序读取到旧配置之后认为系统里还装着一份数据库于是拒绝继续。折腾了快一个小时最后手动把整个 ORACLE 注册表项删除后重装才顺利通过。第二次是在清理文件时图省事直接用 ShiftDelete 删了 C:\app 目录结果删除过程中弹出一堆文件被占用的提示。原来 Oracle 的某些后台进程还没完全退干净。后来我长记性了先到任务管理器里把所有名为oracle.exe、lsnrctl.exe、tnslsnr.exe的进程全部结束再删文件速度飞快。如果你在任务管理器里看到这些进程同时存在几十个别奇怪Oracle 的进程模型本来就是多进程协作的全部结束后重装不会受影响。最后一个小提醒是环境变量。我有个朋友在完全卸载后每次打开命令行都会提示找不到 Oracle 命令就是因为 PATH 里的bin路径没有删干净。虽然不影响日常使用但那种莫名其妙的报错会不断跳出来逼得人反复排查。所以在卸载环境变量时建议把系统 PATH 完整复制出来备份一份删完 Oracle 条目后还能对照确认没有误删其他软件需要的路径。经过这一轮完整的清理再回头装 Oracle 19c 时就能很直观地感受到差异安装过程顺畅、预检查全部通过、服务创建干净不再有历史残留来干扰。Windows 上卸载 Oracle 本质上是和系统做一次全面的断舍离每一步都踏实走完重装新环境时才不会为旧债买单。
返回列表