ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

Linux安装Oracle 19C:runInstaller前的系统环境准备与避坑

Linux安装Oracle 19C:runInstaller前的系统环境准备与避坑

简介:面向在 CentOS 7 与 Red Hat 7 上部署 Oracle 19C 的数据库初学者和运维人员,这份 docx 操作文档以命令实录方式梳理从系统检查到安装前配置的完整准备流程。全包仅有 1 个 docx 文件,大小约 2.99MB,篇幅紧凑,便于离线查阅和打印,适合作为实验环境搭建与安装前自查的随手手册。内容围绕内存、磁盘与 Swap 分区核验,防火墙、图形桌面与 SELinux 关闭,静态 IP 与 hosts 主机名初始化,dba、asmdba、oinstall 等用户组及 oracle 用户创建,以及 limits.conf、sshd_config、/etc/profile 环境变量等关键配置,逐项给出可复制命令与注释说明。已有 17399 人学习,步骤组织较受认可;读者可据此快速完成安装前系统准备,减少因内核参数、权限和网络配置不当造成的返工,并为后续图形化安装 Oracle 19C 打好基础。

1. Linux 装 Oracle 19C:真正的坑在 runInstaller 之前

Linux 安装 Oracle 19C 这件事,翻车点几乎都不在最后那个图形向导,而在前面半小时的准备。最典型的一次:虚拟机给了 2G 内存、Swap 只有 1G,runInstaller 跑到一半界面直接消失,日志里只留一行内存不足的提示,第二天重装才反应过来。19C 的 preinstall 包确实把大部分依赖和内核参数替你写好了,但它管不了网卡名、挂载选项和主机名解析,这几处才是真正让人来回折腾的地方。这套流程在 CentOS 7 和 RedHat 7.4 上都能跑通,适合手上有一台干净虚拟机、要落地一个单实例库做开发或迁移验证的人;也适合装过一次、被环境变量和监听坑过的熟手回头理顺序。

2. 系统环境核对:内存、Swap、防火墙和那块对不上号的网卡

装库之前先把机器的底子量清楚,这一步花十分钟,后面能省两小时。原文给的门槛是内存不小于 1G、可用硬盘不小于 8G、Swap 不小于 2G,这是能启动安装程序的绝对下限;实际跑图形化安装,我一般按 4G 内存、40G 磁盘、4G Swap 来给,图形界面本身就吃掉几百兆,建库时还要额外分配 SGA。CentOS 7 最小化安装默认磁盘布局经常把大部分空间分给 /home,/u01 反而没地方挂,装到一半提示空间不足是很常见的现场。

2.1 三条命令量出硬件底子

原文给的三条命令够用,但看输出的时候要知道看哪个字段。MemTotal 的单位是 kB,SwapTotal 也是 kB,df 出来的才是人类可读的 G。

# 物理内存,单位 kB,除以 1024 换算成 MB grep MemTotal /proc/meminfo # 磁盘占用,重点看 / 和 /u01 两个挂载点的 Avail 列 df -h # Swap 总量,同样是 kB grep SwapTotal /proc/meminfo

三条命令里最容易被忽略的是df -h的最后一列。如果 /u01 是单独挂载的,看一眼挂载选项里有没有noexec或nosuid——带 noexec 的分区上,root.sh 里的可执行文件跑不起来,报错信息还很难懂,会让人以为是权限问题查半天。另一种情况是 /u01 根本没单独分区,直接落在 / 上,那就要保证 / 至少有 20G 剩余。

Swap 不够的话不用重装系统,补一个 swap 文件就行,这是我在测试环境最常用的做法:

# 造一个 4G 的文件,bs=1M count=4096 就是 4G dd if=/dev/zero of=/swapfile bs=1M count=4096 # 权限必须是 600,否则 mkswap 会拒绝 chmod 600 /swapfile # 格式化成 swap 并启用 mkswap /swapfile swapon /swapfile # 写进 fstab,不然重启就没了 echo '/swapfile swap swap defaults 0 0' >> /etc/fstab # 确认生效 free -h

dd比fallocate稳,老内核上 fallocate 分配出来的文件可能不被 swap 认。count=4096配合bs=1M就是 4G,想给 8G 就把 count 改成 8192。swapon之后必须写 fstab,否则重启回到 1G,下次装库又是一样的错。

2.2 防火墙与 SELinux:先关,装完再按端口放开

装库阶段把 firewalld 停掉是最省事的做法,监听端口、X11 转发端口一堆,边装边放通效率太低。但生产环境不能一直关着,装完库要把 1521 单独放通,这个后面验证那章会说。

# 先看状态,active (running) 就是开着 systemctl status firewalld.service # 停掉当前运行的防火墙 systemctl stop firewalld.service # 禁止开机启动,否则重启又回来了 systemctl disable firewalld.service # 确认已经禁用,输出应该是 disabled systemctl is-enabled firewalld.service

stop和disable是两件事,只做stop重启就复燃,这是新手最常漏的一步。检查的时候用is-enabled而不是status,因为 status 里显示的是当前运行态。

SELinux 需要临时关和永久关配合,光改配置文件不重启是不生效的:

# 看当前状态,Enforcing 表示正在拦截 getenforce # 临时关掉,立即生效,重启后失效 setenforce 0 # 永久关闭,改配置文件,重启后生效 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 改完看一眼结果,应该输出 SELINUX=disabled grep SELINUX= /etc/selinux/config

原文用的是sed一行替换,注意这条命令只匹配SELINUX=enforcing,如果你的机器本来就是 permissive,替换不会生效也不报错,所以要grep复查一次。setenforce 0只能把状态切到 permissive,要真正 disabled 必须改配置文件并重启。permissive 模式下 SELinux 还会记录审计日志,只是不拦截,装库过程中大量 avc 日志会撑大 /var/log/audit,这也是我倾向直接 disabled 的原因。

图形桌面的取舍要看你的安装方式:

# 看当前默认启动目标 systemctl get-default # 切成命令行模式,省内存 systemctl set-default multi-user.target # 需要本地图形界面时再切回来 systemctl set-default graphical.target

原文里这条写的是「看环境是否需要,一般忽略」,这个判断是对的,但原因要讲清楚:runInstaller 必须有图形界面才能跑,你要么用本地图形桌面,要么用命令行模式加 DISPLAY 转发。后者更省资源,也是我更常用的方式,服务器不需要装 GNOME,装完还能保持命令行模式。切换之后要重启才生效,别切完直接敲 runInstaller 发现还是老样子。

2.3 静态 IP 与 /etc/hosts:网卡名、网关、主机名三处对齐

Oracle 的监听在注册服务时会拿主机名去解析,主机名解析不到 IP,监听能起来但客户端连不上,这是最隐蔽的一类问题。

# 先确认真实网卡名,CentOS 7 之后不再是 eth0 ip addr # 看配置文件列表,文件名后半段就是网卡名 ls /etc/sysconfig/network-scripts/

拿到网卡名之后再改配置,文件名和里面的 NAME、DEVICE 必须完全一致:

# /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" # 以太网类型,别写成 EtherNet 这种大小写混写 BOOTPROTO="static" # 从 dhcp 改成 static,忘了改这一行 IP 不会生效 NAME="ens33" # 网卡名,要和文件名后半段一致 DEVICE="ens33" # 同上,两处都要改 ONBOOT="yes" # 开机拉起网卡,最小化安装默认常常是 no IPADDR="192.168.199.111" # 固定 IP,网段要和你本机一致,否则工具连不上 GATEWAY="192.168.199.1" # 网关,写错就出不了公网,装依赖包会失败 NETMASK="255.255.255.0" # 子网掩码 DNS1="8.8.8.8" # DNS,内网环境换成自己的

IPADDR 这一段原文特别强调「199 这个网段最好和你自己的电脑网段一致」,这不是随口说的:用 Xshell 连不上、用 Xmanager 转发出不来图形,十有八九是虚机网卡配成了 NAT 之外的网段,宿主机路由不到。用vmware或virtualbox的 NAT 模式时,IP 段要落在虚拟网络编辑器给的范围内。

hosts 文件里那行映射是监听能不能被外部访问的关键:

# /etc/hosts 追加,IP 和上面的 IPADDR 必须一致 192.168.199.111 oracledb

主机名本身也要对上,CentOS 7 用 hostnamectl 改:

# 设置主机名,和 hosts 里写的名字保持一致 hostnamectl set-hostname oracledb # 重启网络让配置生效 systemctl restart network # 三重验证:网卡地址、主机名解析、当前主机名 ip addr show ens33 ping -c 2 oracledb hostname

systemctl restart network在 CentOS 7 上可用,service network restart也能跑,两者等价,但前者更符合 7 之后的管理习惯。ping 自己主机名这一步如果解析到的是 127.0.0.1 而不是 192.168.199.111,说明 hosts 里的顺序有问题,把 IP 那行放到 localhost 前面。

3. 用户与内核参数:oinstall、dba 两个组和 /u01 的 775

Oracle 的权限模型不算复杂,但组名一多就乱。简单记:oinstall 是清单组,管的是「这套软件归谁所有」;dba 是权限组,管的是「谁能用 sysdba 登录」。剩下那几个组是给 ASM、备份、Data Guard、RAC 预留的,单实例装库用不上,但建议一次建全,等以后要加 Grid 或者配备库时不用回头改。

3.1 八个组一个用户,uid 和 gid 按惯例来

# 安装程序属主组:oinstall 管清单,dba 管 sysdba 权限 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 # 建用户:-g 是主组 oinstall,-G 是附加组,dba 要放在第一位 /usr/sbin/useradd -u 54321 -g oinstall -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper oracle # 设密码,交互输入两次 passwd oracle # 确认结果,能看到 uid=54321 和完整的组列表就对了 id oracle

-u 54321和-g 5001这类数字是 Oracle 官方文档里的惯例值,不是强制要求,但保持一致有好处:以后从别的机器导过来的备份、脚本里的路径、跨机器的 NFS 挂载,遇到 uid 不一致会出各种奇怪的权限错误。-G后面的组顺序有意义,dba 必须排第一个,安装程序读的就是这个位置。

passwd oracle的时候如果提示BAD PASSWORD: The password is shorter than 8 characters,那是系统的密码复杂度策略在拦。测试环境可以换个长一点的密码绕过去,不建议直接改 PAM 配置,改完忘了恢复是另一笔账。

3.2 /u01 目录:OFA 结构与权限给错会卡在 root.sh

# 按 OFA 结构建目录,ORACLE_HOME 就是最后这层 mkdir -p /u01/app/oracle/product/19.2.0/db_1 # 属主给 oracle,属组给 oinstall,顺序是 用户:组 chown -R oracle:oinstall /u01 # 组内可写,方便后面打补丁和升级时同组用户操作 chmod -R 775 /u01

这三步的顺序不能反,先 mkdir 再 chown,否则 chown 找不到路径直接报错。775 和 755 的区别在组权限上,755 只有属主能写,打补丁时如果换了个 oinstall 组的用户操作就会被拒;775 让整个 oinstall 组可写,符合 Oracle 官方推荐的权限模型。

目录名里的19.2.0是个需要留意的地方。19C 的介质版本号有 19.3、19.4 一直到 19.20 多个补丁版本,解压出来的实际目录名常见的是19.0.0/dbhome_1这种形式。所以正确的顺序是:先解压,看解压出来的目录叫什么,再回头定 ORACLE_HOME 和环境变量,而不是先把环境变量写死再去解压。原文这里给的路径是按 19.2.0 写的,照抄之前先核对一下自己手上的包。

还有个容易翻车的点:/u01 如果是单独挂载的磁盘,chmod -R之前先确认挂载参数里没有noexec。带 noexec 的分区上,root.sh 里的二进制跑不起来,报错信息通常只说权限不足,让人误以为是 chown 没做对,来回查半小时。

3.3 limits.conf 与 /etc/profile:ulimit 要改两处

# /etc/security/limits.conf 末尾追加 oracle soft nproc 131072 oracle hard nproc 131072 oracle soft nofile 131072 oracle hard nofile 131072

soft 是软限制,用户可以自己往上调,直到 hard 为止;hard 是硬限制,只有 root 能改。两个值写成一样,是为了避免会话里 ulimit 一调就报错。nproc 管进程数,Oracle 的后台进程加上并行查询很容易突破默认的 4096;nofile 管打开的文件句柄,数据文件、日志文件、网络连接全算在里面。

limits.conf 有个坑:它不是对所有会话都生效。通过 sshd 登录的会话要 PAM 参与,systemd 拉起的服务根本不读这个文件。所以原文在 /etc/profile 里又兜了一层:

# /etc/profile 末尾追加,注意 if 和 fi 要配对 if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi

这段逻辑是:判断当前用户是不是 oracle,是的话再看 shell 是不是 ksh,ksh 用-p设置进程数,bash 用-u设置用户进程数,-n都是文件句柄。写成-u 16384 -n 65536是一条命令设两个值,少敲一次。注意这里给的 16384 比 limits.conf 里的 131072 小,实际生效的是两者中较小的那个——这是原文脚本的设计,先按小值跑,遇到不够再统一调大。

改完不要急着往下走,登录 oracle 用户验证一次:

# 切到 oracle 用户,注意 - 不能少 su - oracle # 看进程数和文件句柄的实际值 ulimit -u ulimit -n

su oracle和su - oracle差一个减号,差别是整个登录环境。不加减号,环境变量还是 root 的,后面 source .bash_profile 会出现变量叠加的怪现象,这是血泪经验。

3.4 sysctl.conf 与 sshd_config:内核参数和连接超时

# /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

kernel.sem四个值依次是 SEMMSL(每个信号集的信号量数)、SEMMNS(系统级信号量总数)、SEMOPM(每次 semop 调用允许的操作数)、SEMMNI(信号集个数)。这四个数偏小会在建库阶段报ORA-27154或信号量相关错误,属于典型的表现和原因对不上。fs.file-max是系统级句柄上限,要和 limits.conf 里的 nofile 配合看,系统级的天花板比用户级还低的话,用户怎么调都没用。rmem_*和wmem_*是网络读写缓冲区,跟 RMAN 备份传输、Data Guard 日志传输的速度有关,单机开发库影响不大,生产库建议按官方推荐值给。

sysctl -p的输出要逐行看,出现cannot stat /proc/sys/...说明参数名写错了,比如把net.core.rmem_default拼成net.core.rmem.defalut,这种拼写错误不会阻止其他行生效,很容易只看了最后一行就以为全好了。

# /etc/ssh/sshd_config 里把这两个注释打开,值改成 no GSSAPIAuthentication no UseDNS no # 改完重启 sshd,不会断开已有连接 systemctl restart sshd

GSSAPIAuthentication关掉省一次认证协商,登录快一点;UseDNS no更重要,默认 sshd 会反向解析客户端 IP,DNS 不通的时候每次登录卡十几秒,用 Xshell 反复连的时候体验极差。原文把这两条放在这里是对的,不需要额外解释太多,但要知道改的是 sshd_config 而不是 ssh_config,两个文件名字差一个字母,改错了不生效。

4. 依赖包与图形化安装:preinstall、DISPLAY、runInstaller 到 netca

到这一步机器已经准备好了,剩下的就是装包、配环境变量、跑安装程序。原文把 CentOS 和 RedHat 分成两条路走,这个分法是对的:CentOS 7 有 preinstall 包可以直接吃掉大部分依赖,RedHat 7.4 上一般要手工补,两条路的细节不一样,混着来容易漏包。

4.1 两个 rpm 先下去,90% 的依赖就齐了

# 先把两个 rpm 上传到 /u01 <p> <a href="https://download.csdn.net/download/changxiaowei1990/12222634" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>
RELATED READING

延伸阅读

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