
简介面向在 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 只有 1GrunInstaller 跑到一半界面直接消失日志里只留一行内存不足的提示第二天重装才反应过来。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 的单位是 kBSwapTotal 也是 kBdf 出来的才是人类可读的 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 的文件bs1M count4096 就是 4G dd if/dev/zero of/swapfile bs1M count4096 # 权限必须是 600否则 mkswap 会拒绝 chmod 600 /swapfile # 格式化成 swap 并启用 mkswap /swapfile swapon /swapfile # 写进 fstab不然重启就没了 echo /swapfile swap swap defaults 0 0 /etc/fstab # 确认生效 free -hdd比fallocate稳老内核上 fallocate 分配出来的文件可能不被 swap 认。count4096配合bs1M就是 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.servicestop和disable是两件事只做stop重启就复燃这是新手最常漏的一步。检查的时候用is-enabled而不是status因为 status 里显示的是当前运行态。SELinux 需要临时关和永久关配合光改配置文件不重启是不生效的# 看当前状态Enforcing 表示正在拦截 getenforce # 临时关掉立即生效重启后失效 setenforce 0 # 永久关闭改配置文件重启后生效 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config # 改完看一眼结果应该输出 SELINUXdisabled grep SELINUX /etc/selinux/config原文用的是sed一行替换注意这条命令只匹配SELINUXenforcing如果你的机器本来就是 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 TYPEEthernet # 以太网类型别写成 EtherNet 这种大小写混写 BOOTPROTOstatic # 从 dhcp 改成 static忘了改这一行 IP 不会生效 NAMEens33 # 网卡名要和文件名后半段一致 DEVICEens33 # 同上两处都要改 ONBOOTyes # 开机拉起网卡最小化安装默认常常是 no IPADDR192.168.199.111 # 固定 IP网段要和你本机一致否则工具连不上 GATEWAY192.168.199.1 # 网关写错就出不了公网装依赖包会失败 NETMASK255.255.255.0 # 子网掩码 DNS18.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 hostnamesystemctl restart network在 CentOS 7 上可用service network restart也能跑两者等价但前者更符合 7 之后的管理习惯。ping 自己主机名这一步如果解析到的是 127.0.0.1 而不是 192.168.199.111说明 hosts 里的顺序有问题把 IP 那行放到 localhost 前面。3. 用户与内核参数oinstall、dba 两个组和 /u01 的 775Oracle 的权限模型不算复杂但组名一多就乱。简单记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 # 确认结果能看到 uid54321 和完整的组列表就对了 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/profileulimit 要改两处# /etc/security/limits.conf 末尾追加 oracle soft nproc 131072 oracle hard nproc 131072 oracle soft nofile 131072 oracle hard nofile 131072soft 是软限制用户可以自己往上调直到 hard 为止hard 是硬限制只有 root 能改。两个值写成一样是为了避免会话里 ulimit 一调就报错。nproc 管进程数Oracle 的后台进程加上并行查询很容易突破默认的 4096nofile 管打开的文件句柄数据文件、日志文件、网络连接全算在里面。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 是不是 kshksh 用-p设置进程数bash 用-u设置用户进程数-n都是文件句柄。写成-u 16384 -n 65536是一条命令设两个值少敲一次。注意这里给的 16384 比 limits.conf 里的 131072 小实际生效的是两者中较小的那个——这是原文脚本的设计先按小值跑遇到不够再统一调大。改完不要急着往下走登录 oracle 用户验证一次# 切到 oracle 用户注意 - 不能少 su - oracle # 看进程数和文件句柄的实际值 ulimit -u ulimit -nsu 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 -pkernel.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 sshdGSSAPIAuthentication关掉省一次认证协商登录快一点UseDNS no更重要默认 sshd 会反向解析客户端 IPDNS 不通的时候每次登录卡十几秒用 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 hrefhttps://download.csdn.net/download/changxiaowei1990/12222634 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p