Aekor

Aekor
专注于用户阅读体验的响应式博客主题
  1. 首页
  2. Oracle 数据库
  3. 正文

Oracle 19c 单机部署全流程:从系统参数到建库优化

2026-03-03 29384点热度 0人点赞 0条评论

单机部署的难点不在某一条命令,而在顺序:磁盘和目录没准备好就装软件,后面补权限;内核参数没生效就建库,实例起不来;建完库再改静态参数,又得停机重启。下面这套流程按“存储 → 用户 → 内核 → 软件 → 建库 → 优化”推进,环境是 Red Hat 7.9 + Oracle 19.3.0,主机名 ora19c,全部命令可直接复制。

需要先明确一点:建库后再调整 processes、filesystemio_options 这类静态参数必须重启实例,所以能提前定的参数尽量在 dbca 之前想清楚;本文按建库顺序把它们放在最后统一处理,并在参数说明里标注生效方式。

1. 环境与规划

资源配置
操作系统redhat-7.9
CPU4
内存2
IP192.168.109.201
数据库版本19.3.0
/oracle40G

规划要点只有三条:/oracle 单独用一块 40G 磁盘,不跟根分区抢空间;主机名 ora19c 与 IP 写入 hosts,避免监听注册时解析失败;内存一栏写的是 2,未标单位;若按 2 GB 理解则只够实验,建库时 memoryPercentage 70 会非常紧张,生产环境按实际负载重新规划。

2. 安装前检查

在动磁盘之前先确认机器状态,能省掉后面大量返工:

hostname
ip addr show
free -m
df -h /tmp /oracle

hostname 必须是 ora19c,与 hosts 一致;/tmp 建议不少于 1 GB,安装程序解压和 dbca 建库都会往这里写临时文件;/oracle 必须是独立挂载点,而不是根分区下的普通目录。如果 /oracle 还没挂上就开始装软件,装到一半空间耗尽,清理起来比重新装更麻烦。

另外确认时间同步。单机没有 RAC 的心跳要求,但时间跳变会影响审计、归档日志命名和 Data Guard 后续扩展,装库前把 chronyd 或 ntpd 配好,比事后补更省事。

3. 磁盘划分与挂载

把第二块盘 /dev/sdb 全部分给 /oracle。先交互式分区,整盘一个主分区:

[root@ora19c ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x5554dbd5 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-83886079,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-83886079,默认为 83886079):
将使用默认值 83886079
分区 1 已设置为 Linux 类型,大小设为 40 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

分区号、起始扇区、结束扇区三处都直接回车取默认值。随后创建 LVM 并格式化:

partprobe /dev/sdb
pvcreate /dev/sdb1
vgcreate vg_ora /dev/sdb1
lvcreate -l +100%free -n lv_ora vg_ora
mkfs.xfs /dev/mapper/vg_ora-lv_ora
mkdir /oracle
mount /dev/mapper/vg_ora-lv_ora /oracle
df -h

df 应能看到 /oracle 挂载为 40G,输出形如:

文件系统                   容量  已用  可用 已用% 挂载点
devtmpfs                   1.9G     0  1.9G    0% /dev
tmpfs                      1.9G     0  1.9G    0% /dev/shm
tmpfs                      1.9G   12M  1.9G    1% /run
tmpfs                      1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/rhel-root       26G  1.3G   25G    5% /
/dev/sda1                 1014M  150M  865M   15% /boot
tmpfs                      378M     0  378M    0% /run/user/0
/dev/mapper/vg_ora-lv_ora   40G   33M   40G    1% /oracle

再确认 /etc/fstab 里有对应条目,否则重启后目录是空的,数据库直接起不来:

/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=161b9873-75fe-40c1-8a5d-da9e4b3f5460 /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/mapper/vg_ora-lv_ora /oracle       xfs     defaults        0 0

若缺少最后一行,用下面的方式补,先判断再追加,避免重复写入:

grep -q "vg_ora-lv_ora /oracle" /etc/fstab || echo "/dev/mapper/vg_ora-lv_ora /oracle xfs defaults 0 0" >> /etc/fstab
findmnt /oracle

挂载确认无误后再继续。若 fstab 写错,重启会进入紧急模式,这是单机部署最常见的事故点。

用 LVM 而不是直接 mkfs /dev/sdb1,是为了以后能在不停库的情况下扩 LV:底层加盘、pvcreate、vgextend、lvextend,再 xfs_growfs /oracle 即可。代价是多一层 device mapper,排查 I/O 时要看 /dev/mapper/vg_ora-lv_ora 而不是 /dev/sdb。mkfs.xfs 的输出里 sunit、swidth 均为 0,说明没有按条带对齐;单机本地盘可以接受,如果这块盘实际是 RAID 或 SAN LUN,应在建文件系统时用 -d su=... -d sw=... 对齐,否则大块 I/O 会跨条带放大。

4. 用户、组与目录

Oracle 单机只需要 oinstall 和 dba 两个组,用户 oracle 的主组是 oinstall、附加组是 dba:

groupadd -g 10023 oinstall
groupadd -g 10024 dba
useradd -u 10025 -g oinstall -G dba -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
echo "DJDSdba#666" | passwd --stdin oracle
mkdir -p /oracle/app/db && mkdir -p /oracle/app/19.3.0/db_1
chown -R oracle:oinstall /oracle
chmod -R 755 /oracle
chmod -R 777 /oracle/soft

这里的密码是示例值,生产环境必须替换,也不要把明文密码留在脚本或历史命令里。最后一条 chmod 针对软件包暂存目录 /oracle/soft,该目录需要提前建好,否则命令会报“No such file or directory”;777 只适合临时放安装包,装完应收回权限。

5. 系统参数与环境变量

5.1 防火墙、SELinux、avahi 与 hosts

systemctl stop firewalld && systemctl disable firewalld

sed -i "/^SELINUX=/s#enforcing#disabled#" /etc/selinux/config

echo "NOZEROCONF=yes" >> /etc/sysconfig/network

systemctl stop avahi-dnsconfd && systemctl stop avahi-daemon
systemctl disable avahi-dnsconfd && systemctl disable avahi-daemon

echo "192.168.109.201 ora19c" >> /etc/hosts

SELinux 改的是配置文件,当前会话仍为 enforcing,可用 setenforce 0 立即生效,重启后保持 disabled。avahi 会占用 5353 端口并干扰监听注册,必须停用。NOZEROCONF 用于避免 169.254 网段的路由干扰,RHEL 7 上写入 /etc/sysconfig/network 即可。

5.2 共享内存参数

shmall 和 shmmax 不写死,按物理内存计算:

SHMALL=`awk '($1 == "MemTotal:"){print $2/4}' /proc/meminfo`
SHMMAX=`awk '/MemTotal/{printf("%1.0f\n",$2*0.8*1024)}' /proc/meminfo`
echo "shmall=$SHMALL shmmax=$SHMMAX"

计算规则是 shmall = 物理内存(KB)/ 4,shmmax = 物理内存(KB)× 0.8 × 1024。下面用 heredoc 直接写入,$SHMALL 与 $SHMMAX 会在写入时展开成上一步算出的数值:

cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = $SHMALL
kernel.shmmax = $SHMMAX
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
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 = 1048586
net.ipv4.tcp_wmem = 262144 262144 262144
net.ipv4.tcp_rmem = 4194304 4194304 4194304
vm.min_free_kbytes=524288
kernel.panic_on_oops = 1
EOF

sysctl -p

sysctl -p 会逐行回显生效结果,有报错会直接指出行号。

这里有一个容易算错的地方:MemTotal 的单位是 KB,所以 shmmax 的公式里要再乘 1024 换成字节,而 shmall 的公式得到的是页数,不要再乘。以 2 GB 内存为例,shmall 约为 524288,shmmax 约为 1717986918;若机器是 8 GB,则约为 2097152 和 6871947674。两个值填反或单位搞错,表现都是实例启动时 mmap 失败或 SGA 只能分配到很小的一部分。这两项必须先按上面的 awk 结果算出再写入,若 shmall 为 0,实例启动会报 ORA-27125 一类共享内存错误。

逐项说明:fs.aio-max-nr 是异步 I/O 请求上限,低于 1048576 时高并发下可能报 I/O 错误;fs.file-max 是系统级文件句柄上限;kernel.shmmni 是共享内存段数量上限,4096 足够;kernel.sem 的四个值依次是每个信号集的信号量数、系统级信号量总数、每次 semop 调用数、信号集数量;ip_local_port_range 给客户端连接留出 9000-65500 的本地端口;rmem/wmem 与 tcp_rmem/tcp_wmem 影响 Data Guard、RMAN 走网络时的吞吐;vm.min_free_kbytes 保留 512 MB 空闲内存,避免内存回收抖动;kernel.panic_on_oops=1 让内核 oops 时直接 panic,便于通过 crashkernel 抓到现场。

5.3 limits.conf 与 pam

memlock 取物理内存的一半,单位 KB:

MEMLOCK=`awk '/MemTotal/{printf("%1.0f\n",$2/2.0)}' /proc/meminfo`
echo $MEMLOCK
cat >> /etc/security/limits.conf << EOF
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft memlock $MEMLOCK
oracle hard memlock $MEMLOCK
oracle soft stack 65536
oracle hard stack 32768
grid soft nproc 16384
grid hard nproc 16384
grid soft nofile 65536
grid hard nofile 65536
grid soft stack 65536
grid hard stack 32768
EOF

两处 memlock 由 $MEMLOCK 展开,无需手工替换。上面 soft stack 65536、hard stack 32768 的写法里软限制大于硬限制,实际不会生效,建议统一为 32768 或把 hard 提到 65536。单机没有 grid 用户,grid 四行可以保留也可以删掉,不影响安装。

让 PAM 加载 limits:

cat << EOF >> /etc/pam.d/login
session required /lib64/security/pam_limits.so
session required pam_limits.so
EOF

5.4 全局与 oracle 用户环境变量

root 下为 oracle、grid 设置 ulimit:

cat << EOF >> /etc/profile
if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
EOF

oracle 用户的环境变量:

cat << 'EOF' >> /home/oracle/.bash_profile
export PATH
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=TESTCDB
export ORACLE_BASE=/oracle/app
export ORACLE_HOME=/oracle/app/19.3.0/db_1
export ORACLE_UNQNAME=
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_TERM=xterm
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export EDITOR=vi
export LANG=en_US
export NLS_LANG=american_america.AL32UTF8
export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'
umask 022
EOF

ORACLE_SID 要与后面 dbca 的 -sid 一致,这里定为 TESTCDB。ORACLE_UNQNAME 留空,单机不影响;如果后面要用 EM 或做 Data Guard,应补成与 DB_UNIQUE_NAME 相同的值。

LANG=en_US 与 NLS_LANG=american_america.AL32UTF8 是刻意分开的:前者决定操作系统层面的日期、排序和报错语言,后者决定数据库客户端字符集。把 LANG 设成 en_US 能让 runInstaller 和 opatch 的输出保持英文,便于检索 MOS 和报错;如果设成 zh_CN.UTF-8,安装日志里会出现中文,反而不好比对。NLS_DATE_FORMAT 固定为 yyyy/mm/dd hh24:mi:ss,是为了让脚本里的日期比较不受默认格式影响。umask 022 保证新建文件对同组可读,RMAN 备份和告警日志不会因为权限问题读不到。

6. 依赖包与安装介质

yum install -y bc \
    gcc-c++ \
    binutils \
    compat-libcap1 \
    elfutils-libelf \
    elfutils-libelf-devel \
    fontconfig-devel \
    glibc \
    glibc-devel \
    libaio \
    libaio-devel \
    libX11 \
    libXau \
    libXi \
    libXtst \
    libXrender \
    libXrender-devel \
    libgcc \
    libstdc++ \
    libstdc++-devel \
    libxcb \
    make \
    net-tools \
    nfs-utils \
    smartmontools \
    sysstat \
    expect \
    psmisc \
    unzip \
    zip

compat-libstdc++-33 与 pdksh 通常不在 RHEL 7 默认源中,需要单独下载后本地安装:

rpm -ivh compat-libstdc++-33-3.2.3-47.3.x86_64.rpm
rpm -ivh pdksh-5.2.14-37.el5.x86_64.rpm

软件包为 db_home_193_V982063-01.zip(19.3.0 企业版)。上传到 /oracle/soft 或任意 oracle 用户可读的目录,不要放在 /tmp 下解压,空间不够会中途失败。

7. 静默安装 Oracle 软件

先解压到 ORACLE_HOME。注意 root 执行 su 时 $ORACLE_HOME 不会自动带入 oracle 的环境变量,稳妥做法是显式写出路径:

su - oracle -c "unzip -qo /oracle/soft/db_home_193_V982063-01.zip -d /oracle/app/19.3.0/db_1"

静默安装:

su - oracle -c "/oracle/app/19.3.0/db_1/runInstaller -silent -force -noconfig -ignoreInternalDriverError -ignorePrereq \
oracle.install.option=INSTALL_DB_SWONLY \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=/oracle/app/oraInventory \
ORACLE_BASE=/oracle/app/db \
ORACLE_HOME=/oracle/app/19.3.0/db_1 \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSOPER_GROUP=oinstall \
oracle.install.db.OSBACKUPDBA_GROUP=oinstall \
oracle.install.db.OSDGDBA_GROUP=oinstall \
oracle.install.db.OSKMDBA_GROUP=oinstall \
oracle.install.db.OSRACDBA_GROUP=oinstall \
oracle.install.db.rootconfig.executeRootScript=false"

几个参数的含义:INSTALL_DB_SWONLY 表示只装软件不建库;-noconfig 跳过 netca 等配置;-ignorePrereq 跳过前置检查,仅在明确知道缺什么时使用;rootconfig.executeRootScript=false 表示不自动跑 root 脚本,需要手工执行。

安装日志在 /oracle/app/oraInventory/logs 下,文件名为 installActions<时间戳>.log;静默安装失败时先看这个文件末尾的 SEVERE 行,而不是反复重跑。常见失败原因是缺少 compat-libstdc++-33、/oracle 空间不足、或 /tmp 小于 1 GB。

安装完成后按提示用 root 执行两个脚本,顺序不能反:

/oracle/app/oraInventory/orainstRoot.sh
/oracle/app/19.3.0/db_1/root.sh

注意 ORACLE_BASE 的不一致:环境变量里是 /oracle/app,安装参数里是 /oracle/app/db。后续 dbca 的 {ORACLE_BASE} 取的是环境变量,数据文件会落到 /oracle/app/oradata 下;如果希望统一,应在安装前把两处改成同一个值。

8. 静默建库与监听

创建 CDB + 1 个 PDB,数据文件放文件系统,不开 EM:

su - oracle -c "
dbca -silent -createDatabase \
    -templateName General_Purpose.dbc \
    -responseFile NO_VALUE \
    -gdbname TESTCDB -sid TESTCDB \
    -createAsContainerDatabase TRUE \
    -numberOfPDBs 1 \
    -pdbName TESTPDB \
    -pdbAdminPassword your_password \
    -databaseType MULTIPURPOSE \
    -automaticMemoryManagement false \
    -memoryPercentage 70 \
    -redoLogFileSize 200 \
    -sysPassword your_password -systemPassword your_password \
    -datafileDestination {ORACLE_BASE}/oradata/{DB_UNIQUE_NAME}/ \
    -recoveryAreaDestination {ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME} \
    -storageType FS \
    -characterset AL32UTF8 -nationalCharacterSet AL16UTF16 \
    -emConfiguration NONE"

建库耗时与机器性能相关,内存偏小时会明显偏慢。

建库参数逐项说明:-templateName 指定 General_Purpose.dbc 模板;-responseFile NO_VALUE 表示不使用响应文件,全部参数走命令行;-createAsContainerDatabase TRUE 与 -numberOfPDBs 1、-pdbName TESTPDB 一起决定 CDB 架构;-memoryPercentage 70 表示占物理内存 70%,在 automaticMemoryManagement=false 时按 ASMM 分配 SGA/PGA;-redoLogFileSize 200 单位是 MB;-storageType FS 表示不走 ASM;-emConfiguration NONE 跳过 Enterprise Manager 注册。密码在同一命令行里出现四次,会留在 shell history 和 ps 输出中,生产环境应改用响应文件并限制文件权限。

完成后创建监听,端口用 1526:

su - oracle -c "netca -silent -responseFile /oracle/app/19.3.0/db_1/assistants/netca/netca.rsp -instype custom -listener LISTENER -lisport 1526"

监听建好后检查:

lsnrctl status

9. 安装后验证

su - oracle -c "sqlplus -S / as sysdba <<EOF
select name, open_mode from v$database;
select name, open_mode from v$pdbs;
show parameter local_listener
EOF"

CDB 应为 READ WRITE,PDB 应为 READ WRITE(若未自动打开,执行 alter pluggable database all open)。再用客户端走监听连一次,确认 local_listener 已注册,而不是只靠本地 OS 认证。

验证不要只看“能连上”,要逐层确认:

su - oracle -c "sqlplus -S / as sysdba <<EOF
select instance_name, status from v$instance;
select file_name from dba_data_files;
select tablespace_name, status from dba_tablespaces;
EOF"

v$instance 的 status 必须是 OPEN;dba_data_files 里的路径应全部位于 /oracle/app/oradata/TESTCDB 下,如果出现 /u01 或 /home/oracle 之类的旧路径,说明模板或环境变量没生效。再用客户端走 TCP 连接一次,确认监听链路:

sqlplus system/[email protected]:1526/TESTCDB

如果这里报 ORA-12514,而本地 / as sysdba 正常,问题在监听注册而不是数据库;如果报 ORA-12541,监听没起或端口不对。两种错误的处理路径完全不同,先分清再动手。

10. 数据库参数优化

10.1 CDB 级

alter system set local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.109.201)(PORT=1526)))' scope=both;
alter system set open_cursors=3000 scope=both;
alter system set processes=3000 scope=spfile;
alter system set "_optimizer_use_auto_indexes"=OFF scope=spfile;
alter system set filesystemio_options=setall scope=spfile;
alter pluggable database all save state;
@?/rdbms/admin/utlpwdmg.sql;
alter profile default limit password_verify_function verify_function;
alter profile default limit password_life_time unlimited;
exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto space advisor', operation => NULL, window_name => NULL);
exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
exec dbms_scheduler.disable('ORACLE_OCM.MGMT_CONFIG_JOB');
exec dbms_scheduler.disable('ORACLE_OCM.MGMT_STATS_CONFIG_JOB');
exec DBMS_STATS.SET_PARAM('method_opt','FOR ALL COLUMNS SIZE 1');

10.2 PDB 级

alter session set container=TESTPDB;
@?/rdbms/admin/utlpwdmg.sql;
alter profile default limit password_verify_function verify_function;
alter profile default limit password_life_time unlimited;
exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'auto space advisor', operation => NULL, window_name => NULL);
exec DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor', operation => NULL, window_name => NULL);
exec DBMS_STATS.SET_PARAM('method_opt','FOR ALL COLUMNS SIZE 1');

CDB 与 PDB 的关系值得在交付前讲清楚:CDB$ROOT 存放数据字典和公共对象,TESTPDB 是业务真正连接的容器;很多参数在 CDB 级设置后会被 PDB 继承,但 PDB 仍可覆盖。alter pluggable database all save state 的作用是把当前打开状态写进 CDB 的数据字典,实例重启后自动把 PDB 带到 READ WRITE;如果不执行,重启后 PDB 停在 MOUNTED,应用会报 ORA-01033 或“未打开”。这个动作要在 PDB 正常打开时做,PDB 处于 MOUNTED 时保存的状态没有意义。

10.3 客户端认证版本

cat << EOF >> $ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
EOF

这两行是为了让 11g 等老客户端能连上 19c,代价是允许低版本认证协议,安全要求高的环境不要开。改完需重启监听。

profile 的两条改动也要注意顺序:先执行 utlpwdmg.sql 创建校验函数,再 alter profile 引用它。19c 的脚本默认创建 ORA12C_VERIFY_FUNCTION、ORA12C_STRONG_VERIFY_FUNCTION 等函数,而 verify_function 是 11g 的命名,若环境里不存在,alter profile 会失败;此时要么改用脚本实际创建的函数名,要么保留默认。password_life_time unlimited 会让密码永不过期,方便但不符合等保要求,是否采用取决于合规约束。

10.4 每个参数在做什么

参数作用生效方式与风险
local_listener把实例注册到 1526 端口的监听scope=both 立即生效;IP 或端口变了要同步改
open_cursors单会话可打开的游标数立即生效;设太大只占会话内存,一般 3000 够用
processes最大进程/连接数scope=spfile,必须重启;调大要同步调大内存与 sem
_optimizer_use_auto_indexes关闭 19c 自动索引隐藏参数,需重启;变更前建议先确认应用是否依赖自动索引
filesystemio_options文件系统使用异步 I/O 与直接 I/Oscope=spfile,必须重启;ASM 环境不需要
alter pluggable database all save state记录 PDB 打开状态立即生效,实例重启后自动打开 PDB
utlpwdmg.sql安装密码复杂度校验函数脚本执行后生效;会改变默认 profile 的校验规则
password_life_time unlimited密码不过期立即生效;与等保要求冲突时按规范设置有效期
DBMS_AUTO_TASK_ADMIN.DISABLE关闭自动空间顾问与 SQL 调优顾问立即生效;省掉后台任务,但也要自己接管容量与调优
dbms_scheduler.disable OCM关闭 OCM 采集任务立即生效;不影响数据库运行
DBMS_STATS.SET_PARAM method_opt全局关闭列级直方图收集立即生效且影响所有后续统计信息收集;依赖直方图的 SQL 可能变慢,改前先评估
SQLNET.ALLOWED_LOGON_VERSION允许低版本客户端认证改 sqlnet.ora 后重启监听;降低安全性

11. 常见问题排查

监听起来了但客户端连不上,按下面顺序查,不要一上来就改 sqlnet.ora。

现象先查什么处理
lsnrctl status 里没有服务名show parameter local_listener;select * from v$registry补注册或改 local_listener 后 alter system register
本地能连、远程连不上防火墙、监听端口、bind 地址确认 1526 已放行,监听没有只绑 127.0.0.1
报 shared memory 相关错误ipcs -l 与 /etc/sysctl.conf 是否一致sysctl -p 后重启实例
实例启动但 PDB 是 MOUNTEDselect name, open_mode from v$pdbsalter pluggable database all open,并 save state
密码过期或登录被拒select username, account_status from dba_users按 profile 策略处理,不要直接改 sys 密码
安装阶段报缺包oraInventory/logs 下 installActions 日志按缺失的 rpm 补装后重跑,不要跳过 -ignorePrereq 掩盖问题

还有两个容易忽略的点:/etc/hosts 里主机名必须能解析到本机 IP,否则监听注册会退化成本地名;修改 sqlnet.ora 后必须 lsnrctl reload 或重启监听,只重启数据库不生效。

12. 交付前检查清单

  • df -h 确认 /oracle 已挂载,/etc/fstab 有对应条目;
  • sysctl -p 无报错,ipcs -l 看到的 shmall/shmmax 与配置一致;
  • su - oracle 后 env 中 ORACLE_HOME、ORACLE_SID 正确;
  • lsnrctl status 显示 LISTENER 已启动,服务名已注册;
  • 重启主机后实例能自动启动(未配置 Oracle Restart 时需手工 startup 或自建 systemd 服务),PDB 自动打开;
  • 用业务账号从客户端连一次,而不是只测本地 / as sysdba。

待核对

  • 原文 /etc/sysctl.conf 的 kernel.shmall、kernel.shmmax 与 limits.conf 的 memlock 均为空值,本文改为由 awk 计算后 heredoc 代入,落地时请先执行两条计算命令再写入。
  • 原文 limits.conf 中 oracle soft stack 65536 大于 hard stack 32768,软硬限制矛盾,配置值照原样保留,正文提示统一。
  • 原文安装参数 ORACLE_BASE=/oracle/app/db,而 oracle 环境变量为 /oracle/app,两者不一致;配置照原样保留,建库路径以环境变量为准。
  • 原文以 root 执行 su - oracle -c "$ORACLE_HOME/...",root 下该变量为空;文中已改为绝对路径,行为等价。
  • 原文 avahi 段落的 echo 被断成两行(e / cho),且 NOZEROCONF 使用了 cat 而非 echo;文中已修正为可直接执行的写法。
  • 原文 netca 命令使用中文引号,已改为英文引号。
  • 19c 的 utlpwdmg.sql 默认创建的是 ORA12C_VERIFY_FUNCTION 等函数,原文随后直接引用 verify_function,执行时可能报 ORA-07443;需按实际环境确认函数名。
  • 原文未记录安装完成后 root 脚本的具体文件名,文中按 19c 标准路径补为 orainstRoot.sh 与 root.sh,需与安装日志核对。
  • 原文内存只写“2”未标单位,dbca 使用 memoryPercentage 70;若为 2 GB,实际可能因内存不足失败,需按真实规格重新规划。

原文链接:http://mp.weixin.qq.com/s?__biz=MzAwNjQ2ODM3Ng==&mid=2247483768&idx=1&sn=c630c6fb32ab2c3b2bd0b9ad6ad2850b&chksm=9b0da70fac7a2e1902038663a9f2017cd0628e4f9092d9d07983030dae3cd0ee8d4a13269c03#rd

原文首发于微信公众号「止水研习社」。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Oracle Oracle 19c 数据库部署
最后更新:2026-10-17

Aekor

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

使用AI教程

  • API报错解决方案
  • API 基础知识
  • API Key 获取
  • 最新接入教程

分类

  • Blog
  • Oracle 数据库
  • TradingAgents-CN
  • 使用教程
  • 数据库

COPYRIGHT © 2026 Aekor. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang