在Windows上卸载Oracle 19c这件事,经历过的人应该都懂,比安装还折磨人。Oracle 19c的安装程序自带卸载工具,但走完官方流程后,注册表残留、服务残留、环境变量残留依然一堆,重新安装时各种莫名其妙的报错就会找上门来:界面还没弹出就闪退、安装到一半提示“产品无法继续运行”、新建监听服务时说端口被占用……我这次花了一个下午,把Oracle 19c手动卸载到“巨干净”的状态,然后重新安装一次通过,整个过程记录下来,给同样被Oracle折磨的朋友一个参考。
这篇内容不教你用“卸载-重装工具”,而是纯手动操作,一条命令一条命令地清,一个注册表项一个注册表项地删。这样做的最大好处是:每一步我都知道自己在干什么,出了问题也能定位到具体环节。适合那些Oracle安装失败、想彻底清理后重装的入门DBA,也适合电脑上残留过Oracle、想把系统恢复干净的开发者。
1. 动手之前,先做这三件事
很多人一上来就删目录、清注册表,结果装完新库发现旧数据没了,或者生产环境被搞挂。卸载Oracle不是游戏里“删号重练”那么潇洒,先花十分钟盘点和备份,后面能省下大把救命的工夫。
1.1 备份数据和关键配置文件
如果你的数据库里还有业务数据,哪怕只是测试库,我也建议先把数据导出来。在能正常登录数据库的情况下,用Oracle自带的数据泵导出是最稳妥的方案。以管理员身份打开命令行,先创建备份目录:
sqlplus / as sysdba SQL> create or replace directory BACKUP_DIR as 'D:\oracle_backup'; SQL> grant read, write on directory BACKUP_DIR to system; SQL> exit;然后执行导出,把整库的数据、表结构、存储过程、触发器都打包走:
expdp system/你的密码@ORCL directory=BACKUP_DIR dumpfile=full_backup_$(date +%Y%m%d).dmp full=y logfile=full_backup_$(date +%Y%m%d).log这里有个经验要分享:expdp导出的dmp文件版本兼容性一定要提前考虑。如果你后面想把这些数据导入旧版本Oracle(比如11g),几乎是不现实的,高版本导出的数据泵文件通常不能向下兼容,别折腾这个方向。如果只是本次卸载后重新安装同版本Oracle,那这个备份就能直接派上用场。
导出数据之外,还要把数据库的“皮肤”和“骨架”也备份下来:
- 参数文件:
SELECT value FROM v$parameter WHERE name = 'spfile';查询spfile路径后复制一份。 - 密码文件:
$ORACLE_HOME\database\PWDORCL.ora,这个文件保存了sys用户的远程登录密码,弄丢后远程登录会很麻烦。 - 网络配置:
$ORACLE_HOME\network\admin\listener.ora、tnsnames.ora、sqlnet.ora,这三个文件决定了监听和客户端连接方式,重装后可以直接复用。如果记不清原始SID、端口、HOME路径,用文本打开看一眼,然后截图或抄在自己的笔记里。
1.2 盘点Oracle装了什么、用了哪个用户
动手卸载前,先搞清楚当前机器上Oracle安装的“势力范围”。用命令行快速盘点:
sc query | findstr /i oracle这条命令会列出所有名称里带oracle的Windows服务。你需要记录下服务名和状态,比如OracleServiceORCL、OracleOraDB19Home1TNSListener、OracleOraDB19Home1MTSRecoveryService等。这些服务是卸载时要优先处理的,停服务、删服务都靠它们。
接着查一下Oracle的安装主目录,确认ORACLE_HOME和ORACLE_BASE到底是在哪里。默认安装情况下一般是:
- ORACLE_HOME:
C:\app\你的用户名\product\19.0.0\dbhome_1 - ORACLE_BASE:
C:\app\你的用户名
用命令查看当前环境变量,记录下来:
echo %ORACLE_HOME% echo %ORACLE_BASE% echo %ORACLE_SID% echo %TNS_ADMIN%这一堆路径记下来后,后面清理的时候才有据可依。我再多说一句:别嫌这些步骤啰嗦,我见过太多人卸载卸到一半,突然发现自己不知道Oracle装在哪个盘,然后对着C盘和D盘干瞪眼。先把“领地”划清楚,后面每一步就都不会迷路。
1.3 停掉服务和进程,这一步错了后面全是坑
卸载前的最后一步是停服务和结束进程,这个顺序非常重要。我的经验是:先停监听,再停实例服务,最后停其他辅助服务。相当于先把汽车熄火,再拔钥匙,最后再开引擎盖。
用管理员权限打开命令行,依次执行:
net stop OracleOraDB19Home1TNSListener net stop OracleServiceORCL net stop OracleOraDB19Home1MTSRecoveryService服务名可能因为安装配置不同略有差异,以你刚才查询到的为准。如果提示服务已经停止,直接跳过;如果有服务停不下来,说明有进程还在占用,执行taskkill /f /im oracle.exe强制结束,然后继续。
强烈建议在停完服务后再检查一遍是否有Oracle相关进程还活着:
tasklist | findstr /i oracle正常情况下应该没有任何输出。如果还有残留,比如tnslsnr.exe、emagent.exe等,逐个用taskkill /f /im 进程名结束。这一步的意义在于:Windows下有些文件和服务是互锁的,服务还在跑,你下一步删目录的时候就会提示“文件被占用”,轻则删除失败,重则残留半截文件,把系统搞得更脏。
2. 删除数据库与安装目录:从源头清掉“大头”
服务和进程都停干净了,现在可以开始动主目录了。这是耗时最长的一步,也是决定卸载效果能否称得上“干净”的重要前提。核心思路是:能登进数据库就先删数据库,再删安装目录;登不进去就直接删目录,但顺序和范围要把握好。
2.1 能登库的情况下,用DBCA把库删掉
如果你的数据库实例还能正常启动,建议先用Oracle提供的DBCA工具删除数据库。这样做的好处是,它会同步更新Oracle的“产品清单”(inventory),后续安装程序检测旧版本时会认为系统里没有残留的数据库,不容易出现版本冲突。
在命令行中执行数据库删除操作:
dbca -silent -deleteDatabase -sourceDB ORCL -sysDBAUserName sys -sysDBAPassword 你的密码这里-sourceDB后面填的ORCL是你的实例SID,如果记不清,可以登录数据库后执行select name from v$database;查询。执行过程中如果弹出类似“数据库不存在”或“连接失败”的情况,多半是监听停了或TNS配置丢失,可以用lsnrctl start临时启动监听再试一次。
还有一种更简单的方式,直接在Windows开始菜单里找到Database Configuration Assistant,在图形界面里选择“删除数据库”,按向导走。不过我个人更喜欢命令行,因为输出信息完整,出问题能看到具体日志,不像图形界面弹个框就没了。
2.2 直接删目录时,哪些文件夹必须删
DBCA删完后,或者你的库已经起不来了、无法正常删除,那就只能手动删目录了。这里我不推荐你打开资源管理器一个个右键删除,一是慢,二是容易漏,三是路径太长时Windows会提示“源路径过长”。
以管理员身份打开命令行,先删除Oracle主目录:
rmdir /s /q "C:\app\你的用户名\product\19.0.0\dbhome_1"然后删除整个ORACLE_BASE目录:
rmdir /s /q "C:\app\你的用户名"这里要说清楚一个常见误区:很多人以为只要删掉product目录里那个dbhome_1就够了,实际上Oracle的安装文件分布在整个C:\app下,其中oradata目录保存的是数据库的数据文件,admin目录保存的是告警日志和跟踪文件,cfgtoollogs目录保存的是各种配置工具日志,diag目录更是堆积了大量诊断日志。这些目录不删干净,重装时虽然不一定会报错,但会让你的磁盘白白被吃掉好几个GB,而且新库跑起来后日志可能和旧日志混在一起,排查问题的时候容易看花眼。
所以我的实操建议是:确认C:\app下没有其他Oracle产品(比如PeopleSoft、Hyperion)后,直接整个删掉C:\app\你的用户名目录。如果安装时选择了非默认位置,那就按你记录的实际路径来处理。
另外,安装过程还会往临时目录写文件,顺手检查这些位置,有就一并删除:
rmdir /s /q "%TEMP%\OraInstall*" rmdir /s /q "%TEMP%\deinstall*" rmdir /s /q "C:\Program Files\Oracle"有些机器上C:\Program Files\Oracle目录确实存在,里面可能是残留的卸载程序或共享组件。删除前先看一眼里面内容,确认跟Oracle相关再下手。
3. 注册表与服务的深度清理:卸载干净的“胜负手”
目录删完,大块头没了,但真正决定“巨干净”还是“假干净”的,是接下来的注册表和服务清理。这一步是手动卸载的“胜负手”。很多人在官方卸载工具跑完后,以为系统已经干净了,结果重装时发现OUI(Oracle Universal Installer)还是检测到旧版本,或者新监听起不来,很大概率就是注册表里还残留着旧信息。
3.1 服务键的逐个清理
刚才用sc query查询到的Oracle服务,现在要连同它们在注册表里的服务键一起删掉。服务注册表项的位置在:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services打开regedit,在这个路径下找到所有以Oracle开头的键,右键删除。常见的有OracleServiceORCL、OracleOraDB19Home1TNSListener、OracleOraDB19Home1MTSRecoveryService、OracleRemExecServiceV2等。
这一步为什么重要?因为重新安装Oracle时,安装程序会尝试在Windows服务管理器里创建同名的服务。如果旧服务键还残留在注册表里,安装程序可能直接跳过创建,或者创建时因为“服务已存在”导致安装失败,日志里就会报“产品无法继续运行。请重新安装应用程序”之类的诡异错误。你不用花时间去研究报错信息,八成就是服务没清干净。
当然,如果系统服务管理器里服务还在,你也可以直接用命令删除:
sc delete OracleServiceORCL sc delete OracleOraDB19Home1TNSListener sc delete OracleOraDB19Home1MTSRecoveryService但注意,sc delete只会删除服务条目,不会清理注册表里的EventLog等其他引用,所以最保险的做法还是直接去注册表编辑器里检查一遍Services键。
3.2 Oracle软件注册表主键清理
服务键删完,接着清理Oracle软件自身的主注册表项。这是整个清理流程里最关键的一步,相当于把Oracle在这个系统里的“户口”注销掉。需要重点检查以下几个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE HKEY_CURRENT_USER\Software\ORACLE其中HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE是最核心的,Oracle的安装路径、HOME信息、版本信息都存在这里。在regedit中定位到该键后右键删除,如果提示“无法删除”,检查一下权限,用管理员身份重新打开regedit。
另外还有一个很容易被忽略的位置,就是HKEY_CLASSES_ROOT\Installer\Products。Windows Installer会把已安装产品的GUID记录在这里,Oracle的安装也会在这里生成记录。如果不清理,某些检测软件甚至Oracle自身的安装程序还是能认出“系统里装过Oracle”。定位方式很简单,打开HKEY_CLASSES_ROOT\Installer\Products,在上方“查看”菜单里勾选“状态栏”,然后用F3键快捷键搜索“Oracle Corporation”,找到了确认是Oracle相关就删掉。这里搜索可能需要花几分钟,因为Products键下面条目非常多,要耐心翻。
最后还有一个位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。这是控制面板“程序和功能”列表的数据来源,如果这里残留Oracle的卸载项,控制面板里会一直显示Oracle的大名,点卸载还会报错。清理时同样按F3搜索“Oracle”,把相关项删除。这里的键有时不直接显示Oracle字样,而是GUID命名,所以要搜索键内的DisplayName值来确认。
3.3 环境变量与PATH清理
注册表清完,环境变量也别漏掉。否则打开新命令行窗口,ORACLE_HOME还会指向一个已经不存在的路径,安装新库时可能会被误导。
在“系统属性 - 高级 - 环境变量”中,重点检查系统变量和用户变量里的这几项:
ORACLE_HOME:指向旧数据库主目录,删掉。ORACLE_BASE:指向旧的C:\app\你的用户名,删掉。ORACLE_SID:旧的实例名,删掉。TNS_ADMIN:指向旧网络配置文件目录,删掉。PATH变量中所有包含oracle或dbhome_1的路径段,逐个删除。
有个细节要提醒:清理PATH时不要直接改写成一行空串,而是把不需要的Oracle相关路径段去掉,保留原有的其他路径。某些开发工具、Python、Java等都可能往PATH里写入自己的路径,误删了会导致这些工具全部失灵。修改PATH时,最好先把现有PATH复制到记事本里,把各个路径用分号分隔开,勾出Oracle相关的删掉,再粘贴回去,这样不容易手滑。
环境变量清理完毕后,关闭并重新打开命令行窗口,执行echo %ORACLE_HOME%确认输出为空,再执行set | findstr /i oracle确认没有Oracle相关环境变量。
4. 桌面层与杂项清理:让系统彻底“看不见”Oracle
到这里,目录、注册表、服务、环境变量都清完了,理论上系统核心已经不认识Oracle了。但为了让“巨干净”名副其实,还可以把桌面层和杂项残留一起收拾了。这一部分属于锦上添花,但做完后整个系统会变得非常清爽,重装时出现意外的概率也低很多。
4.1 开始菜单、桌面快捷方式和计划任务
安装Oracle时,安装程序会在开始菜单和桌面创建一堆快捷方式,包括SQL Plus、SQL Developer、Database Configuration Assistant等。卸载时这些图标不会自动消失,尤其在开始菜单里,残留的文件夹还可能会误导你“Oracle是不是没删干净”。手动清理吧:
- 开始菜单:删除
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Oracle - OraDB19Home1整个文件夹。 - 桌面:删除所有Oracle相关快捷方式。
- 当前用户开始菜单:检查
C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs下是否有Oracle相关项。
计划任务也是Oracle经常会注册的地方。在命令行执行:
schtasks /query | findstr /i oracle如果有输出,在任务计划程序里删除对应任务,或者在C:\Windows\System32\Tasks目录下删除对应的任务文件。很多人的Oracle环境里会有OralogMonitor、OracleMTSRecoveryService等任务,不清干净的话,即使服务没了,某些诊断进程还是会被定时拉起,然后疯狂往日志里写错误记录,看着就烦。
4.2 系统目录里的Oracle残留文件
接下来检查C:\Windows\System32和C:\Windows\SysWOW64下有没有Oracle相关文件。常见的残留文件是oracle*.ocx、oracle*.dll、oci.dll等。不过在动手删除前,一定要先确认这些文件确实是Oracle相关的,不要看到名字里带oracle就删。有些公共运行库(比如MSVC运行时)也被其他软件调用,盲目删除可能导致其他应用崩溃。
我的判断方法是:右键文件查看属性,切到“详细信息”或“数字签名”标签,如果公司名是Oracle Corporation,产品名里带Oracle字样,那就可以放心删除。如果公司名是Microsoft Corporation,但文件名里带oracle(比如某些Oracle数据库在Windows系统目录里释放的驱动程序),这种情况相对少见,确认后也可以清理。稳妥起见,删除前先把文件移到一个回收站文件夹里,重启一次系统确认无异常后再彻底清空。
这一步可以有选择地做。如果你的目标是重新安装Oracle,系统目录里那些残留DLL可能会被新安装的OUI误加载,导致安装界面刚启动就报“在要求的应用程序库或文件中检测到错误”。如果你只是想清理磁盘空间,重点把注意力放在数据文件目录就够了。
4.3 安装临时目录与缓存清理
Oracle安装过程会在%TEMP%目录下生成大量临时文件,例如OraInstall开头的目录、setup*日志文件等。这些文件一般不会自动删除,时间长了会堆积好几个GB。卸载完Oracle后,建议执行一次全集清理:
del /s /q "%TEMP%\OraInstall*" del /s /q "%TEMP%\setup*" rmdir /s /q "%TEMP%\OraInstall*"另外,如果安装时把安装介质解压到了磁盘某个目录(比如D:\Software\oracle19c),安装完成后可以把解压目录中的install和stage子目录也清理掉,避免下次误用出错的安装包。这里也要插一句:安装介质一定要从官网或可信渠道下载完整包,不要用网上来路不明的精简包。很多安装中途报“产品无法继续运行”的案例,最后查下来是安装包本身不完整或被修改过,跟系统干不干净其实没关系。
5. 重新安装前的检查与一次成功的安装
到这里,手动卸载流程就完整走完了。在重新安装Oracle 19c之前,我建议你做一次“干净度自检”,确认系统真的没问题,再启动安装程序。这一步能帮你避免前面白干一场,也能让重装过程变得顺风顺水。
5.1 卸载完成后如何自检“够不够干净”
打开一个全新的命令行窗口,按下面这个顺序逐项确认:
sc query | findstr /i oracle reg query HKLM\SOFTWARE\ORACLE echo %ORACLE_HOME% echo %ORACLE_BASE% dir "C:\app\你的用户名"四条命令分别检查服务、注册表、环境变量、目录。如果sc query的输出为空,reg query HKLM\SOFTWARE\ORACLE提示“找不到指定的注册表项”,echo %ORACLE_HOME%输出%ORACLE_HOME%,dir提示“系统找不到指定的路径”,那就说明系统基本干净了。此时再打开控制面板的“程序和功能”,确认列表里也不再有Oracle相关条目。
也可以用Windows自带的搜索工具搜一下“Oracle”关键词,确认开始菜单、磁盘根目录下没有明显残留。不过要提醒一句:如果你注意“搜什么都行”的方式,可能会搜到不少无关文件,比如其他软件自带的oracle JDBC驱动、oracle数据库连接组件,这些不用管,只要没有Oracle主安装目录和注册表键就行。
5.2 重新安装时三个容易踩的坑
重新安装Oracle 19c的时候,有几个坑是很多人踩过千百遍的,我直接列成速查表:
| 问题现象 | 常见原因 | 解决方案 |
|---|---|---|
| 安装界面刚启动就报“在要求的应用程序库或文件中检测到错误,产品无法继续运行。请重新安装应用程序” | 系统目录有残留Oracle DLL,或安装程序被安全软件拦截 | 确认系统目录无残留;临时关闭杀毒软件和防火墙;以管理员身份运行setup.exe |
| 安装到配置监听时提示1521端口被占用 | 旧监听未清理干净,或其它服务占用端口 | 执行netstat -ano查端口占用,找到PID后结束进程或改端口 |
| 安装程序提出“检测到Oracle主目录已存在” | 注册表ORACLE_HOME键或目录残留 | 回到第3章再检查一遍注册表和环境变量,或者手动删除旧目录 |
第一个坑尤其值得展开说。出现“在要求的应用程序库或文件中检测到错误”这个报错时,很多人的第一反应是“那我把安装包重新下载一份吧”,结果换了安装包还是一样的问题。实际上问题大多出在系统残留上。OUI启动时会校验一些动态库,如果路径里加载到了损坏的旧版本DLL,或者杀毒软件把安装生成的临时DLL隔离了,就会直接罢工。我个人的习惯是,在安装之前先把Windows Defender的实时防护暂时关闭,装完后再打开,能省掉很多莫名的报错。
1521端口被占用也是个经典戏码。旧监听服务没删干净,或者本机装过MySQL、Redis之类的软件占用了同一端口,都会导致监听配置失败。处理方式很简单,执行netstat -ano | findstr 1521,看输出的PID是多少,再打开任务管理器结束对应进程,或者直接改Oracle监听端口为1522之类的其他端口。
5.3 安装完成后的验证与常见问题
新装完成后,别急着庆祝,先验证一下服务能否正常工作。用管理员身份打开命令行:
lsnrctl status如果监听正常,会列出监听器名称和几个服务名。然后登录数据库验证:
sqlplus / as sysdba SQL> select status from v$instance;显示OPEN就说明实例启动正常。如果登录时报“ORA-12560: TNS: 协议适配器错误”,通常是监听没起来,用lsnrctl start手动启动再试一次;如果SQL*Plus提示权限不足,检查sqlnet.ora里的SQLNET.AUTHENTICATION_SERVICES是否设置了(NTS),没有的话补上。
等待新库创建完成后,还可以观察一下SYSAUX表空间的占用情况。Oracle 19c在刚建库时,SYSAUX会随着自动负载信息库、优化器统计信息等组件的初始化而快速增长,这是正常现象,不用太紧张。如果后续发现它涨得异常,再考虑收缩或迁移表空间,那就是另一个专题了。
还有一个小建议:安装前先把JAVA_HOME环境变量临时删掉或改名。OUI在安装过程中会用到自带的JDK,如果检测到系统已安装的JDK版本不兼容,可能弹出奇怪的错误。这个问题在Windows上出现过多次,处理方式也很简单:安装期间不设置JAVA_HOME,或者把Oracle安装目录排除在杀毒软件扫描范围之外。
写在最后的一个小提醒
手动卸载Oracle 19c这件事,说难是真不难,每一步都是体力活,但最考验人的是细致和顺序。目录、服务、注册表、环境变量,一环扣一环,漏了哪个,重装的时候它都会跳出来给你“惊喜”。我把这次操作的经验总结成一句话:顺序别乱,确认再走,别图快。每次删除操作前多看一眼路径,每次清完注册表后重启一次电脑再继续,花不了多少时间,但能避免返工。
最后再分享一个小技巧:如果你想练手,别拿生产机直接整。先在虚拟机里装一遍Oracle 19c,再手动卸载一遍,熟悉完整流程后,再回到自己的电脑上操作。我在虚拟机里来回折腾了三四遍,把各种报错都见了一遍,回头处理真机时就从容很多。手动卸载最大的好处,就是你对自己系统里每一处跟Oracle有关的东西都心里有数,这种掌控感,是任何一键清理工具都给不了的。