ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Oracle 19C在Linux上的安装前置与避坑指南

Oracle 19C在Linux上的安装前置与避坑指南

简介:这份资源面向需要在 CentOS 7 或 Red Hat 7 上部署 Oracle 19C 的数据库运维人员与初学者,提供从系统检查到安装收尾的完整操作指引。内容围绕物理内存、硬盘与 Swap 分区的前置核查,防火墙、图形桌面与 selinux 的关闭处理,静态 IP 与主机名配置,以及 dba、asmdba、oinstall 等用户组的创建和 oracle 用户环境变量、limits.conf、sshd_config 的调整展开,步骤与命令对应清晰,便于对照执行。资源包共 1 个 docx 文档,约 2.99MB,以图文步骤形式组织,适合作为安装过程中的操作手册与排错参考。目前已有 17392 人学习下载,说明其在同类安装场景中具有较高的参考价值,可帮助读者减少环境准备阶段的反复试错,快速完成 Oracle 19C 的基础部署。

1. 一次装库翻车,让我重新审视 Oracle 19C 的安装前置

上周帮同事收拾一台 CentOS 7 的测试机,装 Oracle 19C 装到一半卡在 runInstaller 起不来,图形界面连不上,日志里全是 X11 转发失败。翻回去看,问题根本不在安装器本身,而是前面 SELinux 没关干净、limits.conf 只改了 oracle 用户没改 hard 值、/u01 权限被 root 占着。这类“装到一半才发现前置没做对”的场景,在 Linux 上部署 Oracle 19C 时太常见了。这份安装步骤资源把系统要求、防火墙与 SELinux、静态 IP、用户组、内核参数、RPM 依赖、图形化安装到建库监听串成一条线,适合第一次在 CentOS 7 / Red Hat 7 上落地 19C 的 DBA 和运维,也适合已经装过 11g、想迁移到 19C 但被新依赖卡住的人。下面我按自己复现的顺序拆一遍,重点讲参数为什么这么设、哪一步最容易翻车。

2. 系统前置与内核参数:装之前先把地基打平

Oracle 19C 对 Linux 的硬性门槛不算高,但“够用”和“能装”是两回事。资源里给的三条检查——内存不小于 1G、可用硬盘不小于 8G、Swap 不小于 2G——是下限,实际跑起来我一般按内存 4G 起、/u01 单独挂 30G 以上来准备,因为 19C 的软件包解压后加上数据库文件、归档日志,8G 很容易在装实例阶段就撑爆。先把这三项确认掉,后面所有操作才有意义。

2.1 内存、磁盘与 Swap 的实测口径

资源里的查看命令很直接,但要注意单位换算和“可用”二字的区别。grep MemTotal /proc/meminfo出来的是 kB,除以 1024 才是 MB;df默认按 1K 块显示,看 /u01 所在分区时加-h更直观;Swap 用grep SwapTotal /proc/meminfo确认,如果为 0,得先补 swap 文件,否则安装器在链接阶段可能直接报内存不足。

# 查看物理内存(kB),除以 1024 得到 MB grep MemTotal /proc/meminfo # 查看磁盘使用,重点看 /u01 挂载点所在分区 df -h /u01 # 查看 Swap 总量,为 0 时需要补 grep SwapTotal /proc/meminfo # 若 Swap 不足,用文件补 2G(示例) dd if=/dev/zero of=/swapfile bs=1M count=2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile

这几条命令的逻辑是先确认资源底数,再决定要不要补。dd那条只在 Swap 为 0 或明显低于 2G 时执行,count=2048就是 2G,按需调整;swapon之后记得写进/etc/fstab,否则重启就丢。我见过有人只swapon没持久化,装完重启数据库起不来,回头查半天以为是实例坏了。

2.2 防火墙、SELinux 与图形桌面的取舍

资源里关 firewalld 用的是systemctl stop加disable,两步都要做,只 stop 不 disable,重启后防火墙又起来,监听端口被挡,客户端连不上还以为监听没配好。SELinux 用sed把SELINUX=enforcing改成disabled,这是永久关闭,改完必须重启才生效;临时关闭用setenforce 0,只对当前会话有效,适合先验证再决定。图形桌面那条资源里写了两条set-default,一条切图形、一条切命令行,实际装库时如果走静默安装可以切到multi-user.target,但走runInstaller图形安装就必须保留图形环境,别一刀切。

# 查看并关闭 firewalld,disable 保证重启不复活 systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service # 临时关闭 SELinux,验证用 setenforce 0 # 永久关闭,改完需重启 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 确认当前运行级别,图形安装时不要切到 multi-user systemctl get-default

这里的关键判断是“装库方式决定桌面去留”。getenforce返回 Enforcing 说明还没关掉,返回 Permissive 是临时生效,Disabled 才是永久生效。资源里那句“关闭图形桌面看环境是否需要”是对的,但没展开——图形化安装依赖 X11,切到命令行模式后runInstaller会直接报无法初始化图形界面,这是新手最容易踩的坑之一。

2.3 静态 IP、hosts 与用户组的一次性配齐

静态 IP 改的是/etc/sysconfig/network-scripts/ifcfg-ens33,文件名里的 ens33 要跟ip addr看到的网卡名一致,不一致就改文件名或改配置里的 NAME/DEVICE。BOOTPROTO="static"是手动分配,ONBOOT="yes"保证开机启用,IPADDR、GATEWAY、NETMASK 按实际网段填,DNS1 资源里用了 8.8.8.8,内网环境建议换成自己的 DNS,否则解析外网域名会绕远。改完service network restart生效,然后往/etc/hosts里补一行IP 主机名,主机名要和hostname输出一致,否则监听配置阶段会报主机名解析失败。

# 编辑网卡配置,文件名以实际网卡为准 vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 关键项:static、开机启用、固定 IP、网关、掩码、DNS # BOOTPROTO="static" # ONBOOT="yes" # IPADDR="192.168.199.111" # GATEWAY="192.168.199.1" # NETMASK="255.255.255.0" # DNS1="8.8.8.8" # 重启网络并确认 service network restart ip addr show ens33 # 主机名解析,IP 与 hostname 保持一致 vi /etc/hosts # 192.168.199.111 oracledb

用户组这块资源列了 dba、asmdba、backupdba、dgdba、kmdba、racdba、oper、oinstall 八个组,GID 从 5001 到 5008,oracle 用户 UID 54321,主组 oinstall,附加组把其余七个都带上。这套 GID/UID 是 Oracle 官方 preinstall 包的惯例值,照着填能避免后面 RPM 安装时权限对不上。/u01目录建好后chown -R oracle:oinstall /u01加chmod -R 775,这两步别省,否则 oracle 用户解压安装包时写不进去,报错信息还很隐晦。

# 建组,GID 按惯例值 groupadd -g 5001 dba groupadd -g 5002 asmdba groupadd -g 5003 backupdba groupadd -g 5004 dgdba groupadd -g 5005 kmdba groupadd -g 5006 racdba groupadd -g 5007 oper groupadd -g 5008 oinstall # 建 oracle 用户,主组 oinstall,附加组带齐 /usr/sbin/useradd -u 54321 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper oracle passwd oracle # 建 ORACLE_HOME 目录并授权 mkdir -p /u01/app/oracle/product/19.2.0/db_1 chown -R oracle:oinstall /u01 chmod -R 775 /u01

-G后面那串组名一个都不能少,尤其是 asmdba 和 oper,后面建监听、启停实例都会用到。chmod -R 775给的是组内可写,配合 oinstall 组,后续 root.sh 执行时权限才顺。

3. 内核参数与 RPM 依赖:19C 装不装得上,八成看这一步

前置做完,真正决定安装器能不能跑起来的是 limits、sysctl 和 RPM 依赖。资源里 limits.conf 只写了 oracle 用户的 nproc 和 nofile 各 131072,sysctl.conf 写了 kernel.sem、fs.file-max 和四个网络缓冲参数,这些值不是拍脑袋,是 19C 在中等负载下的推荐下限。RPM 依赖分 CentOS 7 和 Red Hat 7 两条线,CentOS 用 preinstall 包一把梭,Red Hat 要手动补一串包,这是两条线最大的差别。

3.1 limits.conf 与 sysctl.conf 的参数含义

/etc/security/limits.conf里oracle soft nproc 131072和hard nproc 131072控制进程数,nofile控制打开文件数,soft 是警告阈值,hard 是硬上限,两个都设成一样是为了避免 soft 到了 hard 不够用。资源里只写了 oracle 用户,实际我一般再加一行oracle soft stack 10240,栈大小在某些链接场景会用到。/etc/ssh/sshd_config里把GSSAPIAuthentication改成 no、UseDNS改成 no,是为了 SSH 连接时不反向解析,装库期间频繁登录会快很多,不改也不影响安装,但会拖慢操作节奏。

# limits.conf 追加,soft/hard 对齐 vi /etc/security/limits.conf # oracle soft nproc 131072 # oracle hard nproc 131072 # oracle soft nofile 131072 # oracle hard nofile 131072 # sshd_config 关掉反向解析 vi /etc/ssh/sshd_config # GSSAPIAuthentication no # UseDNS no # /etc/profile 里给 oracle 用户加 ulimit vi /etc/profile # if [ $USER = "oracle" ]; then # if [ $SHELL = "/bin/ksh" ]; then # ulimit -p 16384 # ulimit -n 65536 # else # ulimit -u 16384 -n 65536 # fi # fi

/etc/profile那段是给登录 shell 设 ulimit,和 limits.conf 是两道保险,PAM 没生效时靠它兜底。改完source /etc/profile或用 oracle 重新登录验证ulimit -n是否到 65536。

sysctl.conf 里kernel.sem = 250 32000 100 128四个值分别是信号量集合数、系统级信号量数、每个 semop 调用数、信号量最大值,19C 的并行查询和后台进程会用到;fs.file-max = 6815744是系统级文件句柄上限;net.core.rmem_default/max和wmem_default/max是网络收发缓冲,监听和客户端通信靠它。改完必须sysctl -p让配置生效,不执行等于没改。

# sysctl.conf 追加内核参数 vi /etc/sysctl.conf # kernel.sem = 250 32000 100 128 # fs.file-max = 6815744 # net.core.rmem_default = 262144 # net.core.rmem_max = 4194304 # net.core.wmem_default = 262144 # net.core.wmem_max = 1048576 # 生效并抽查 sysctl -p sysctl kernel.sem

sysctl -p输出里如果某行报 “cannot stat”,说明那行写错了或者文件路径不对,逐行核对。sysctl kernel.sem回读确认值真的进去了,别只看命令没报错就以为成了。

3.2 CentOS 7 用 preinstall 包,Red Hat 7 手动补依赖

CentOS 7 这条线最省事:把oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm和oracle-database-ee-19c-1.0-1.x86_64.rpm传到/u01/下,先yum localinstallpreinstall 包,它会自动把 bc、binutils、compat-libcap1、libaio、libaio-devel、gcc、glibc-devel、ksh、make、sysstat、unixODBC 这些依赖拉齐,再装 ee 包。装完用rpm -q逐个核对,缺的补上。

# 进入存放目录,先装 preinstall 再装 ee cd /u01/ yum localinstall -y oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm yum localinstall -y oracle-database-ee-19c-1.0-1.x86_64.rpm # 核对依赖是否齐全,缺的会列出来 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

yum localinstall和rpm -ivh的区别在于前者会尝试从已配置的源补依赖,后者只装本地包、缺依赖直接报错。preinstall 包的价值就是把官方要求的那串依赖一次性解决,省得一个个rpm -ivh试错。rpm -q那条命令把资源里列的包名全带上,输出里出现 “not installed” 的就是缺口。

Red Hat 7 这条线没有 preinstall 包可用,得手动补。资源里给了一串rpm -ivh,包括 kernel-headers、glibc-headers、glibc-devel、libmpc、cpp、gcc、ksh、compat-libcap1、libaio-devel、libstdc++-devel、gcc-c++,还有两条rpm -Uvh把 kmod 和 kmod-libs 从低版本升上去。-ivh是安装,-Uvh是升级,低版本已存在时用-Uvh,否则-ivh会报冲突。

# Red Hat 7 手动补依赖,按依赖顺序装 rpm -ivh kernel-headers-4.9.86-30.el7.x86_64.rpm rpm -ivh glibc-headers-2.17-196.el7.x86_64.rpm rpm -ivh glibc-devel-2.17-196.el7.x86_64.rpm rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm rpm -ivh cpp-4.8.5-16.el7.x86_64.rpm rpm -ivh gcc-4.8.5-16.el7.x86_64.rpm rpm -ivh ksh-20120801-139.el7.x86_64.rpm rpm -ivh compat-libcap1-1.10-7.el7.x86_64.rpm rpm -ivh libaio-devel-0.3.109-13.el7.x86_64.rpm rpm -ivh libstdc++-devel-4.8.5-16.el7.x86_64.rpm rpm -ivh gcc-c++-4.8.5-16.el7.x86_64.rpm # 低版本升级用 -Uvh rpm -Uvh kmod-20-25.el7.x86_64.rpm rpm -Uvh kmod-libs-20-25.el7.x86_64.rpm

顺序上先 headers 再 devel 再编译器,因为 devel 包依赖 headers。-Uvh那两条如果当前版本已经不低于目标版本,会提示 “package already installed”,可以跳过。资源里还附了一段 Red Hat 换 CentOS yum 源的操作,用rpm -e --nodeps卸自带 yum 再装 CentOS 的 yum 包,这段属于环境改造,不是 19C 安装必需,除非 Red Hat 的源不可用、又必须用 yum 补依赖,否则不建议动,卸错 yum 会把系统包管理搞坏。

4. 图形化安装与建库:runInstaller 到 netca 的实操链路

依赖齐了,切到 oracle 用户配环境变量,再走图形化安装。资源里.bash_profile的六行是标准配置:ORACLE_BASE 指到/u01/app/oracle,ORACLE_HOME 拼到product/19.2.0/db_1,ORACLE_SID 设成 orcl,PATH 把$ORACLE_HOME/bin放前面,LD_LIBRARY_PATH 指库目录,LANG 和 NLS_LANG 设成AMERICAN_AMERICA.AL32UTF8。字符集这条尤其重要,装完再改字符集代价很大,建库前定好。

4.1 环境变量与安装包解压

# 切到 oracle 用户 su - oracle # 编辑 .bash_profile,写入六项 vi ~/.bash_profile # export ORACLE_BASE=/u01/app/oracle # export ORACLE_HOME=$ORACLE_BASE/product/19.2.0/db_1 # export ORACLE_SID=orcl # export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH # export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib # export LANG=C # export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 # 生效并验证 source ~/.bash_profile echo $ORACLE_HOME # 解压安装包到 ORACLE_HOME cd /u01/app/oracle/product/19.2.0/db_1 unzip V982063-01.zip

source之后echo $ORACLE_HOME要能打出完整路径,打不出来说明.bash_profile没写对或者没在 oracle 用户下执行。解压出来的目录一般是database/,runInstaller就在里面。安装包用 FTP 传到/u01/下再解压,别传到 root 家目录,权限会乱。

4.2 DISPLAY 转发与 runInstaller 启动

图形化安装靠 X11 转发,资源里export DISPLAY=192.168.199.129:0.0里的 IP 是本地装了 Xmanager 那台机器的地址,不是 Oracle 服务器自己的 IP,这点容易搞混。设完env|grep DIS确认,再xhost +在本地机器上放行,出现access control disabled就说明通了。然后进database/执行./runInstaller。

# 设置 DISPLAY 指向本地图形终端 export DISPLAY=192.168.199.129:0.0 env | grep DIS # 本地终端放行(在装 Xmanager 的机器上执行) xhost + # 启动安装器 cd /u01/app/oracle/product/19.2.0/db_1/database ./runInstaller

DISPLAY格式是IP:屏号.显示号,0.0是默认屏。xhost +是放开访问控制,装完建议xhost -收回。runInstaller起来后只选“仅安装软件”,实例后面单独建,这样软件层和实例层分开,出问题好定位。装到尾声会提示用 root 执行root.sh,路径在$ORACLE_HOME下,复制过去执行,输出里看到 “Finished running generic part of root script” 才算完。

4.3 netca 建监听与 dbca 建实例

软件装完,oracle 用户执行netca起监听配置向导,一路 Next 选默认监听端口 1521,完成后lsnrctl status能看到监听已起。建实例用dbca,选“创建数据库”,SID 填 orcl,字符集选 AL32UTF8,内存按机器实际给,别照搬模板。建完sqlplus / as sysdba能进,select status from v$instance;返回 OPEN 就说明实例正常。

# 配置监听 netca # 确认监听状态 lsnrctl status # 创建数据库实例 dbca # 验证实例 sqlplus / as sysdba # SQL> select status from v$instance;

netca和dbca都是图形向导,参数在界面里填,命令行只负责拉起。lsnrctl status里要看 “Listening Endpoints Summary” 有没有 1521 那行,没有就是监听没配成。v$instance状态 OPEN 是最终验收标准,MOUNTED 或 STARTED 都说明实例没完全起来。

5. 避坑排查:装 19C 最容易翻车的五个点

5.1 runInstaller 报无法初始化图形界面

现象:执行./runInstaller后终端报 “Can't connect to X11 window server”,或者界面一闪就退。原因通常是 DISPLAY 没设、设错 IP,或者本地xhost没放行,也可能是系统被切到了multi-user.target没有图形环境。解决:先env|grep DIS确认变量在,再在本地机器xhost +,然后systemctl get-default看是不是 graphical,不是就切回去或改用静默安装响应文件。

5.2 root.sh 执行报权限或路径错误

现象:安装尾声提示执行root.sh,执行后报 “ORACLE_HOME not set” 或某些目录不可写。原因是 root 用户环境里没有 oracle 的变量,且/u01权限没给对。解决:用绝对路径执行$ORACLE_HOME/root.sh,执行前确认chown -R oracle:oinstall /u01和chmod -R 775 /u01已做,root.sh 内部会调 oraInst.loc,路径不对就手工核对/etc/oraInst.loc里的 inventory 指向。

5.3 监听起来了但客户端连不上

现象:服务器上lsnrctl status正常,客户端tnsping不通或报 ORA-12541。原因是 firewalld 没关干净或没 disable,重启后复活挡了 1521;也可能是/etc/hosts里主机名和 IP 对不上,监听绑到了错误地址。解决:systemctl status firewalld确认是 inactive 且 disabled,cat /etc/hosts核对主机名解析,必要时在listener.ora里显式绑 IP。

5.4 安装到链接阶段报内存或信号量不足

现象:runInstaller 走到 80% 左右报 “ORA-27102 out of memory” 或信号量相关错误。原因是 Swap 不足、kernel.sem没生效或 limits 没对 oracle 用户生效。解决:free -m看 Swap,sysctl kernel.sem回读确认,su - oracle后ulimit -u和ulimit -n看是否到 131072,没到就检查/etc/security/limits.conf和/etc/profile是否都改对。

5.5 建库时字符集选错想改

现象:dbca 建完发现字符集不是 AL32UTF8,应用写入中文乱码。原因是建库时没注意字符集选项,或者 NLS_LANG 和库字符集不一致。解决:19C 改库字符集要走ALTER DATABASE CHARACTER SET且限制多,代价大,最稳的是删库重建,建库前把NLS_LANG=AMERICAN_AMERICA.AL32UTF8和 dbca 里的字符集选项对齐,这一步没有后悔药,建之前多看一眼。

6. 装完之后的验收清单与一个习惯

装完不等于能用,我一般按一张验收表过一遍再交付。下面这张表是我自己复现时用的,列的是检查项、命令和通过标准,照着跑一遍能挡掉大部分“装完了但连不上”的问题。

检查项命令通过标准
实例状态sqlplus / as sysdba后select status from v$instance;返回 OPEN
监听状态lsnrctl status有 1521 端点,服务已注册
字符集select value from nls_database_parameters where parameter='NLS_CHARACTERSET';AL32UTF8
防火墙systemctl status firewalldinactive 且 disabled
SELinuxgetenforceDisabled
内核参数sysctl kernel.sem250 32000 100 128
文件句柄su - oracle后ulimit -n131072

这张表里最容易漏的是字符集和文件句柄两项,前者建库时定死,后者登录 shell 才生效,root 下看是默认值。验收完再跑一条select name, open_mode from v$database;确认库是 READ WRITE,然后拿客户端实际连一次,别只信服务器本地的sqlplus。

有个习惯我从那次翻车之后一直保留:每次装库前先把getenforce、systemctl get-default、df -h /u01、grep SwapTotal /proc/meminfo四条命令跑一遍,把输出贴到安装记录里,装完再跑一遍对比。看着像多此一举,但真出问题时,这两份快照能省掉大量“到底是装之前就这样还是装坏的”扯皮。这份步骤资源把该做的动作都列全了,剩下的是执行时别跳步、别想当然,尤其是 SELinux 和 limits 这种改完要重启或重新登录才生效的,跳一步后面就得返工。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进