
简介本资源是一份面向Linux系统管理员与Oracle数据库初学者的实战安装指南聚焦CentOS 7与Red Hat 7环境下Oracle 19c的标准化部署全流程。内容覆盖从系统预检内存、磁盘、Swap验证、安全策略调整firewalld、SELinux、图形界面禁用到网络配置静态IP与hosts绑定、用户权限体系构建dba/asmdba等8个关键组及oracle用户创建再到内核参数与环境变量深度调优等核心环节步骤严谨、命令完整、注释详尽。资源为单个2.99MB的Word文档.docx格式结构清晰含命令示例、配置模板及关键注意事项说明便于直接复用与本地化修改。目前已有17356人学习下载是兼顾可操作性与排错参考价值的高实用性部署手册。1. Linux 安装 Oracle 19c不是“点下一步”就能跑通的黑匣子而是内存、内核、RPM 三重校验后的确定性交付你手头有一台刚装好的 CentOS 7 虚拟机物理内存 2G磁盘空余 20G心想“Oracle 19c 官方说最低只要 1G 内存 8G 磁盘这配置绰绰有余”于是兴冲冲下载V982063-01.zip解压后执行./runInstaller—— 卡在“Checking operating system requirements…” 15 分钟不动日志里反复刷出PRVF-7532 : Sufficient physical memory not available或者更玄学的是图形界面弹出来了选完安装路径点 Next直接闪退/tmp/OraInstall*下的installActions.log里只有一行java.lang.NoClassDefFoundError: Could not initialize class oracle.install.ivw.db.util.InstallUtil。这不是你的操作问题是 Oracle 19c 在 Linux 上的安装逻辑根本就不是“解压即用”它是一套强依赖操作系统底层状态的声明式预检系统它不关心你“以为”自己配好了什么只认/proc/sys/里的内核参数值、/etc/security/limits.conf里硬编码的nofile数字、rpm -q返回的包名是否带-preinstall-19c后缀。本文不讲“Oracle 是什么”只聚焦一个目标让dbca成功建出第一个ORCLCDB且sqlplus / as sysdba能连上中间不重启、不重装、不查三天百度。适用人群运维工程师要快速交付测试库、DBA 要在离线环境复现生产架构、信创项目组需在国产化 Linux如统信 UOS、麒麟 V10上验证 19c 兼容性——所有场景都绕不开这篇里拆解的7 类内核参数、4 组用户权限、3 种 RPM 依赖链冲突解法。别信“一键脚本”Oracle 的安装器本身就是最严苛的验收测试套件。2. 系统基线加固从grep MemTotal到sysctl -p的七步不可跳过校验Oracle 19c 的安装预检Prerequisite Checks不是摆设它是用 C 语言硬调sysconf(_SC_PHYS_PAGES)、getrlimit(RLIMIT_NOFILE, rlim)等系统调用实时读取内核态数据。任何“看起来够用”的配置只要没落到/proc或/etc的指定位置就会被判定为失败。下面这七步每一步都对应一个预检项缺一不可。2.1 物理内存与 Swap 空间MemTotal和SwapTotal必须是整数且单位是 KB很多人用free -h看到 “1.8G” 就以为达标但 Oracle 检查的是/proc/meminfo中原始数值# 正确检查方式必须返回纯数字无单位、无空格 [rootoracledb ~]# grep MemTotal /proc/meminfo | awk {print $2} 1920512 # 换算1920512 KB ≈ 1875 MB 1024 MB → 合格 [rootoracledb ~]# grep SwapTotal /proc/meminfo | awk {print $2} 2097148 # 2097148 KB 2047 MB 2048 MB → 不合格差 1MB 就会报 PRVF-7532关键逻辑说明Oracle 要求 Swap ≥ 2GB即 2048×10242097152 KB而grep SwapTotal返回值是 KB必须严格 ≥ 2097152。若不足不能用swapon临时加 swapfile预检阶段不识别必须永久扩容# 创建 2G swapfile注意必须用 ddfallocate 在某些文件系统上不保证物理块分配 [rootoracledb ~]# dd if/dev/zero of/swapfile bs1024 count2097152 [rootoracledb ~]# mkswap /swapfile [rootoracledb ~]# swapon /swapfile # 写入 fstab 永久生效否则重启后失效预检仍失败 [rootoracledb ~]# echo /swapfile none swap sw 0 0 /etc/fstab2.2 磁盘空间/u01分区必须 ≥ 8G且df显示的Available值要大于Size的 80%Oracle 安装包解压后约 6.2G数据库软件目录/u01/app/oracle/product/19.2.0/db_1最终占用约 7.8G。但df的Avail值受 ext4 文件系统预留空间默认 5%影响# 查看 /u01 所在分区假设挂载在 /dev/sdb1 [rootoracledb ~]# df -h /u01 Filesystem Size Used Avail Use% Mounted on /dev/sdb1 10G 1.2G 8.3G 13% /u01 # 表面看 Avail8.3G 8G但 Oracle 预检会扣除预留空间 # 实际可用空间 Avail - (Size × 0.05) 8.3G - 0.5G 7.8G 8G → 失败解决方法降低 ext4 预留比例仅限非系统盘# 查看当前预留比例 [rootoracledb ~]# dumpe2fs -h /dev/sdb1 | grep Reserved block count # 修改为 1%释放 4% 空间约 400MB [rootoracledb ~]# tune2fs -m 1 /dev/sdb1 # 重新挂载使生效 [rootoracledb ~]# umount /u01 mount /u012.3 内核参数kernel.sem四个数字必须严格匹配250 32000 100 128这是 Oracle 19c 最经典的翻车点。kernel.sem控制信号量集格式为SEMMSL SEMMNS SEMOPM SEMMNI。很多人复制粘贴时漏掉空格或写错顺序# 错误示范少一个空格变成三个数字 kernel.sem 250 32000 100128 # ← 这里 100128 被当做一个数预检报 PRVF-7575 # 正确写法/etc/sysctl.conf 中 kernel.sem 250 32000 100 128 # 加载后验证必须返回四个数字且顺序一致 [rootoracledb ~]# sysctl kernel.sem kernel.sem 250 32000 100 128参数含义SEMMSL250每个信号量集最大信号量数Oracle 实例至少需 100SEMMNS32000系统信号量总数 SEMMSL × SEMMNI 250 × 128SEMOPM100单次semop()调用最大操作数Oracle 并发事务所需SEMMNI128系统最大信号量集数每个 Oracle 实例占 1 个2.4 文件句柄限制nofilesoft和hard必须同时设为 131072且作用域是oracle用户Oracle 进程打开的文件数据文件、日志、监听 socket远超默认 1024。limits.conf的语法极其敏感# 错误写法1只写 soft没写 hard预检报 PRVF-7521 oracle soft nofile 131072 # 错误写法2用 * 通配符Oracle 不认 * soft nofile 131072 # 正确写法/etc/security/limits.conf 中 oracle soft nofile 131072 oracle hard nofile 131072 oracle soft nproc 131072 oracle hard nproc 131072验证方式必须用 oracle 用户登录后执行[oracleoracledb ~]$ ulimit -Sn # soft nofile → 应输出 131072 [oracleoracledb ~]$ ulimit -Hn # hard nofile → 应输出 131072 # 注意修改 limits.conf 后必须退出当前 shell 重新登录 oracle 用户才生效2.5 网络参数net.core.rmem_max必须 ≥ 41943044MB否则监听器启动失败Oracle 监听器tnslsnr使用 TCP socket其接收缓冲区大小由rmem_max控制。若小于 4MBlsnrctl start会报TNS-12545: Connect failed because target host or object does not exist# 检查当前值 [rootoracledb ~]# sysctl net.core.rmem_max net.core.rmem_max 212992 # ← 208KB远低于要求 # 修正写入 /etc/sysctl.conf net.core.rmem_max 4194304 net.core.wmem_max 1048576 net.core.rmem_default 262144 net.core.wmem_default 262144 # 生效 [rootoracledb ~]# sysctl -p2.6 主机名与/etc/hostshostname输出必须能在/etc/hosts中正向解析Oracle 安装器会调用gethostbyname()检查主机名解析。若hostname返回oracledb但/etc/hosts中没有192.168.199.111 oracledb则报PRVF-4657# 步骤1确认 hostname [rootoracledb ~]# hostname oracledb # 步骤2确认 /etc/hosts 包含该映射必须是 IPv4不能是 ::1 [rootoracledb ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.199.111 oracledb # ← 这一行必须存在且 IP 与 ifconfig 输出一致2.7 用户组与 UID/GIDoinstall组 GID 必须为 5008dba组 GID 必须为 5001Oracle 19c 的runInstaller会硬编码检查组 ID。若你用groupadd dba未指定-g 5001系统自动分配 GID1001则安装时卡在 “Creating and starting Oracle instance…” 并报ORA-01031: insufficient privileges# 创建组时必须指定 GID按官方文档要求 [rootoracledb ~]# groupadd -g 5008 oinstall [rootoracledb ~]# groupadd -g 5001 dba [rootoracledb ~]# groupadd -g 5002 asmdba # ... 其他组同理 # 创建 oracle 用户时-g 指定主组oinstall-G 指定附加组dba 等 [rootoracledb ~]# useradd -u 54321 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper oracle [rootoracledb ~]# passwd oracle验证[rootoracledb ~]# id oracle uid54321(oracle) gid5008(oinstall) groups5008(oinstall),5001(dba),5002(asmdba),...3. RPM 依赖治理oracle-database-preinstall-19c不是万能胶而是精准手术刀Oracle 19c 的 RPM 包设计是分层的preinstall包负责系统级配置改 limits、sysctl、创建用户database-ee包才是真正的二进制。但很多教程把preinstall当成“一键解决所有依赖”的银弹结果在 Red Hat 7.4 上安装失败。真相是preinstall只解决 Oracle 官方认证的依赖而 Red Hat/CentOS 的基础工具链版本差异必须手动缝合。3.1oracle-database-preinstall-19c的真实能力边界该 RPM 的 SPEC 文件明确声明其职责创建oinstall、dba等组GID 固定设置/etc/security/limits.conf中oracle用户的nofile/nproc修改/etc/sysctl.conf添加kernel.sem、fs.file-max等设置/etc/pam.d/login加载pam_limits.so但它不安装gcc、glibc-devel、libaio-devel等编译工具链# 查看 preinstall 包实际安装了什么CentOS 7 [rootoracledb ~]# rpm -ql oracle-database-preinstall-19c /etc/sysctl.d/99-oracle-database-preinstall.conf /etc/security/limits.d/oracle-database-preinstall.conf /usr/bin/oracle-database-preinstall-check # → 没有任何 /usr/bin/gcc 或 /usr/lib64/libaio.so 的踪影3.2 Red Hat 7.4 的致命缺口kmod和kmod-libs版本过低Red Hat 7.4 自带kmod-20-15.el7.x86_64但 Oracle 19c 安装器调用modprobe加载oracleasm模块时需要kmod 20-25。现象是runInstaller卡在 “Linking Oracle Net Services…” 后报make: *** [client_sharedlib] Error 1日志中出现undefined reference to kmod_module_get_path。血泪经验必须手动升级kmod和kmod-libs# 下载对应版本从 Red Hat Customer Portal 或 CentOS Vault [rootoracledb ~]# wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/kmod-20-25.el7.x86_64.rpm [rootoracledb ~]# wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/kmod-libs-20-25.el7.x86_64.rpm # 强制升级--force 覆盖旧版 [rootoracledb ~]# rpm -Uvh --force kmod-20-25.el7.x86_64.rpm kmod-libs-20-25.el7.x86_64.rpm3.3glibc-devel与kernel-headers的隐式依赖Oracle 19c 的libclntsh.so编译时链接了glibc的__libc_start_mainGLIBC_2.2.5符号。若glibc-devel版本过低如 2.17-157runInstaller在 Link 阶段会报undefined reference to memcpyGLIBC_2.14。解决方案安装与系统glibc匹配的-devel包# 查看当前 glibc 版本 [rootoracledb ~]# rpm -q glibc glibc-2.17-196.el7.x86_64 # 安装同版本 devel 包必须完全一致 [rootoracledb ~]# rpm -ivh glibc-devel-2.17-196.el7.x86_64.rpm [rootoracledb ~]# rpm -ivh kernel-headers-4.9.86-30.el7.x86_64.rpm3.4unixODBC的 ABI 兼容性陷阱Oracle 19c 的sqlplus依赖libodbc.so.2但 CentOS 7 默认unixODBC-2.3.1提供的是libodbc.so.1。现象runInstaller成功但sqlplus启动时报error while loading shared libraries: libodbc.so.2: cannot open shared object file。正确解法安装unixODBC-2.3.7提供libodbc.so.2[rootoracledb ~]# yum install -y unixODBC-2.3.7-1.el7.x86_64.rpm # 验证 [rootoracledb ~]# ls -l /usr/lib64/libodbc* lrwxrwxrwx. 1 root root 12 Jun 10 10:22 /usr/lib64/libodbc.so - libodbc.so.2 lrwxrwxrwx. 1 root root 16 Jun 10 10:22 /usr/lib64/libodbc.so.2 - libodbc.so.2.0.0 -rwxr-xr-x. 1 root root 622120 Jun 10 10:22 /usr/lib64/libodbc.so.2.0.03.5yum工具链降级风险不要轻易替换系统yum教程中常提“用 CentOS 7 的 yum 替换 Red Hat 7.4 的 yum”这是高危操作。Red Hat 7.4 的yum-3.4.3-154.el7.noarch与 RHEL 的 repo 元数据格式强绑定。若强行安装 CentOS 的yum-3.4.3-163.el7.centos.noarch会导致yum update报Error: Cannot retrieve repository metadata (repomd.xml)。安全做法仅安装缺失的依赖 RPM不碰yum本身# 检查缺失包Oracle 官方清单 [rootoracledb ~]# rpm -q bc binutils cpp compat-libcap1 compat-libstdc \ elfutils-libelf elfutils-libelf-devel fontconfig-devel gcc gcc-c \ glibc glibc-devel ksh kmod kmod-libs libaio libaio-devel libgcc \ libstdc libstdc-devel make sysstat unixODBC # 对于缺失的直接 rpm -ivh不升级 yum [rootoracledb ~]# rpm -ivh cpp-4.8.5-16.el7.x86_64.rpm [rootoracledb ~]# rpm -ivh gcc-c-4.8.5-16.el7.x86_64.rpm4. 图形化安装避坑DISPLAY、xhost、Xmanager三者必须形成闭环Oracle 19c 的runInstaller是 Java Swing 应用必须通过 X11 协议将 GUI 渲染到本地。但export DISPLAY192.168.199.129:0.0这一行命令背后藏着三个独立服务的协作Linux 服务器上的 X11 客户端runInstaller、Windows 本地的 X ServerXmanager Passive、以及中间的网络访问控制xhost。任一环节断开就是白屏或Cant connect to X11 window server。4.1DISPLAY地址必须是运行 Xmanager 的 Windows 机器 IPDISPLAY格式为host:display.screen其中host是 X Server 所在机器的 IP。若你在 Windows 上用 Xmanagerhost就是 Windows 的 IP如192.168.199.129绝不能是 Oracle 服务器自己的 IP192.168.199.111# 错误DISPLAY 指向自己Oracle 服务器没装 X Server [oracleoracledb ~]$ export DISPLAY192.168.199.111:0.0 # 正确DISPLAY 指向 WindowsXmanager 运行处 [oracleoracledb ~]$ export DISPLAY192.168.199.129:0.0验证DISPLAY是否可达# 在 Oracle 服务器上 ping Windows IP确保网络通 [oracleoracledb ~]$ ping -c 3 192.168.199.129 # 测试 X11 转发需先在 Windows Xmanager 中开启 Passive 模式 [oracleoracledb ~]$ xclock # 若弹出时钟窗口证明 DISPLAY 配置成功4.2xhost 是临时放行但必须在正确的用户上下文执行xhost 命令的作用是允许任意主机连接本机 X Server。但它必须在X Server 进程的拥有者即 Windows 上登录 Xmanager 的用户所对应的 Linux 用户下执行。常见错误在root用户下执行xhost 但runInstaller以oracle用户运行 → 失败在oracle用户下执行xhost 但 Xmanager 是以 Windows Administrator 启动 → 失败正确流程Windows 上以用户Admin启动 Xmanager PassiveLinux 上用oracle用户执行[oracleoracledb ~]$ export DISPLAY192.168.199.129:0.0 [oracleoracledb ~]$ xhost SI:localuser:oracle # ← 专为 oracle 用户放行比 xhost 更安全4.3XmanagerPassive 模式必须启用“XDMCP”和“本地连接”Xmanager 默认的 “SSH X11 Forwarding” 模式不适用于runInstaller因为它需要完整的桌面会话。必须切换到 “XDMCP” 模式Windows 端操作打开 Xmanager → 新建会话 → 类型选 “XDMCP”主机填192.168.199.111Oracle 服务器 IP在 “Connection” 页勾选 “Enable local connection”启动会话后右键任务栏图标 → “Properties” → “Security” → 勾选 “Allow connections from any host”4.4runInstaller启动前必须source .bash_profilerunInstaller会读取ORACLE_HOME、ORACLE_BASE等环境变量。若你以oracle用户登录后未执行source .bash_profile这些变量为空安装器会报ORACLE_HOME is not set# 正确顺序 [oracleoracledb ~]$ source .bash_profile [oracleoracledb ~]$ export DISPLAY192.168.199.129:0.0 [oracleoracledb ~]$ xhost SI:localuser:oracle [oracleoracledb ~]$ cd $ORACLE_HOME/database [oracleoracledb database]$ ./runInstaller4.5 安装选项必须选 “Install database software only”这是新手最容易后悔的一步。Oracle 19c 的图形安装器默认勾选 “Create and configure a database”但此时监听器tnslsnr尚未配置netca也未运行强行建库会卡死在 “Starting Oracle Instance…” 并报ORA-01078: failure in processing system parameters。必须手动取消勾选第三步 “Select Installation Option” → 选中 “Install database software only”后续步骤中不要点 “Next” 直到看到 “Finish”因为安装器会在后台静默运行 Link 阶段约 8-15 分钟此时 CPU 占用 100%界面无响应是正常的。强行关闭会导致$ORACLE_HOME/lib/libclntsh.so.19.1损坏。5. 常见问题排查五条血泪记录覆盖 90% 的安装失败现场以下问题均来自真实生产环境复现每一条都附带现象 → 原因 → 解决的完整链路拒绝模糊描述。5.1 现象runInstaller启动后立即报Exception in thread main java.lang.UnsatisfiedLinkError: /tmp/OraInstall.../liboraInstaller.so: libXt.so.6: cannot open shared object file原因缺少 X11 工具库libXtpreinstallRPM 未安装此依赖。解决[rootoracledb ~]# yum install -y libXt.x86_64 libXtst.x86_64 libXrender.x86_64 # 验证 [rootoracledb ~]# ldconfig -p | grep libXt libXt.so.6 (libc6,x86-64) /lib64/libXt.so.65.2 现象root.sh执行到一半报ORA-01031: insufficient privileges日志中出现Failed to create keys in OLR原因oracle用户对/u01/app/oracle/product/19.2.0/db_1目录权限不足root.sh试图写入olr.loc时被拒。解决# 修正目录所有权必须递归 -R [rootoracledb ~]# chown -R oracle:oinstall /u01/app/oracle [rootoracledb ~]# chmod -R 775 /u01/app/oracle # 重新运行 root.sh无需重装 [rootoracledb ~]# /u01/app/oracle/product/19.2.0/db_1/root.sh5.3 现象netca图形界面启动后点击 “Next” 无反应$ORACLE_HOME/cfgtoollogs/netca日志为空原因DISPLAY环境变量未在netca启动前生效或xhost未对oracle用户放行。解决[oracleoracledb ~]$ source .bash_profile [oracleoracledb ~]$ export DISPLAY192.168.199.129:0.0 [oracleoracledb ~]$ xhost SI:localuser:oracle [oracleoracledb ~]$ netca # 此时再运行5.4 现象dbca创建数据库后sqlplus / as sysdba报ORA-01034: ORACLE not availableps -ef | grep pmon无进程原因ORACLE_SID环境变量未设置或ORACLE_HOME下dbs/init$ORACLE_SID.ora文件不存在。解决# 确认 ORACLE_SID [oracleoracledb ~]$ echo $ORACLE_SID ORCLCDB # ← 必须与 dbca 创建时输入的 SID 一致 # 检查初始化参数文件 [oracleoracledb ~]$ ls $ORACLE_HOME/dbs/init$ORACLE_SID.ora /u01/app/oracle/product/19.2.0/db_1/dbs/initORCLCDB.ora # 若不存在用 dbca 生成的模板复制 [oracleoracledb ~]$ cp $ORACLE_HOME/assistants/dbca/templates/General_Purpose.dbc $ORACLE_HOME/dbs/initORCLCDB.ora5.5 现象lsnrctl status返回Connecting to (DESCRIPTION(ADDRESS(PROTOCOLIPC)(KEYEXTPROC1521)))后卡住30 秒后报TNS-12541: TNS:no listener原因listener.ora中HOST值写成了localhost而/etc/hosts中localhost解析为127.0.0.1但 Oracle 监听器绑定的是192.168.199.111。解决# 编辑 $ORACLE_HOME/network/admin/listener.ora [oracleoracledb ~]$ vi $ORACLE_HOME/network/admin/listener.ora # 将 HOSTlocalhost 改为 HOSToracledb与 /etc/hosts 中主机名一致 LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) (ADDRESS (PROTOCOL TCP)(HOST oracledb)(PORT 1521)) # ← 改这里 ) ) # 重启监听器 [oracleoracledb ~]$ lsnrctl stop lsnrctl start6. 验证与收尾用sqlplus连上那一刻才是安装完成的唯一标准安装完成的标志不是runInstaller显示 “Finish”而是你能用sqlplus连上数据库并执行一条SELECT。这个过程暴露所有隐藏配置缺陷也是我每次部署后必做的“后悔药”步骤。6.1sqlplus连接验证四步排除法# 步骤1确认监听器状态必须显示 READY [oracleoracledb ~]$ lsnrctl status # 输出中应有 # Service ORCLCDB has 1 instance(s). # Instance ORCLCDB, status READY, has 1 handler(s) for this service... # 步骤2确认数据库实例状态必须为 OPEN [oracleoracledb ~]$ sqlplus / as sysdba SQL SELECT status FROM v$instance; # STATUS # ------------ # OPEN # 步骤3确认数据库名和服务名必须与 dbca 创建时一致 SQL SELECT name, db_unique_name FROM v$database; SQL SELECT value FROM v$parameter WHERE name service_names; # 步骤4从远程客户端连接用 Windows 上的 SQL Developer # 连接信息 # Host: 192.168.199.111 # Port: 1521 # Service Name: ORCLCDB # Username: system # Password: 你设置的密码关键参数表v$parameter中必须为预期值参数名预期值说明memory_target019c 默认用sga_target/pga_aggregate_target若为非零值需手动调整本文还有配套的精品资源点击获取