Oracle 19c安装主机名解析失败:hosts文件添加静态映射

作者:技术拾光时间:2026-06-17 08:45:07浏览:357

在 Oracle 19c 安装过程中,一个最容易被忽视的问题是报错 INS-30014 或 PRVF-0002。绝大多数情况都是因为 /etc/hosts 文件配置不正确导致的。这里的问题不是没写,而是写了一个“看起来正确、实际错误”的版本。 /etc/hosts 必须同时映射短名和完整名,且不能使

在 Oracle 19c 安装过程中,一个最容易被忽视的问题是报错 INS-30014 或 PRVF-0002。绝大多数情况都是因为 /etc/hosts 文件配置不正确导致的。这里的问题不是没写,而是写了一个“看起来正确、实际错误”的版本。

Oracle 19c安装主机名解析失败:hosts文件添加静态映射


/etc/hosts 必须同时映射短名和完整名,且不能使用 127.0.0.1

Oracle 19c 的安装程序会调用 hostname -f 获取完整主机名(例如 rac1.example.com),然后根据该字符串去查询 /etc/hosts。它不会回退到 127.0.0.1,也不会去询问 DNS。因此,配置必须一步到位。

常见的错误写法有两种:

  • 127.0.0.1 rac1 —— 即使 hostname 输出为 rac1,也会失败,因为 hostname -f 返回的是 rac1.example.com,而该完整名称在 hosts 文件中没有出现。
  • 127.0.0.1 rac1.example.com rac1 —— IP 使用了本地回环,但 Oracle 要求使用本机真实网卡 IP(例如 192.168.10.10)。

正确的写法如下:

192.168.10.10 rac1.example.com rac1

配置完成后,可运行以下三条命令验证:

  • hostname → 应输出 rac1
  • hostname -f → 应输出 rac1.example.com
  • grep rac1 /etc/hosts → 应返回包含 192.168.10.10 的行,且两个名称都在其中

runcluvfy 报 PRVF-4657 或 PRVF-4664 的真实检查逻辑

该错误并非 DNS 问题,而是 Oracle 执行的一套严格本地闭环验证:使用系统的 getaddrinfo() 和 gethostbyaddr() 进行正向和反向解析,要求两者完全一致。

  • 正向解析:用 rac1.example.com 查询 IP → 必须得到 192.168.10.10
  • 反向解析:用 192.168.10.10 查询主机名 → 必须返回 rac1.example.com(不能是 rac1 或其他别名)

常见踩坑点:

  • /etc/hosts 中该 IP 行后面多了一个空格或制表符,导致第二个字段被截断
  • 虚拟机克隆后未更新 IP,但 hostname -f 已修改,而 hosts 仍为旧配置
  • 容器环境中 hostname 为随机生成的字符串(如 8a3f2b1e4c7d),但 /etc/hosts 未同步,也未挂载外部 hosts

可使用 nslookup 快速验证:

  • nslookup rac1.example.com → 检查是否返回 192.168.10.10
  • nslookup 192.168.10.10 → 检查是否返回 rac1.example.com

注意:第二步依赖 DNS 的 PTR 记录;如果不走 DNS,仅靠 /etc/hosts 无法完成反向解析,因此必须确保 hosts 配置已覆盖全部需求。


SCAN 域名也遵循同一套解析逻辑,但要求更严格

在 RAC 场景下,scan.example.com 与节点主机名一样,受同一套解析校验约束,且存在额外要求:

  • 解析结果必须返回 2–3 个不同的 IPv4 地址(即 getaddrinfo() 返回至少 2 个 AF_INET 结构体)
  • /etc/hosts 中不能写成单行多个 IP,例如 192.168.10.10 192.168.10.11 192.168.10.12 scan.example.com 这种写法无效
  • 必须分三行书写,每行一个 IP 加相同域名:
    192.168.10.10 scan.example.com
    192.168.10.11 scan.example.com
    192.168.10.12 scan.example.com

否则 srvctl start scan 会静默失败,或者 srvctl status scan_listener 显示监听器只绑定了部分 VIP。这是典型的“约定大于配置”场景,少写一行都不行。


最后提醒一点:修改 /etc/hosts 后,hostname -f 的输出可能仍在缓存旧值,尤其在 systemd 系统上。不要仅依赖命令输出,应以 getaddrinfo("rac1.example.com", ...) 实际调用的结果为准——这意味着最好重试安装,或者至少重启 systemd-hostnamed 服务,实在不行就 reboot。与其花半小时排查,不如先花两分钟重启一下,很多时候问题就这么解决了。