06-Oracle卸载与重装完整流程

文章目录

  • 一、场景切入
  • 二、卸载不干净的后果
  • [三、方式一:deinstall 工具(推荐)](#三、方式一:deinstall 工具(推荐))
    • [3.1 交互式卸载](#3.1 交互式卸载)
    • [3.2 静默两步卸载](#3.2 静默两步卸载)
  • [四、方式二:runInstaller 卸载](#四、方式二:runInstaller 卸载)
  • 五、手工清理完整清单
    • [5.1 停库、停监听](#5.1 停库、停监听)
    • [5.2 杀残留进程](#5.2 杀残留进程)
    • [5.3 删除软件与数据目录](#5.3 删除软件与数据目录)
    • [5.4 清理 inventory 配置与 oratab](#5.4 清理 inventory 配置与 oratab)
    • [5.5 清理 /usr/local/bin 下的切换脚本](#5.5 清理 /usr/local/bin 下的切换脚本)
    • [5.6 清理临时文件](#5.6 清理临时文件)
    • [5.7 释放共享内存段与信号量](#5.7 释放共享内存段与信号量)
    • [5.8 删除用户与组(可选)](#5.8 删除用户与组(可选))
  • 六、清理后的验证(重装前检查)
  • 七、要点总结

一、场景切入

安装失败后想推倒重来,rm -rf /u01 一把删完就重装,结果 runInstaller 刚起来就报 inventory 相关错误;或者旧机器要腾出来装新库,发现 DBCA 建库时总带着旧 SID 的影子。这些多半是上次没卸干净。Oracle 的安装状态散落在文件系统、inventory、共享内存多个地方,清单式清理才能卸得干净。

二、卸载不干净的后果

  • Central Inventory(/etc/oraInst.loc 指向的目录)里残留旧 ORACLE_HOME 注册,重装时路径冲突,报 INS-32014 之类的目录占用错
  • oraInst.loc 指向的目录被删了但文件还在,runInstaller 直接报 inventory 损坏
  • /etc/oratab 残留旧实例条目,oraenv 切换环境时找不到库,dbca/自动巡检脚本被误导
  • 旧实例留下的共享内存段、信号量没释放,新实例启动时报资源不足
  • /usr/local/bin 下的 dbhome、oraenv 还是旧路径的脚本

三、方式一:deinstall 工具(推荐)

Oracle 自带的官方卸载工具,会自动停库、删文件、清 inventory 和 oratab 条目。

3.1 交互式卸载

bash 复制代码
su - oracle
cd $ORACLE_HOME/deinstall
./deinstall

过程中按提示确认数据库列表、是否删除数据库与文件,一路确认即可。完成后它会把执行过的清理动作汇总输出。

3.2 静默两步卸载

先生成响应文件(此时不做任何删除):

bash 复制代码
./deinstall -silent -checkonly

结束后提示生成的 rsp 文件路径,形如 /home/oracle/deinstall/deinstall_config_txt_2024-xx-xx.ora,再执行真正的卸载:

bash 复制代码
./deinstall -silent -paramfile /home/oracle/deinstall/deinstall_config_txt_2024-xx-xx.ora

注意 $ORACLE_HOME/deinstall 目录不存在时,需要单独下载对应版本的 deinstall 工具包。

四、方式二:runInstaller 卸载

bash 复制代码
$ORACLE_HOME/runInstaller -deinstall -home $ORACLE_HOME

本质是调起 deinstall,流程同上。旧习惯里还有图形界面卸载:执行 ./runInstaller,在欢迎页右下角点"卸载产品(Deinstall Products)",勾选要卸载的 home。这种方式只卸软件文件,不动数据库文件和 oratab,适合保留数据只升级软件的中间步骤。

五、手工清理完整清单

deinstall 偶尔也有漏网之鱼,以下清单按顺序执行,适合彻底重装的场景。以下命令除特别说明外都切 root 执行。

动手前先看总览,清理位置一共七类:

位置 内容 处理方式
/u01/app/oracle 软件家目录、数据文件、诊断日志 rm -rf
/u01/app/oraInventory Central Inventory 注册信息 rm -rf
/etc/oraInst.loc inventory 位置声明 rm -f
/etc/oratab 实例与 home 对照表 按行删除
/etc/oracle ocr.loc 等服务注册信息 rm -rf
/usr/local/bin dbhome、oraenv、coraenv 脚本 rm -f
内核 IPC 共享内存段、信号量 ipcrm 释放

/tmp 与 /var/tmp 下的 .oracle、OraInstall* 属于第八类临时残留,一并处理。下面逐项展开。

5.1 停库、停监听

bash 复制代码
su - oracle
lsnrctl stop
sqlplus / as sysdba <<'EOF'
shutdown immediate;
exit;
EOF

5.2 杀残留进程

bash 复制代码
ps -ef | grep $ORACLE_HOME | grep -v grep
kill -9 <上面列出的PID>

5.3 删除软件与数据目录

bash 复制代码
rm -rf /u01/app/oracle
rm -rf /u01/app/oraInventory

如果 /u01 专门划给 Oracle,直接 rm -rf /u01/app 更省事。

5.4 清理 inventory 配置与 oratab

bash 复制代码
rm -f /etc/oraInst.loc
sed -i '/^orcl:/d' /etc/oratab
rm -rf /etc/oracle
  • /etc/oraInst.loc:Central Inventory 的位置声明,删除后重装会自动重建
  • /etc/oratab:实例与 ORACLE_HOME 对照表,按 SID 前缀删行
  • /etc/oracle:存放 ocr.loc 等 Oracle 服务注册信息

5.5 清理 /usr/local/bin 下的切换脚本

bash 复制代码
ls -l /usr/local/bin/dbhome /usr/local/bin/oraenv /usr/local/bin/coraenv 2>/dev/null
rm -f /usr/local/bin/dbhome /usr/local/bin/oraenv /usr/local/bin/coraenv

5.6 清理临时文件

bash 复制代码
rm -rf /tmp/OraInstall* /tmp/.oracle /var/tmp/.oracle
rm -rf /home/oracle/deinstall /home/oracle/oraInstallerLogs 2>/dev/null

/tmp/.oracle 里是实例运行期的 socket 文件,不删可能影响下次安装。

5.7 释放共享内存段与信号量

bash 复制代码
ipcs -m | grep -i oracle
ipcs -s | grep -i oracle

有输出则逐个释放:

bash 复制代码
ipcrm -m <shmid>
ipcrm -s <semid>

批量处理脚本:

bash 复制代码
for id in $(ipcs -m | awk '/oracle/{print $2}'); do ipcrm -m $id; done
for id in $(ipcs -s | awk '/oracle/{print $2}'); do ipcrm -s $id; done

消息队列同理:ipcs -q | grep -i oracle 后 ipcrm -q <msqid>。

5.8 删除用户与组(可选)

确认这台机器不再跑 Oracle 后:

bash 复制代码
userdel -r oracle
groupdel dba
groupdel oper 2>/dev/null
groupdel oinstall

如果马上要重装,保留用户和组,省去重建步骤。

重装前确认 oracle 用户的环境变量指向新规划的路径:旧 ORACLE_HOME 已删除,残留的旧变量会在安装和启动时造成路径混淆。

六、清理后的验证(重装前检查)

逐项过一遍,全部满足再启动新的安装:

bash 复制代码
# inventory 声明已不存在,或指向的目录为空
ls -l /etc/oraInst.loc 2>/dev/null

# oratab 无旧条目(或文件已不存在)
cat /etc/oratab 2>/dev/null

# 共享内存与信号量无 oracle 残留
ipcs -m | grep -i oracle
ipcs -s | grep -i oracle

# 软件目录已清空
ls /u01/app 2>/dev/null

# 切换脚本已删除
ls /usr/local/bin/oraenv 2>/dev/null

# oracle 用户环境正常(保留用户时)
id oracle
su - oracle -c "echo \$ORACLE_HOME"

# 空间与基础环境
df -h /u01 /tmp
getenforce

六项检查均无残留输出即干净。之后按 03 篇重新准备环境、按 05 篇的排错思路走安装,首步安装会自动重建 Central Inventory 并生成新的 /etc/oraInst.loc。

如果只是 inventory 损坏、软件和数据都想保留,单独重建 inventory 即可,不必整体卸载,这是另一条更轻的路径。

七、要点总结

  • 卸载优先用 $ORACLE_HOME/deinstall/deinstall,静默两步:-checkonly 生成响应文件再 -paramfile 执行
  • 手工清理清单:停库停监听 → 杀进程 → 删 /u01 → /etc/oraInst.loc、/etc/oratab、/etc/oracle → /usr/local/bin 三个脚本 → /tmp/.oracle → ipcs 释放内存段信号量 → 视需要删用户组
  • 共享内存和信号量是最容易被漏掉的两项,重装前务必 ipcs -m、ipcs -s 检查
  • 重装前跑一遍第六节的检查清单,比装到一半报错再回头排查省时间
相关推荐
ss2731 小时前
AI全栈实战 | 3.6-01 数据库与 ORM:学过 MyBatis 再看 SQLAlchemy,才知道“半自动“和“全自动“差在哪
数据库·mybatis
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 13-Django 模型定义与使用 3
数据库·后端·python·测试工具·oracle·django
麦壳饼1 小时前
Docker 快速上手:5 分钟运行 SonnetDB
数据库·docker·sonnetdb
for_ever_love__1 小时前
缓存穿透、击穿、雪崩:三个经典问题与完整解决方案
java·数据库·redis·缓存·哈希算法·布隆过滤器·雪崩
麦壳饼1 小时前
CLI 工具安装与使用:sndb 命令行指南
数据库·sonnetdb
龙腾AI白云1 小时前
数字孪生驱动大模型工业知识库:为具身机器人植入领域专业经验
数据库·人工智能·机器学习·知识图谱
我科绝伦(Huanhuan Zhou)2 小时前
oracle RAC共享存储换盘操作指南
数据库·oracle
wangbing11252 小时前
重建oracle服务
数据库·oracle
唐小码2 小时前
MYSQL表中没有主键,怎么找到重复的数据
数据库