☰
CentOS 7 安装 Oracle 19C:内核参数、权限模型与安装路线
2026/11/4 12:17:56 网站建设 项目流程

简介:面向数据库运维人员与 Oracle 初学者的 Linux 平台安装实操文档,围绕 CentOS 7 与 Red Hat 7 环境,系统梳理 Oracle 19C 从环境检查到安装前配置的关键流程。内容覆盖内存、磁盘与 Swap 分区核对,防火墙、图形桌面及 SELinux 关闭,静态 IP 与主机名初始化,dba、asmdba、oinstall 等用户组和 oracle 用户创建,以及 limits.conf、sshd_config、/etc/profile 环境变量等调整,命令与配置片段可直接对照执行。压缩包共 1 个 docx 文件,约 2.99MB,便于离线查阅和整理成操作清单。已有 17399 人学习,适合需要快速搭建 Oracle 19C 实验环境、复核安装前置条件或排查配置遗漏的读者,也可作为企业内数据库部署的步骤参考。

1. 一台 1G 内存的虚拟机能不能装 Oracle 19C

一台 1G 内存、8G 硬盘的 CentOS 7 虚拟机能不能把 Oracle 19C 装上?能装,但装完基本没法跑业务——这是某实验室测试机上踩过的第一个坑,也是很多人搜 Linux 安装 Oracle 19C 时最容易跳过的一行前置条件。19C 的安装不是一条 make install,而是把内核参数、用户权限模型、RPM 依赖、图形安装器、监听与实例这五层按顺序铺好,任何一层顺序错了都得回滚重来。下面按实操顺序走:预检、用户与目录、两条安装路线、五个高频翻车点、建库之后的验收。适合第一次在 CentOS 7 或 RHEL 7 上装 19C 的人照抄,也适合从 11g 迁过来的人对一遍参数。

2. 装机前的系统体检:内存、Swap、内核参数一次配到位

装 19C 最浪费时间的一种情况是:安装器跑到 60% 报内存不足,或者库建完起不来报 ORA-00845,然后回头改参数、重装。这类问题在开机前十分钟就能全部排掉,代价只是几条命令。这一章把系统层面的活干完,后面就不会来回折腾。

2.1 三条命令先摸清底子

原文给的三条检查命令是对的,但颗粒度太粗,实际动手我一般会一次跑全:

# 物理内存总量,单位 kB,1G 约等于 1000000 grep MemTotal /proc/meminfo # Swap 总量,单位 kB grep SwapTotal /proc/meminfo # 各挂载点剩余空间,重点看 / 和 /u01 df -h # 发行版、内核、CPU 核数,决定后面装哪个 preinstall 包 cat /etc/redhat-release uname -r nproc

这几个输出要连起来看,不能只看单项。MemTotal 的单位是 kB,1048576 才是 1G;df -h要看的是/u01所在分区而不是根分区,因为 Oracle 的软件、数据文件、归档日志都会往 ORACLE_BASE 底下堆,根分区只剩 8G 时,装完软件就没地方放数据文件了。nproc决定 SGA 和并行度的合理上限,1~2 核的机器上把 SGA 开到 4G 只会换来频繁换页。

官方的门槛和实际能用的门槛差得很远,下面这张表是我一般会对照的:

项目官方最低实际建议检查命令
物理内存1G4G 起,图形安装建议 8Ggrep MemTotal /proc/meminfo
Swap2G内存的 1~1.5 倍,且不小于 2Ggrep SwapTotal /proc/meminfo
/u01可用空间8G软件 12G + 数据文件按业务估df -h /u01
临时目录/tmp1G4G 以上df -h /tmp

Swap 不够的时候现场补一个文件就行,不必重装系统:

# 用 dd 而不是 fallocate,部分文件系统上 fallocate 出来的块 # 会带 holes,mkswap 能过但 swapon 会失败 dd if=/dev/zero of=/swapfile bs=1M count=4096 chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写进 fstab,重启后还在 echo '/swapfile none swap sw 0 0' >> /etc/fstab free -m

count=4096是块数,bs=1M是单块大小,合起来就是 4G;要 2G 就把 count 改成 2048。swapon之后必须用free -m确认 Swap 那一行的 total 变了,只看mkswap成功不算数。这一步最容易翻车的是 fstab 写错一行,机器重启直接进不了系统,所以追加完最好mount -a先验证一遍。

2.2 sysctl.conf 与 limits.conf 到底在管什么

这两个文件是安装失败率最高的地方。sysctl 管的是内核给进程的资源上限(共享内存段、信号量、文件句柄总数、端口范围),limits 管的是单个用户会话能拿到的资源。前者不改,建库时 SGA 申请不到共享内存;后者不改,安装器弹出来的 shell 会报 "maximum number of open files exceeded"。

原文只给了 5 个 sysctl 参数,能装起来,但有些场景会不够。我一般按下面这组配,多出来的几个是后面建库和跑业务时才暴露问题的地方:

# /etc/sysctl.conf # 单个共享内存段最大值,设为物理内存的一半到全量,单位字节 kernel.shmmax = 4398046511104 # 共享内存总页数,shmmax/PAGE_SIZE 向上取整,宁大勿小 kernel.shmall = 1073741824 # 共享内存段数量上限 kernel.shmmni = 4096 # 信号量:每组的信号量数、系统级总数、单次操作数、信号量组数 kernel.sem = 250 32000 100 128 # 异步 IO 请求上限,数据文件并发读写要靠它 fs.aio-max-nr = 1048576 # 系统级文件句柄上限 fs.file-max = 6815744 # 本地端口范围,监听和客户端连接都会用到 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 # 尽量不使用 swap,避免库进程被换出 vm.swappiness = 10

kernel.sem那四个数字对应 SEMMSL、SEMMNS、SEMOPM、SEMMNI,单位不是字节而是个数,改小了建库阶段就会报 ORA-27154。shmmax写成 4398046511104 等于 4T,看着夸张,实际含义是"不设上限",内核会按实际物理内存分配。改完不要急着sysctl -p,先把 limits 一起改完再统一生效。

limits 配置有个隐蔽的覆盖关系:/etc/security/limits.d/20-nproc.conf会在limits.conf之后加载,里面通常写着* soft nproc 4096,会把 oracle 用户单独设的值盖掉。所以要么在 20-nproc.conf 里追加,要么把 oracle 的配置写进一个编号更大的 drop-in 文件:

# /etc/security/limits.conf oracle soft nproc 131072 oracle hard nproc 131072 oracle soft nofile 131072 oracle hard nofile 131072 oracle soft stack 10240 oracle soft memlock 134217728 oracle hard memlock 134217728

nproc是进程数,nofile是文件句柄数,这两个必须 soft/hard 成对写,只写 soft 时ulimit -Hn还是老值。memlock是锁住内存不许换出,用大页或者 MEMORY_TARGET 时必须给足,单位是 kB,134217728 约等于 128G,按实际内存砍到一半也可以。这里还有一个坑:CentOS 7 的 sshd 走 PAM,才会读 limits.conf,如果 sshd_config 里把UsePAM关了,配了也白配。

2.3 生效、验证,以及那几个"看起来无关"的开关

改完配置文件后统一生效,并且一定要切到 oracle 用户下验证,root 的 ulimit 跟 oracle 的完全不是一回事:

# 内核参数立即生效 sysctl -p # 抽查两个关键值 sysctl kernel.sem kernel.shmmax # 切到 oracle 用户再验证,注意是 su - 带减号 su - oracle ulimit -a ulimit -n ulimit -u

sysctl -p的报错要逐行看,出现 "cannot stat /proc/sys/..." 通常是参数名拼错或者内核版本不支持,这种条目会被静默跳过,最后表现为"我明明配了却没生效"。su - oracle里的减号不能省,su oracle不加载登录环境,ulimit 读的还是上一个会话的值,这是很多人验证时误判"配置没生效"的原因。

SELinux 和 firewalld 的处理要区分测试机和生产机。测试机图省事可以关掉,生产机上我一般只放行端口,不到万不得已不动 SELinux:

# 临时关闭,重启失效 getenforce setenforce 0 # 永久关闭,需要重启才彻底生效 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config grep '^SELINUX=' /etc/selinux/config

setenforce 0之后getenforce显示的是 Permissive,这只是临时状态,改文件才是永久的,而且必须重启。生产机上如果只是装数据库,用 firewalld 放行 1521 更省事:

firewall-cmd --permanent --add-port=1521/tcp firewall-cmd --reload firewall-cmd --list-ports

注意:setenforce 0后再setenforce 1不一定会回到 enforcing,如果文件里已经改成 disabled,必须重启才能彻底关闭,也只会在重启后才真正放开文件上下文检查。

2.4 静态 IP 与 hosts,别让安装器卡在网络解析上

Oracle 的监听和实例启动时会反查自己的主机名,如果 hosts 里没有对应条目、或者主机名对应的 IP 和网卡上配的不一致,监听起来会先卡几十秒再做 DNS 查询,图形安装器也可能在校验阶段报 "hostname resolution failed"。所以静态 IP 和 hosts 要在装软件之前定死,别指望装完再改。

# /etc/sysconfig/network-scripts/ifcfg-ens33 # 网卡文件名要根据实际名称改,ens33/ens192 都常见 TYPE="Ethernet" BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.199.111" GATEWAY="192.168.199.1" NETMASK="255.255.255.0" DNS1="192.168.199.1"

BOOTPROTO从 dhcp 改成 static,ONBOOT=yes保证开机起来。IP 段要跟本机所在的网络一致,否则用 Xshell 这类工具连不上,很多"连不上虚拟机"的问题都不是 Oracle 的锅,是网段选错了。网关和 DNS 填实际环境里能用的地址,DNS 填公共地址或者内网 DNS 都行,前提是这台机器能解析到自己的主机名。

# /etc/hosts # 主机名和 IP 必须对应网卡上真实的地址 192.168.199.111 oracledb 127.0.0.1 localhost localhost.localdomain

改完重启网络并验证:

systemctl restart network ip addr show ens33 ping -c 2 oracledb hostname

ping oracledb能通说明 hosts 生效了,返回的应该是 192.168.199.111 而不是 127.0.0.1。如果返回127.0.1.1之类的地址,多半是 hosts 文件里主机名被绑到了别的行上。这一步做扎实,后面 netca 建监听、dbca 建库时注册服务就不会莫名其妙地慢。

3. 用户、组与目录:oinstall/dba 权限模型和 /u01 规划

Oracle 的权限模型不是"建个用户就完事",它靠一组职责不同的组来区分谁能装、谁能启停、谁能做 ASM 和备份。组名和 GID 一旦定下来,后面换版本、打补丁、装第二套库都沿用这一套,所以第一次就要按规范来。这一章把用户、组、目录、环境变量一次性定死。

3.1 先建组再建用户:GID 与组成员关系

原文列了 8 个组,这个数量看着多,实际用法是:oinstall 作为主组(装软件、持有文件),dba 决定能不能sysdba登录和启停实例,其余几个是 ASM、备份、Data Guard、RAC 场景预留。单机装 19C 用不到全部,但提前建好不占成本,后面开归档、配 DG 时不用回头补。

# 组 ID 只要不冲突即可,5001 起是为了避开系统组 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 # 建用户:主组 oinstall,附加组用 -G 逗号分隔 /usr/sbin/useradd -u 54321 -g oinstall \ -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper \ -m -d /home/oracle -s /bin/bash oracle # 设置密码,交互输入两次 passwd oracle # 验证组成员关系 id oracle

-u 54321是沿用 Oracle 官方的习惯 UID,方便和 preinstall 包自动创建的用户保持一致;-g指定主组,-G是附加组,顺序不能反。id oracle的输出里 groups 一行要能看到全部 8 个组,漏了某个组会导致后面启停 ASM 时报权限不够。如果这条命令报 "user oracle already exists",说明之前装过 preinstall 包,先确认组的 GID 是否一致再决定是否删掉重建。

3.2 /u01 目录规划与权限设置

ORACLE_BASE 放在哪,直接决定了以后扩容和备份好不好做。我的习惯是单独挂一块盘到/u01,软件、数据、归档、备份都在这棵树下分层,而不是塞进/root或者/home:

# 按 ORACLE_BASE/product/版本/db_1 的层级建目录 mkdir -p /u01/app/oracle/product/19.2.0/db_1 # 属主给 oracle:oinstall,属组决定 dba 组能不能读 chown -R oracle:oinstall /u01 # 775:属主和同组可读写执行,其他用户只读 chmod -R 775 /u01 # 确认结果 ls -ld /u01 /u01/app /u01/app/oracle df -h /u01

product/19.2.0/db_1里的 19.2.0 是目录命名习惯,19C 的实际版本号是 19.3 及以上,但 ORACLE_HOME 的路径名字只是给人看的,不影响功能,关键是.bash_profile里的 ORACLE_HOME 必须和这个目录一字不差。775是个折中,太严(700)会让 dba 组里其他运维账号连日志都读不到,太松(777)在有些安全扫描里会被点名。如果机器上原来就有/u01且属主不是 oracle,chown -R之后要再ls抽查两个子目录,避免某些被其他进程占用的文件没改成功。

提示:/u01如果是从别的机器上挂过来的 NFS,属主可能被映射成 nobody,这种情况要么改 mount 参数里的no_root_squash,要么直接换成本地盘,别在 NFS 上装 ORACLE_HOME。

3.3 oracle 用户的环境变量与 /etc/profile 补丁

环境变量是整个安装里最容易"上一个 shell 生效、下一个 shell 失效"的部分。根因通常是改错了文件:root 下改的是/root/.bashrc,切到 oracle 当然读不到。装库这个用户的环境变量,一律写~oracle/.bash_profile。

# 以 oracle 用户身份编辑,~ 就是 /home/oracle su - oracle vi ~/.bash_profile
# Oracle 环境变量,写在 .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 env | grep -E 'ORACLE|NLS_LANG|LD_LIBRARY' which sqlplus

ORACLE_SID是实例名,长度有限制,后面 netca、dbca 里填的必须和这里完全一致,大小写也一致。LD_LIBRARY_PATH少了$ORACLE_HOME/lib,sqlplus会在启动时报 "error while loading shared libraries",这个报错很有欺骗性,看着像缺包,其实是路径没配。LANG=C的目的是让安装器和日志输出英文,避免中文环境下日志乱码、报错搜不到;NLS_LANG定成AMERICAN_AMERICA.AL32UTF8,要和建库时选的字符集对上,客户端这边不一致就会出现查出来是问号的中文。

原文在/etc/profile里还加了一段针对 oracle 用户的 ulimit 补丁,这段在 sshd 不读 limits 的环境里是后悔药:

# /etc/profile 末尾,仅对 oracle 用户生效 if [ $USER = "oracle" ]; then if [ $SHELL = "/bin/ksh" ]; then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi

-p是管道缓冲区,-n是文件句柄,-u是进程数。这段是登录时执行的软限制,优先级低于 limits.conf 的 hard 值,所以不会冲突,属于双保险。改完/etc/profile要重新登录才生效,source一下也行,但用su - oracle验证更接近真实登录场景。

4. 两条安装路线:rpm 静默装与图形 runInstaller

到这一步系统底子已经干净了,接下来是分岔口。Oracle 19C 在 Linux 上有两条主流装法:一条是两个 rpm 包加一条 configure 命令,全程无图形界面;另一条是解压安装包跑runInstaller,一路点下一步。两条路装出来的软件是同一套东西,差别在可控性、可重复性和排错难度上,选错了后面维护会很难受。

4.1 路线 A:preinstall 加 ee,两条命令装完

rpm 这条路的逻辑是:preinstall 包自动做掉前面手工做的那些事(建用户组、写 sysctl、写 limits、装依赖包),ee 包把软件本体铺到/opt/oracle,最后用/etc/init.d下的脚本建库。适合批量部署、无人值守、以及不想折腾图形转发的环境。

# 两个包上传到 /u01 下,先装 preinstall 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 -qa | grep -i oracle

yum localinstall相比rpm -ivh的好处是会自动处理依赖,缺什么直接从已配置的源里拉,不用手工一个个找 rpm。preinstall 包装完之后会创建 oracle 用户(UID 54321)、oinstall 和 dba 组,并往/etc/sysctl.d/99-oracle-database-preinstall-19c.conf和/etc/security/limits.d/oracle-database-preinstall-19c.conf里写参数。这意味着如果前面已经手工建过 oracle 用户,这里会出现 UID 冲突的警告,属于正常现象,跳过即可。

装完软件要建库,ee 包提供的是配置脚本而不是图形界面:

# 建库前先看配置,里面定义了 SID、字符集、数据目录 cat /etc/sysconfig/oracledb_ORCLCDB-19c.conf # 执行配置,这一步会创建 CDB 和 PDB,耗时几分钟 /etc/init.d/oracledb_ORCLCDB-19c configure # 查看服务状态 systemctl status oracledb_ORCLCDB-19c

配置脚本默认建的是 CDB 名ORCLCDB、PDB 名ORCLPDB1,字符集AL32UTF8,数据文件落在/opt/oracle/oradata。要改 SID 和字符集,就在执行 configure 之前改那个 conf 文件,改完再跑;跑过一次之后再改 conf 是不生效的,得先删库。这一点和图形化建库的思维差别很大,很多人第一次用 rpm 路线会在这里卡住。

4.2 路线 B:runInstaller 图形化与 X11 转发

图形这条路更接近传统 DBA 的操作习惯:装软件、跑 root.sh、建监听、建库,四步分开,每一步都能看清楚发生了什么。代价是需要能把图形界面传到本地,要么用 Xmanager、VNC 这类工具,要么在本机装桌面环境直接开终端。

# 以 oracle 用户操作,先设 DISPLAY 指向运行 X server 的机器 export DISPLAY=192.168.199.129:0.0 env | grep DISPLAY # 在本地 X server 那台机器上执行 xhost +,允许远端连过来 xhost +

DISPLAY的格式是IP:屏号.位深,192.168.199.129不是你正在装的这台数据库服务器,而是你本地那台跑了图形工具的机器。写完env | grep DISPLAY确认变量真的在环境里,很多人是 root 下 export 的,切到 oracle 就没了。xhost +会关掉访问控制,测试环境图方便可以这么干,用完记得xhost -收回来。

# 进入解压后的 database 目录,执行安装器 cd /u01/app/oracle/product/19.2.0/db_1/database ./runInstaller

安装界面里只勾"仅安装软件",不要在同一步建库,把软件和实例拆开,出问题时更容易判断是安装环节还是建库环节的锅。安装路径填$ORACLE_HOME对应的实际目录,字符集那一步先跳过,建库时再定。装到 90% 左右会弹出提示,要求用 root 手动执行两个脚本,这一步不能跳。

4.3 root.sh 到底做了什么,为什么必须单独跑

root.sh是整条路线上唯一必须切 root 的环节,它干的事都和系统级配置有关,普通用户没权限:

# 切 root,按安装器提示的路径执行,注意是本机的 $ORACLE_HOME /u01/app/oracle/product/19.2.0/db_1/root.sh # 执行完看日志,有 WARNING 不一定是失败 tail -50 /u01/app/oracle/product/19.2.0/db_1/install/root_*.log

它主要写三样东西:/etc/oraInst.loc(记录 inventory 位置)、/etc/oratab(记录实例和 ORACLE_HOME,开机自启靠它)、$ORACLE_HOME/bin/oraenv和dbhome这两个切换环境的脚本。另外还会给一些二进制文件设 setuid 权限,用来做网络相关的特权操作。root.sh只需跑一次,重复跑会提示已存在并跳过部分步骤,但如果半路中断,最稳的做法是看日志定位,别直接删/etc/oraInst.loc重来。

4.4 两条路线怎么选,以及装之前的依赖自检

选型上我一般这么分:要批量装十几套、或者机器不允许开图形界面,走 rpm;要精细控制字符集、数据文件路径、CDB/PDB 结构,或者需要兼容 11g 时代的运维脚本,走 runInstaller。两者在功能上没有差别,差别在于"参数是否落在纸面上":rpm 路线的参数藏在/etc/sysconfig的 conf 里,图形路线的参数藏在响应文件和建库向导里。

对比项rpm(preinstall + ee)图形 runInstaller
图形界面不需要需要 X11 转发或本地桌面
用户与参数包自动创建、自动写入手工建、手工写
建库方式配置脚本一键建netca + dbca 分步建
ORACLE_HOME固定/opt/oracle自定义,通常/u01
可重复性高,脚本化中,依赖操作一致性
排错难度日志集中,报错少环节多,定位要经验

不管走哪条,装之前都建议把依赖包过一遍。原文给的rpm -q清单可以直接用,缺的补装:

# 一次性检查依赖,缺哪个装哪个 rpm -q bc binutils cpp compat-libcap1 compat-libstdc++-33 \ 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 # 有 missing 的批量补,缺的包名照着输出填 yum install -y libaio-devel ksh

rpm -q对已装的包打印完整包名,没装的打印 "package xxx is not installed",扫一眼就能列出缺口。compat-libstdc++-33这个名字容易记错,实际包名带横杠和版本号,装不上时用yum provides查一下真实名字。有些环境里ksh不是必装项,但安装器会检查,缺了只会在最后一步报警告,不如一开始就补上。

5. 避坑与排查:五条踩过的记录

装 19C 的报错大多有明确指向,麻烦的是那些"装完了但用不了"的问题——监听起来了客户端连不上、库起来了中文是问号、切用户 ulimit 不生效。下面五条是复现率最高的,每条按现象、原因、解决写,遇到对得上的直接抄。

5.1 现象:runInstaller 弹不出来,报 Cannot connect to X11

现象:命令行执行./runInstaller之后没有任何窗口,终端刷出 "Cannot connect to X11 window server using ... as the value of the DISPLAY variable" 或者直接静默退出,日志里只有一行 Java 的异常。

原因:三种情况最常见。一是DISPLAY设的是数据库服务器自己的 IP,而不是本地跑图形工具那台机器;二是xhost +是在 root 下执行的,而安装器是 oracle 身份运行,X server 的访问控制按用户区分;三是服务器上根本没装 X11 相关的库,连xclock都跑不起来。

解决:先在本地那台机器上确认图形工具已启动,然后在 oracle 会话里重设DISPLAY并验证:

# 检查 X11 客户端库是否齐 rpm -q xorg-x11-xauth xorg-x11-utils # 用最简单的 xclock 测试通道,能弹钟表说明通了 xclock # 用 oracle 身份重新授权 su - oracle export DISPLAY=192.168.199.129:0.0

xclock是这套流程的血泪经验,比直接跑安装器省时间得多,钟表弹不出来就别浪费几分钟等安装器初始化了。如果xclock报 "command not found",先装xorg-x11-apps;如果能找到命令但连不上,检查本地防火墙是否拦了 6000 端口。

5.2 现象:建库到一半报 ORA-00845 MEMORY_TARGET not supported

现象:dbca 建库进行到创建实例阶段失败,日志里是 ORA-00845,提示 MEMORY_TARGET 不受支持,或者干脆报 ORA-27102 out of memory。

原因:/dev/shm是 tmpfs,默认大小通常只有物理内存的一半。19C 用 AMM(自动内存管理)时,SGA 要从/dev/shm分配,如果 MEMORY_TARGET 设得比/dev/shm大,就会失败。

解决:先看实际大小,再决定是调小参数还是扩 tmpfs。

# 看 /dev/shm 当前大小 df -h /dev/shm # 临时扩大,重启失效 mount -o remount,size=4G /dev/shm # 永久生效,写进 fstab echo 'tmpfs /dev/shm tmpfs defaults,size=4G 0 0' >> /etc/fstab

size=4G至少要大于 MEMORY_TARGET 的值,留 1G 余量更稳。另一种做法是干脆不用 AMM,改用 ASMM(只设 SGA_TARGET 和 PGA_AGGREGATE_TARGET),绕开/dev/shm的限制,生产库上这么配的也不少。

5.3 现象:监听起来了,客户端连不上,报 ORA-12541 或 ORA-12514

现象:服务器上lsnrctl status显示 READY,本机sqlplus能连,从别的机器用 IP 连就报 TNS:no listener 或者 TNS:could not resolve the connect identifier。

原因:ORA-12541 一般是监听只绑在 localhost 上,或者防火墙没放行 1521;ORA-12514 是监听不认识你请求的服务名,实例没注册上去,常见于listener.ora里手工写死了 SID 而实例用的是 service_name。

解决:先确认端口和绑定地址,再确认注册状态。

# 看监听绑在哪个地址、哪个端口 lsnrctl status netstat -tlnp | grep 1521 # 看实例有没有注册到监听 lsnrctl services

如果netstat显示127.0.0.1:1521而不是0.0.0.0:1521,说明listener.ora里HOST写成了 localhost,改成实际 IP 或主机名后lsnrctl reload。如果服务列表里没有你的实例,用alter system register;手动注册,或者检查local_listener参数。防火墙这边用firewall-cmd --list-ports确认 1521 在列表里,别只看服务有没有关。

5.4 现象:中文数据查出来是问号,或者安装界面全是方块

现象:建完库插一条中文数据,select出来是???;或者图形安装界面上的中文全变成方块,按钮文字看不见。

原因:两个方向。一是数据库字符集建成了WE8ISO8859P1之类的单字节集,存不了中文;二是客户端NLS_LANG和服务端字符集不一致,客户端把 UTF-8 的数据按单字节解释。安装界面方块则是服务器缺中文字体,Java 渲染不出来。

解决:建库时字符集必须选AL32UTF8,这一点在建库向导里要手动确认,别用默认值。已经建错的库只能重建或者导出重导,代价很大,所以建库那一步值得多看两眼。客户端侧检查环境变量:

# 服务端字符集 sqlplus / as sysdba SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET'; # 客户端侧,两边的字符集要对齐 echo $NLS_LANG

NLS_LANG的格式是语言_地域.字符集,写成AMERICAN_AMERICA.AL32UTF8最稳。安装界面的方块不用管,直接把LANG临时设成en_US.UTF-8再跑安装器,界面变英文,反而看得更清楚。

5.5 现象:su - oracle 之后 ulimit 还是 4096,配置像没生效

现象:/etc/security/limits.conf里明明给 oracle 配了 131072,su - oracle之后ulimit -n还是 4096,重启也没用。

原因:/etc/security/limits.d/20-nproc.conf的加载顺序在limits.conf之后,里面的*通配会把 oracle 的配置覆盖掉;另一种可能是 sshd 的UsePAM被关了,PAM 不加载 limits 模块,配置文件根本不读。

解决:先确认覆盖来源,再决定往哪写。

# 看有没有更晚加载的 drop-in 在覆盖 ls -l /etc/security/limits.d/ grep -r 'nproc' /etc/security/limits.d/ # 确认 sshd 是否启用 PAM grep -i '^UsePAM' /etc/ssh/sshd_config # 用登录方式验证,别在当前 shell 里试 ssh oracle@192.168.199.111 'ulimit -n'

limits.d目录下的文件名是按字典序加载的,编号大于 20 的文件会覆盖前面的设置,所以最省事的做法是把 oracle 的配置写成/etc/security/limits.d/99-oracle.conf。UsePAM如果是 no,改成 yes 后systemctl reload sshd,再用新会话验证。验证一定要新开会话,当前 shell 的 ulimit 是继承来的,改了配置也不会变。

6. 建库之后:监听、实例与一套能复用的验收动作

软件装完只是把二进制铺好了,真正决定这套库能不能交付的是最后三步:建监听、建库、验收。我一般把这三步固定成一套动作,做完一遍心里就有底,不用等业务连上来才发现问题。监听用 netca 建,实例用 dbca 建,字符集在 dbca 里定死AL32UTF8,建完立刻用几条 SQL 和一次远端连接验一遍,最后把/etc/oratab里的自启开关打开。

# 建监听,图形界面里配端口 1521 和协议 TCP netca # 建库,只建一个 CDB 加一个 PDB,字符集选 AL32UTF8 dbca # 验收:实例状态、数据库打开模式、字符集 sqlplus / as sysdba
-- 实例是否启动、是什么状态 SELECT instance_name, status FROM v$instance; -- 数据库是否处于 OPEN,CDB 还是非 CDB SELECT name, open_mode, cdb FROM v$database; -- 字符集必须是 AL32UTF8,不是的话趁早重建 SELECT value FROM nls_database_parameters WHERE parameter='NLS_CHARACTERSET';

第一条查实例,status要是 OPEN 才算真的起来了;第二条的cdb列如果是 YES,说明是多租户架构,后续连接要区分 CDB 和 PDB 的服务名;第三条是最后一道关,字符集不对的话,后面所有中文问题都是它的连锁反应。三条都过了,再从另一台机器上用 IP 连一次 PDB,确认监听、防火墙、服务名三件事同时对,才算交付。

# 开启开机自启:/etc/oratab 里把实例那行的 N 改成 Y sed -i 's/^orcl:\/u01\/app\/oracle\/product\/19.2.0\/db_1:N/orcl:\/u01\/app\/oracle\/product\/19.2.0\/db_1:Y/' /etc/oratab grep orcl /etc/oratab # 用 dbstart 验证自启脚本能跑通 $ORACLE_HOME/bin/dbstart $ORACLE_HOME

oratab的格式是SID:ORACLE_HOME:Y/N,第三个字段是自启开关,写 N 的时候dbstart会直接跳过这个实例,表现出来就像自启没配。dbstart跑一遍能看到具体哪个实例被拉起、哪个被跳过,比重启一次机器验证快得多。这个 sed 里的路径必须和实际的 ORACLE_HOME 一致,写错了不会报错,只是静默不生效。从那以后我每次装完库,都会先把/etc/hosts、ulimit -n、oratab这三处挨个过一遍,再让业务方连——顺序反过来的代价,是半夜被叫起来查一个其实十分钟就能排掉的连接超时。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询