CentOS 7 安装 Oracle 19C:内核参数、权限模型与安装路线

发布时间:2026/11/4 12:18:02
CentOS 7 安装 Oracle 19C:内核参数、权限模型与安装路线 简介面向数据库运维人员与 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 三条命令先摸清底子原文给的三条检查命令是对的但颗粒度太粗实际动手我一般会一次跑全# 物理内存总量单位 kB1G 约等于 1000000 grep MemTotal /proc/meminfo # Swap 总量单位 kB grep SwapTotal /proc/meminfo # 各挂载点剩余空间重点看 / 和 /u01 df -h # 发行版、内核、CPU 核数决定后面装哪个 preinstall 包 cat /etc/redhat-release uname -r nproc这几个输出要连起来看不能只看单项。MemTotal 的单位是 kB1048576 才是 1Gdf -h要看的是/u01所在分区而不是根分区因为 Oracle 的软件、数据文件、归档日志都会往 ORACLE_BASE 底下堆根分区只剩 8G 时装完软件就没地方放数据文件了。nproc决定 SGA 和并行度的合理上限1~2 核的机器上把 SGA 开到 4G 只会换来频繁换页。官方的门槛和实际能用的门槛差得很远下面这张表是我一般会对照的项目官方最低实际建议检查命令物理内存1G4G 起图形安装建议 8Ggrep MemTotal /proc/meminfoSwap2G内存的 1~1.5 倍且不小于 2Ggrep SwapTotal /proc/meminfo/u01可用空间8G软件 12G 数据文件按业务估df -h /u01临时目录/tmp1G4G 以上df -h /tmpSwap 不够的时候现场补一个文件就行不必重装系统# 用 dd 而不是 fallocate部分文件系统上 fallocate 出来的块 # 会带 holesmkswap 能过但 swapon 会失败 dd if/dev/zero of/swapfile bs1M count4096 chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写进 fstab重启后还在 echo /swapfile none swap sw 0 0 /etc/fstab free -mcount4096是块数bs1M是单块大小合起来就是 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 10kernel.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 134217728nproc是进程数nofile是文件句柄数这两个必须 soft/hard 成对写只写 soft 时ulimit -Hn还是老值。memlock是锁住内存不许换出用大页或者 MEMORY_TARGET 时必须给足单位是 kB134217728 约等于 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 -usysctl -p的报错要逐行看出现 cannot stat /proc/sys/... 通常是参数名拼错或者内核版本不支持这种条目会被静默跳过最后表现为我明明配了却没生效。su - oracle里的减号不能省su oracle不加载登录环境ulimit 读的还是上一个会话的值这是很多人验证时误判配置没生效的原因。SELinux 和 firewalld 的处理要区分测试机和生产机。测试机图省事可以关掉生产机上我一般只放行端口不到万不得已不动 SELinux# 临时关闭重启失效 getenforce setenforce 0 # 永久关闭需要重启才彻底生效 sed -i s/^SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config grep ^SELINUX /etc/selinux/configsetenforce 0之后getenforce显示的是 Permissive这只是临时状态改文件才是永久的而且必须重启。生产机上如果只是装数据库用 firewalld 放行 1521 更省事firewall-cmd --permanent --add-port1521/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 都常见 TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.199.111 GATEWAY192.168.199.1 NETMASK255.255.255.0 DNS1192.168.199.1BOOTPROTO从 dhcp 改成 staticONBOOTyes保证开机起来。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 hostnameping 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 /u01product/19.2.0/db_1里的 19.2.0 是目录命名习惯19C 的实际版本号是 19.3 及以上但 ORACLE_HOME 的路径名字只是给人看的不影响功能关键是.bash_profile里的 ORACLE_HOME 必须和这个目录一字不差。775是个折中太严700会让 dba 组里其他运维账号连日志都读不到太松777在有些安全扫描里会被点名。如果机器上原来就有/u01且属主不是 oraclechown -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_SIDorcl export PATH$ORACLE_HOME/bin:/usr/sbin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/lib:/usr/lib export LANGC export NLS_LANGAMERICAN_AMERICA.AL32UTF8# 立即生效 source ~/.bash_profile # 逐项确认别只看 echo $ORACLE_HOME env | grep -E ORACLE|NLS_LANG|LD_LIBRARY which sqlplusORACLE_SID是实例名长度有限制后面 netca、dbca 里填的必须和这里完全一致大小写也一致。LD_LIBRARY_PATH少了$ORACLE_HOME/libsqlplus会在启动时报 error while loading shared libraries这个报错很有欺骗性看着像缺包其实是路径没配。LANGC的目的是让安装器和日志输出英文避免中文环境下日志乱码、报错搜不到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 路线 Apreinstall 加 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 oracleyum 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 路线 BrunInstaller 图形化与 X11 转发图形这条路更接近传统 DBA 的操作习惯装软件、跑 root.sh、建监听、建库四步分开每一步都能看清楚发生了什么。代价是需要能把图形界面传到本地要么用 Xmanager、VNC 这类工具要么在本机装桌面环境直接开终端。# 以 oracle 用户操作先设 DISPLAY 指向运行 X server 的机器 export DISPLAY192.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 里图形路线的参数藏在响应文件和建库向导里。对比项rpmpreinstall 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 kshrpm -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 DISPLAY192.168.199.129:0.0xclock是这套流程的血泪经验比直接跑安装器省时间得多钟表弹不出来就别浪费几分钟等安装器初始化了。如果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,size4G /dev/shm # 永久生效写进 fstab echo tmpfs /dev/shm tmpfs defaults,size4G 0 0 /etc/fstabsize4G至少要大于 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 上或者防火墙没放行 1521ORA-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 parameterNLS_CHARACTERSET; # 客户端侧两边的字符集要对齐 echo $NLS_LANGNLS_LANG的格式是语言_地域.字符集写成AMERICAN_AMERICA.AL32UTF8最稳。安装界面的方块不用管直接把LANG临时设成en_US.UTF-8再跑安装器界面变英文反而看得更清楚。5.5 现象su - oracle 之后 ulimit 还是 4096配置像没生效现象/etc/security/limits.conf里明明给 oracle 配了 131072su - 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 oracle192.168.199.111 ulimit -nlimits.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; -- 数据库是否处于 OPENCDB 还是非 CDB SELECT name, open_mode, cdb FROM v$database; -- 字符集必须是 AL32UTF8不是的话趁早重建 SELECT value FROM nls_database_parameters WHERE parameterNLS_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_HOMEoratab的格式是SID:ORACLE_HOME:Y/N第三个字段是自启开关写 N 的时候dbstart会直接跳过这个实例表现出来就像自启没配。dbstart跑一遍能看到具体哪个实例被拉起、哪个被跳过比重启一次机器验证快得多。这个 sed 里的路径必须和实际的 ORACLE_HOME 一致写错了不会报错只是静默不生效。从那以后我每次装完库都会先把/etc/hosts、ulimit -n、oratab这三处挨个过一遍再让业务方连——顺序反过来的代价是半夜被叫起来查一个其实十分钟就能排掉的连接超时。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询