news 2026/10/17 7:00:19

Oracle 19c单实例ASM部署实战:从GI到DBCA的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle 19c单实例ASM部署实战:从GI到DBCA的完整指南

很多人一听到“单实例 + ASM”就觉得没必要:一个库而已,用文件系统不香吗?说实话,我早年也是这么想的,直到某次生产环境数据文件所在的磁盘阵列出现控制器抖动,手动把数据文件挪盘挪到凌晨三点,才意识到 ASM 的价值从来不是“性能多快”,而是“让你少熬夜”。Oracle 19c 是长期支持版本里相当稳的一代,单实例 ASM 的部署路径也成熟了,图形化和静默两条路我都完整跑过。如果你正打算在 Linux 上把 Oracle 19c 装成 ASM 存储模式,或者想搞清楚 DBCA、asmca、gridSetup.sh 这些工具到底怎么配合,这篇就是给你准备的。

为了不纸上谈兵,我把整套环境按“最小生产标准”规划:操作系统用 RHEL/CentOS 系的 Linux 7.9,Grid Infrastructure(GI)和数据库都是 19.3 基础版本,后续补 OPatch 升级到 19.3.0.0.x 最新补丁。单实例 ASM 看似只比普通单实例多了一层 GI,但这一层会牵扯到用户、组、内核参数、磁盘设备权限、root.sh 脚本等一系列细节。我把整个流程拆成四个阶段来讲:系统准备、Grid Infrastructure 部署、数据库软件安装、DBCA 建库。图形化和静默方式我会在每个阶段都给出对应做法,方便你在有图形环境和纯命令行环境之间自如切换。

1. 安装前的架构拆解与方案权衡

动手之前先把 ASM 和普普通通的文件系统对比一下,不然你很难理解后面那些看起来“多此一举”的步骤。ASM 全称 Automatic Storage Management,是 Oracle 自己的卷管理器和文件系统。它把裸设备或者磁盘分区抽象成磁盘组,数据文件、控制文件、日志文件都放在磁盘组里,数据库通过 ASM 实例来读写。对于单实例部署,它最大的意义在于:一是消除了手动管理大量数据文件路径的负担,二是磁盘组可以做正常/高/外部三种冗余,三是后续加盘、换盘、迁移数据时可以在线 rebalance,不停库。

1.1 单实例 ASM 的价值和适用场景

我见过不少人在单实例上坚持用 ext4 文件系统,理由是简单直接。但如果你做的是核心业务库,数据量过TB,或者底层存储规划经常调整,ASM 的优势就明显了。数据文件散落在几十个目录里时,你要做表空间扩容,得先看哪个目录空间够;用 ASM 后你只需要看 ASM 磁盘组的可用空间,数据分布由 ASM 自动搞定。另外 ASM 的镜像机制和磁盘组的故障组概念,在底层阵列没有做 RAID 的情况下特别有用,数据库层面的冗余是最后一道保障。

同时要明确一点:单实例 ASM 不等于 RAC。RAC 需要 GI 里的 Clusterware 组件做节点间通信和资源管理,而单实例 ASM 只需要 GI 的 ASM 实例和 ASM 磁盘组,不需要配置集群。19c 的 Grid Infrastructure 支持“Oracle Standalone Cluster”方式安装,也可以选择只装 ASM 的“Oracle Restart”模式。单实例 ASM 我强烈建议使用 Oracle Restart,它的核心价值在于:数据库实例、监听器、ASM 实例作为资源由 OHASD 统一管理,服务器重启后可以按依赖关系自动拉起。这套机制比你自己写开机自启脚本靠谱得多。

1.2 图形化与静默两种安装路径的取舍

图形化安装(GUI)适合你手头有 X 终端、或者服务器能配置 VNC 的情况。它的优点是一步一步有向导提示,参数填错了当场能看到校验结果。缺点是慢,而且响应文件不熟悉的话,图形界面上的隐藏逻辑你摸不透。静默安装(silent)则是通过响应文件和命令行参数直接跑安装程序,适合我这种经常要批量部署、或者服务器根本没图形界面的场景。缺点是响应文件任何一个参数填错,报错信息可能很抽象,排查要靠日志。

我的建议是:第一次部署用图形化过一遍,把整个安装流程的来龙去脉搞清楚;之后所有环境都改用静默模式,把响应文件做成模板。这样既能保证部署一致性,又能节省大量时间。本文会两种方式都展开,你可以在同一环境里对照着理解,尤其是响应文件里的关键参数,图形化界面里对应的选项是什么,我会尽量点明。

1.3 版本和硬件规划建议

Oracle 19c 实际上对应数据库版本 19.x,它是 12.2 系列后的长期支持版本。部署前要确认几个前提:Linux 内核版本、glibc 版本、系统架构必须满足官方要求。我用的环境是 64 位 x86_64,物理内存 16G,交换分区 8G,/tmp 空间至少 4G,磁盘给到 200G。生产环境建议内存 32G 起,毕竟 Oracle 的 memory_target 和 PGA 内存管理都比较吃资源。

软件包规划上,至少要准备以下东西:

  • LINUX.X64_193000_db_home.zip:数据库软件安装包,里面含 database 目录
  • LINUX.X64_193000_grid_home.zip:Grid Infrastructure 的安装包,含 ASM 需要的组件
  • p6880880_190000_Linux-x86-64.zip:OPatch 工具升级包
  • 最新版数据库补丁(Release Update)和 GI 补丁,建议安装完成后统一打

注意一点:grid 和 oracle 两个软件家目录($ORACLE_HOME)一定要分开放,不要共用一个 ORACLE_HOME。GI 的 home 目录默认是 /u01/app/19.0.0/grid,数据库的 home 是 /u01/app/oracle/product/19.0.0/dbhome_1。分开放是为了避免 GI 和数据库的二进制文件互相覆盖,也是官方支持的标准布局。

2. 系统基础配置与部署前硬性检查

ASM 部署里最容易栽跟头的不是安装软件本身,而是 Linux 系统层面的准备。用户、组、目录、内核参数,哪怕一个 ulimit 没设对,安装程序都会在中途报错。这部分的每一行命令我都建议你复制下来逐条执行,不要跳步。

2.1 用户、组与目录结构的规划

ASM 要求服务和数据库使用不同的操作系统用户。标准做法是创建两个用户:grid 用户专门跑 GI 和 ASM 实例,oracle 用户跑数据库实例。涉及的组也比较讲究,我直接给出按官方文档推荐的固定划法:

组名用途
oinstall软件安装所有者主组,grid 和 oracle 都要属于它
dba数据库管理员组,oracle 用户的主要组
oper数据库操作员组,用于日常启动停止数据库
backupdba备份恢复操作组
racdbaRAC 数据库管理组,单实例也建议保留
asmdbaASM 管理组,oracle 用户必须加入,否则无法访问 ASM
asmoperASM 操作员组
asmadminASM 管理员组,grid 用户所属

创建顺序上,先建组再建用户,因为用户指定主组时必须引用已存在的组。我的建议是先用 groupadd 把八个组都建好,再分别 useradd。grid 用户的主组是 oinstall,附加组是 asmadmin、asmdba、asmoper;oracle 用户的主组是 oinstall,附加组是 dba、oper、backupdba、racdba、asmdba。注意 oracle 用户要加入 asmdba 组,这样数据库实例才能访问 ASM 磁盘组里的信息。

目录结构方面,我统一采用 /u01/app 作为软件根目录。需要预创建:

mkdir -p /u01/app/19.0.0/grid mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 mkdir -p /u01/app/oraInventory mkdir -p /u01/app/oracle/oradata mkdir -p /u01/app/oracle/fast_recovery_area chown -R grid:oinstall /u01/app/19.0.0/grid chown -R oracle:oinstall /u01/app/oracle/product chown -R grid:oinstall /u01/app/oraInventory chown -R oracle:oinstall /u01/app/oracle/oradata

这段操作的核心逻辑是:软件目录的属主必须是实际安装软件的用户(grid 或 oracle),oraInventory 目录由 grid 用户首次运行时自动创建。如果权限不对,安装程序在写入二进制文件时会直接失败,这是在日常运维里特别常见的问题。

2.2 内核参数、资源限制与网络配置

Linux 内核参数直接影响 Oracle 对共享内存、信号量、文件句柄的使用。我直接给一组适合 16G 内存环境的配置,写入 /etc/sysctl.conf:

fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 4194304 kernel.shmmax = 8589934592 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.core.rmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2

重点解释两个参数。kernel.shmall 表示共享内存页总数,总物理内存 16G 除以页大小 4K,就是 4194304 页。kernel.shmmax 是单个共享内存段的最大字节数,8G 是一个常见取值,Oracle SGA 如果在 8G 以内,一个共享内存段就能覆盖。如果你的 SGA 大于 8G,shmmax 要同步调大。另外 Oracle 对信号量的要求是 semmsl 不小于 250,如果你机器上跑着其他高并发服务,建议调大到 32000,避免信号量不足导致实例启动失败。

ulimit 限制方面,以 grid 和 oracle 用户分别设置。编辑 /etc/security/limits.d/oracle-grid.conf:

grid soft nofile 1024 grid hard nofile 65536 grid soft nproc 2047 grid hard nproc 16384 grid soft stack 10240 grid hard stack 32768 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768

这里 nofile 是打开文件数,nproc 是用户进程数,stack 是栈空间。Oracle 官方建议的 nproc 上限是 16384,别只看软限制,硬限制也要确认。安装程序在前期检查中会逐项核对,如果某项不满足,会直接在日志里列出“PRVE-XXXX”错误码。

网络配置上,单实例 ASM 需要配置一个本地监听地址,至少保证主机名能解析到固定 IP。19c 安装时会对主机名、IP 做反向解析检查,推荐同时写 /etc/hosts,把主机名和 IP 的映射固化下来:

127.0.0.1 localhost localhost.localdomain 192.168.1.100 db19c.example.local db19c

同时确保挂载点 /u01 的文件系统类型是 xfs 或 ext4,不要用 tmpfs 之类的内存文件系统。Oracle 19c 对文件系统类型有限制,我曾见过有人把 ORACLE_HOME 放在 NFS 上,安装时各种奇怪报错,最后规整到本地磁盘才顺利通过。

2.3 安装介质准备与解压检查

软件的压缩包建议统一放在 /tmp 下的一个专用目录,比如 /tmp/oracle19c。用 unzip 解压时注意保留权限,不要用普通用户解压后再 chown,正确做法是解压前就先创建好目录,解压后立刻把所有权调整到对应安装用户。

grid 安装包解压后,目录里会出现一个叫 grid 的子目录,里面是 runInstaller 启动程序。数据库安装包解压后,是一个 database 目录,里面有 runInstaller。把两者分开放置,避免安装时选错安装源。解压后我习惯先做一次 md5sum 或者 unzip -t 校验压缩包完整性,因为下载过程中损坏的包会导致解压报错或安装中途莫名退出。

3. 部署 Grid Infrastructure(ASM 层)

GI 是整条链路里最复杂的一环。很多人把 GI 理解为“一个装 ASM 的软件”,实际上它还包含 OHASD、集群就绪服务等组件。单实例部署时,安装模式要选“Oracle Standalone Cluster”,这样不会拉起多节点的集群资源,但保留资源管理和重启自拉起能力。

3.1 ASM 磁盘的准备与设备标识

在运行安装程序前,先要把用于 ASM 磁盘组的物理磁盘准备好。生产环境一般是磁盘阵列里的 LUN,测试环境可以用虚拟机磁盘。ASM 要求磁盘是未格式化的裸设备,或者打了 ASM 标识的分区。我强烈建议用 ASM 磁盘标识,也就是在磁盘头写入一个身份标记,否则重启后设备名漂移会导致 ASM 找不到磁盘组。

首先给数据盘分区。假设你有两块 100G 的独立磁盘 /dev/sdb 和 /dev/sdc,用 fdisk 创建分区后,检查磁盘 UUID,然后使用 oracleasm 或者直接用 udev 规则固定磁盘权限。19c 目前主流做法是用 udev 规则,因为 19c 的 GI 自带 ASM 磁盘标识功能,配合 udev 可以做到稳定识别。

创建 udev 规则前先查磁盘的 ID 信息:

udevadm info --query=all --name=/dev/sdb1 | grep ID_SERIAL udevadm info --query=all --name=/dev/sdc1 | grep ID_SERIAL

然后写 /etc/udev/rules.d/99-oracle-asm.rules:

KERNEL=="sdb1", SUBSYSTEM=="block", ENV{ID_SERIAL}=="your_sdb_serial", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sdc1", SUBSYSTEM=="block", ENV{ID_SERIAL}=="your_sdc_serial", OWNER="grid", GROUP="asmadmin", MODE="0660"

重载规则后,确认设备权限变成 grid:asmadmin。这一步别偷懒,权限错的话安装程序在检测 ASM 磁盘时会报告没有发现候选磁盘。磁盘归属 grid 用户、asmadmin 组,是 ASM 磁盘的标准权限模型:grid 用户负责读写磁盘,asmadmin 组负责磁盘管理操作。

3.2 图形化方式运行 gridSetup.sh

有图形环境的机器,切换到 grid 用户后进入解压后的 grid 目录,执行:

su - grid cd /tmp/oracle19c/grid ./gridSetup.sh

安装向导启动后,按以下顺序配置:

  1. 选择“Set Up Software Only”还是“Configure Oracle ASM”。这里要注意区分:如果你希望在 GI 安装完成的同时就把 ASM 磁盘组建好,选 Configure Oracle ASM;如果只想先装软件、后建磁盘组,选 Software Only。我建议选 Configure Oracle ASM,一步到位,省得后面还要用 asmca 单独建组。

  2. 配置类型选择“Oracle Standalone Cluster”,这个选项在 19c 的向导里也叫“Configure Oracle Restart”。 它适用于单节点,不配置额外心跳等集群信息。

  3. 语言、安装位置确认后,关键一步是“Create ASM Disk Group”。磁盘组名我按照习惯用 DATA 和 FRA 两个,DATA 存放数据文件,FRA 存放归档日志和闪回文件。冗余级别建议选“Normal”,即双份镜像,对单实例来说数据可靠性更高;如果底层阵列已经做了 RAID,选 External 即可。

  4. 系统权限、操作系统组映射:asmadmin、asmdba、asmoper 分别对应到相关组。向导会预填,确认和你在系统里建的组一致。

  5. 之后会要求输入 sysasm 和 sysdba 的口令。sysasm 是 ASM 实例的管理员,口令尽量设强一点。这里容易出错的地方是,安装程序会让你对两个用户名分别设置口令,别都设成同一个简单密码,毕竟这是数据库第一道门。

  6. 最后进入“Execute Configuration Scripts”阶段,向导会要求以 root 执行两个脚本:oraInventory 目录的 orainstRoot.sh 和 GI home 下的 root.sh。这里有个经验:root.sh 执行时间可能长达几分钟,期间会调用 cvu、crsctl 等工具配置资源,屏幕看起来像“卡住”,其实是在干活,别急着 Ctrl+C。

图形化安装完成后,用 root 用户依次执行:

cd /u01/app/oraInventory ./orainstRoot.sh cd /u01/app/19.0.0/grid ./root.sh

root.sh 执行时如果报错,重点查看 /u01/app/19.0.0/grid/cfgtoollogs/rootcrs_*.log。我在执行时最常见的报错是 /etc/oracle 目录权限或者 /etc/sysconfig/network 缺失,这类问题基本都是前期系统配置不仔细造成的。

3.3 静默方式运行 gridSetup.sh

纯命令行环境下,通过响应文件实现静默安装。先把响应文件模板复制出来:

cp /tmp/oracle19c/grid/gridSetup.rsp /tmp/grid_temp.rsp chown grid:oinstall /tmp/grid_temp.rsp chmod 660 /tmp/grid_temp.rsp

修改响应文件里这些关键参数:

oracle.install.option=CRS_CONFIG ORACLE_BASE=/u01/app/grid ORACLE_HOME=/u01/app/19.0.0/grid INVENTORY_LOCATION=/u01/app/oraInventory oracle.install.asm.OSDBA=asmdba oracle.install.asm.OSOPER=asmoper oracle.install.asm.OSASM=asmadmin oracle.install.crs.config.type=STANDALONE oracle.install.asm.SYSASMPassword=YourSysAsmPass oracle.install.asm.SYSMonitoringPassword=YourSysAsmPass oracle.install.asm.diskGroup.name=DATA oracle.install.asm.diskGroup.redundancy=NORMAL oracle.install.asm.diskGroup.AUSize=4 oracle.install.asm.diskGroup.disks=/dev/sdb1,/dev/sdc1 oracle.install.asm.diskGroup.diskDiscoveryString=/dev/sd* oracle.install.asm.monitorPassword=YourSysAsmPass oracle.install.asm.gimrBaseLocation=/u01/app/grid/GIMR

这里几个参数的含义要特别解释:

  • oracle.install.option=CRS_CONFIG 表示完整配置 GI,而不是只装软件。
  • oracle.install.crs.config.type=STANDALONE 对应的就是图形向导里的“Oracle Standalone Cluster”,漏了这个参数,静默安装会默认按集群模式处理,导致后面 root.sh 跑集群配置脚本,报一堆节点错误。
  • oracle.install.asm.diskGroup.disks 里的磁盘要和 udev 配置匹配,多个磁盘用逗号分隔,不能有空格。
  • oracle.install.asm.diskGroup.diskDiscoveryString=/dev/sd* 是 ASM 的磁盘发现字符串,默认是 /proc/partitions 下的设备,这里要确保和实际设备名匹配。

然后执行静默安装:

su - grid cd /tmp/oracle19c/grid ./gridSetup.sh -silent -responseFile /tmp/grid_temp.rsp -waitforcompletion

加 -waitforcompletion 参数后,终端会等待安装和 root.sh 全部完成。不加这个参数,脚本只把安装任务提交,root.sh 需要你在台前手动等。日志位置在 /u01/app/oraInventory/logs/ 或 $ORACLE_HOME/cfgtoollogs/gridSetup/,安装失败先从这些日志里查第一处报错。

还有一种“混合模式”:在有显示器的机器上运行图形向导,但要通过脚本远程执行 root.sh。实际生产环境里最常见的是,安装人员在本机跑安装,root.sh 需要交给维护窗口在另一台终端上执行。此时不要关闭安装窗口,等 root.sh 执行完点“OK”即可。如果你用静默方式,就必须在响应文件里把 root.sh 执行的时机规划好,因为一旦 -waitforcompletion 启动,安装程序会等待 root.sh 被手动执行完才继续。

3.4 使用 asmca 验证 ASM 环境

GI 部署完成后,验证 ASM 环境是否健康。切换到 grid 用户,先确认 CRS 资源:

su - grid crsctl stat resource -t asmca -silent -listDiskGroups asmcmd ls

crsctl stat resource -t 的输出里应该能看到 asm、ora.asm、ora.LISTENER.lsnr 等资源的 online 状态。asmca 的 -silent -listDiskGroups 会列出磁盘组名称和状态。asmcmd ls 则能直接看到 DATA、FRA 两个挂载点是否正常。

如果看到磁盘组是 DISMOUNTED 状态,可以手动挂载:

asmcmd mount DATA asmcmd ls -l DATA

挂载后检查磁盘组的冗余状态和可用空间。注意 ASM 实例和数据库实例一样,也会消耗内存和 CPU,16G 内存下 GI 大约占 1G 左右,数据库 SGA 分配时要把这部分预留出来。我在分配 memory_target 时一般只用到物理内存的 50% 左右,给 ASM 和操作系统留足余量,避免容器内部出现内存交换导致 SQL 性能抖动。

4. 安装 Oracle 19c 数据库软件

GI 就绪后,数据库软件的安装相对简单,因为数据库本身不依赖 ASM 之外的复杂资源。但有两点容易忽视:一是 ORACLE_HOME 的路径必须和 grid 用户的 ORACLE_HOME 区分开,二是在安装过程中选择 ASM 存储而不是文件系统。在响应文件里,存储类型参数一旦指定为 ASM,安装程序就会校验 ASM 磁盘组是否可用,这一步如果 GRID 没配置好,会直接中止。

4.1 图形化方式运行 runInstaller

切换到 oracle 用户,进入 database 目录:

su - oracle cd /tmp/oracle19c/database ./runInstaller

向导有几步比较关键:

  1. 选择“Create and configure a single instance database”还是“Set Up Software Only”。我第一次装时图省事选了第一项,向导自动帮我把数据库也建了,但后面 DBCA 的很多参数就无法细调。建议选 Set Up Software Only,单独用 DBCA 建库,这样对初始化参数的控制更精细。

  2. Database Edition 选 Enterprise Edition。如果只做简单用途,Standard Edition 也行,但 19c 的很多高级特性在 SE 里不可用,生产环境直接选 EE。

  3. 到“Database Options”时,Oracle 会列出一堆组件,比如 Oracle Text、Oracle Spatial 等。用不到的组件千万别勾,每勾一个都会增加占用空间和后续打补丁的面积。基础选项里 Oracle Partitioning 建议保留,很多表分区功能依赖它。

  4. 安装位置选择时,ORACLE_BASE 用 /u01/app/oracle,ORACLE_HOME 用 /u01/app/oracle/product/19.0.0/dbhome_1。和 grid 的目录彻底分开。

  5. 到“Create Inventory”时,oraInventory 目录路径保持 /u01/app/oraInventory,同时会要求选择 oinstall 组作为 Inventory 所有者。这一步和 GI 安装时一致,因为同一台机器上所有 Oracle 产品的 Inventory 是共用的。

  6. 最后同样会出现“Execute Configuration Scripts”窗口,用 root 执行 dbhome_1 目录下的 root.sh。

图形化安装本质上是在帮你拼接命令行参数,所以我后面写响应文件时,会把图形向导里对应的每个选项说出来,这样你对照起来会非常直观。

4.2 静默方式运行 runInstaller

数据库软件的静默安装需要修改 db_install.rsp 响应文件。典型配置:

oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0 oracle.install.option=INSTALL_DB_SWONLY ORACLE_BASE=/u01/app/oracle ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 oracle.install.db.InstallEdition=EE oracle.install.db.OSDBA_GROUP=dba oracle.install.db.OSOPER_GROUP=oper oracle.install.db.OSBACKUPDBA_GROUP=backupdba oracle.install.db.OSDGDBA_GROUP=dba oracle.install.db.OSKMDBA_GROUP=dba oracle.install.db.OSRACDBA_GROUP=racdba oracle.install.db.rootconfig.executeRootScript=false

执行静默安装:

su - oracle cd /tmp/oracle19c/database ./runInstaller -silent -responseFile /tmp/db_install.rsp -ignorePrereq

用 -ignorePrereq 要谨慎,它表示跳过预检查。如果事先确认系统参数都OK,加这个参数能省去一些无关紧要的警告;但如果系统确实有问题,比如内存不足、内核参数不对,跳过检查后安装虽然能走下去,后面启动实例时会炸。我倾向于先不加,等预检查通过再正式安装。

静默安装完成后,记得用 root 执行 $ORACLE_HOME 下的 root.sh。数据库软件的 root.sh 不像 GI 的 root.sh 那样耗时,主要配置 /etc/oratab 和监听器运行环境,执行完确认没有报错即可。

4.3 Oracle Home 环境变量配置

安装完数据库软件后,要给 oracle 用户配置正确的环境变量。编辑 /home/oracle/.bash_profile,加入:

export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 export ORACLE_SID=ORCL export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

注意 ORACLE_SID 是你打算创建的实例名。环境变量配错最常见的问题是 sqlplus 提示找不到命令,或者 sqlplus / as sysdba 连不上,因为默认按当前系统的 ORACLE_SID 去找实例。我建议把 PATH 和 LD_LIBRARY_PATH 都写进配置文件,避免不同用户之间环境互相污染。每次新开终端后 source 一下,或者重新登录,确保环境生效。

数据库软件安装完成后,顺手升级一下 OPatch 工具。从网上下载 p6880880 补丁包后,备份原 OPatch 目录,然后解压覆盖:

cd /u01/app/oracle/product/19.0.0/dbhome_1 mv OPatch OPatch.bak unzip /tmp/p6880880_190000_Linux-x86-64.zip chown -R oracle:oinstall OPatch

升级 OPatch 的意义在于,后续打数据库补丁(比如 RU 补丁)时,低版本的 opatch 工具可能无法识别新格式的补丁,导致补丁应用失败。这一步虽然不起眼,却是后期维护里最容易踩的坑。

5. 使用 DBCA 建库与初始化参数调优

数据库软件装好后,实例还没有创建。DBCA 是建库的标准工具,同样支持图形和静默两种方式。ASM 存储模式下,DBCA 会直接把数据文件、控制文件、REDO 日志放到指定的 ASM 磁盘组中,你不需要关心具体路径,只需要指定磁盘组名称。

5.1 图形化方式使用 DBCA 建库

切换到 oracle 用户,执行:

su - oracle dbca

DBCA 向导关键步骤:

  1. 选择“Create a database”。 注意 19c 的 DBCA 默认模板是“Create a database with default configuration”,如果你需要精细控制,建议选“Advanced Configuration”。这样能自定义内存、字符集、网络配置等。

  2. Storage Type 选择“Oracle Automatic Storage Management(ASM)”。此时 DBCA 会要求选择磁盘组 DATA 和 FRA。如果下拉框里没有 FRA,先确认 GI 安装阶段是否创建了 FRA 磁盘组,没有的话回到 asmca 里补建。

  3. 内存配置。建议勾选“Automatic Memory Management(AMM)”,设置 memory_target。单实例环境 AMM 比较省心,但要注意 ASM 实例已经占用了部分内存,memory_target 不要超过物理内存的 55%。

  4. 字符集选择。国内业务库一般选 AL32UTF8。字符集选错了后期很难改,我见过有项目先用 ZHS16GBK 建库,后来要国际化,迁移字符集花了一个月。如果你不确定,直接选 AL32UTF8,兼容性最好。

  5. 归档模式。生产库强烈建议开 ARCHIVELOG,并把快速恢复区指定到 FRA 磁盘组。开归档后如果 FRA 空间不够,告警日志会疯狂报警,所以 FRA 的大小建议不少于数据文件总大小的 1.5 倍。

5.2 静默方式使用 DBCA 建库

批量建库时,DBCA 的静默命令是最高效的方式。一条命令把库建起来:

dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl \ -sid orcl \ -sysPassword YourSysPass \ -systemPassword YourSystemPass \ -emConfiguration NONE \ -storageType ASM \ -diskGroupName DATA \ -recoveryAreaName FRA \ -recoveryAreaSize 8192 \ -datafileJarLocation /u01/app/oracle/product/19.0.0/dbhome_1/assistedb/templates \ -characterSet AL32UTF8 \ -totalMemory 4096

参数含义:

  • -templateName 指定建库模板。General_Purpose.dbc 是通用模板,适合大多数业务场景。
  • -storageType ASM 指定存储类型为 ASM。
  • -diskGroupName DATA 指定数据文件所在磁盘组。
  • -recoveryAreaName FRA 指定快速恢复区磁盘组。
  • -recoveryAreaSize 单位是 MB,这里 8192 表示 8G。
  • -totalMemory 指定分配给数据库的总内存,单位 MB,这里 4096 表示 4G。

执行完 DBCA 静默建库后,输出会显示数据库 SID、数据库文件位置等信息。之后用 sqlplus 验证:

sqlplus / as sysdba SQL> select name, open_mode from v$database;

如果 open_mode 是 READ WRITE,说明库已经正常打开。

5.3 初始化参数调整建议

建库完成后,根据实际场景对初始化参数做一轮调优。我用 16G 内存环境,实际调整过的参数如下:

  • memory_target:设为物理内存的 50% 左右,例如 8G。如果系统分配的 shared pool 或 buffer cache 出现 ORA-4031 错误,说明 memory_target 相对 SGA 组件需求偏小。
  • processes:默认值 300,对于生产库,建议提高到 600~1000。主要是避免并发会话增加时连接数限制导致应用报 ORA-12545。
  • sessions:一般自动推导,但要保证大于 processes 的 1.1 倍。
  • db_block_size:默认 8192 字节,不要随便改,这是建库时确定的。
  • compatible:默认 19.0.0,保持默认即可。
  • open_cursors:默认 300,ORM 框架加连接池后,光标数容易涨高,建议 1000 起步。
  • audit_trail:如果是生产环境,建议设为 DB,集中审计关键操作。
  • db_recovery_file_dest_size:这个参数会覆盖 FRA 的大小,需要和 DBCA 里设的保持一致,否则告警日志会一直提醒。

在 ASM 模式下,还有几个和 ASM 相关的隐含参数需要注意。asm_power_limit 控制 rebalance 的力度,默认 1,表示低优先级。如果你在扩盘或缩盘时希望快速完成,可以临时调高到 4,但要注意这会占用较多的 ASM 实例 CPU。asm_diskstring 控制 ASM 扫描磁盘的范围,默认是 /dev/sd*,如果你新增磁盘时设备名变了,要确保它仍然匹配。

6. 常见问题与故障排查实录

说句实在话,我在部署这套 ASM 环境时踩过的坑,比某些安装文档里的“注意事项”加起来还多。这里挑最有代表性的几个记录一下,一定能帮你省下不少排查时间。

6.1 ASM 磁盘无法被识别的排查步骤

现象:GI 安装向导里看不到已经准备好的磁盘,或者在 asmca 里创建磁盘组时报 ORA-15018。

排查顺序:

  1. 先确认 udev 规则生效。命令 ls -l /dev/sdb1,看属主是否 grid、组是否 asmadmin。如果权限没生效,先重载 udev 规则:udevadm control --reload-rules && udevadm trigger。

  2. 再确认磁盘分区表里是否有 ASM 标识。使用 asmcmd 或 oracleasm listdisks 检查。如果用 udev 规则固定了设备,但没有给分区打 ASM 标签,ASM 依然不认。解决办法是用 /sbin/parted 把磁盘标记为 ASM 分区类型,或者在 udev 规则里配合使用 ENV{ID_FS_TYPE}=="asm" 进行筛选。

  3. 检查 diskDiscoveryString 参数。ASM 的扫描字符串如果不匹配,即便设备权限正确,ASM 也扫描不到。静默安装里最容易漏的就是这个参数。

  4. 查看 ASM 告警日志。在 grid 用户下用 asmcmd showparm 查看 discovery string,再看 /u01/app/grid/diag/asm/+asm 下的 alert.log。日志里通常会明确告诉你“no disks found”或者“disk 'xxx' is corrupt”。

我遇到过一次特别隐蔽的问题:磁盘设备名是 /dev/sdb1,但 udev 规则里的 ID_SERIAL 取了两次,一次是磁盘整体的序列号,一次是分区序列号,两者不一致,导致规则一直没有生效。排查时先用 udevadm info 把设备的所有属性打出来,确认到底拿哪个属性做匹配,再写规则,不要凭感觉。

6.2 权限与组映射验证失败

GI 安装后期,经常报“OSDBA、OSOPER、OSASM group verification failed”。这个错误本质上是安装程序在检查操作系统组是否合法。解决办法是回到 /etc/group 文件,确认 oinstall、dba、asmdba、asmadmin、asmoper 等组都存在,并且 grid、oracle 两个用户的附属组关系正确。

我在生产部署时习惯在安装前写一个小脚本自检:

for g in oinstall dba oper asmdba asmadmin asmoper; do grep "$g" /etc/group || echo "missing group: $g" done id grid id oracle

这样能在安装程序报错前就把问题暴露出来。如果发现 grid 用户没加入 asmadmin 组,安装程序会持续报权限问题,而且不容易看出是组的问题还是磁盘权限的问题。

另一个类似的问题是 root.sh 执行时报“Failed to start CRS”。我在一台虚拟机上遇到过,原因是 /etc/hosts 里主机名解析到了 127.0.0.1。GI 的集群资源要求使用非回环地址来通信,主机名解析指向 loopback 会导致 OHASD 无法启动。处理方式是把 /etc/hosts 里主机名对应的 IP 改成实际网卡 IP,然后重新执行 root.sh。

6.3 静默安装响应文件常见的报错

静默安装报错信息往往很“官方”,看不出来哪里错,但日志文件里有全部线索。常见的几个错误如下:

报错信息原因处理方式
PRVG-0282: could not open the clusterware registry响应文件里 INVENTORY_LOCATION 路径权限不对检查 /u01/app/oraInventory 属主,或重新指定路径
PRCR-1079: Failed to start resource ora.asmASM 磁盘组不在线,或主机名解析问题用 crsctl stat resource -t 查看 ora.asm 状态,查看 /var/log/messages
ORA-15018: diskgroup cannot be createdASM 磁盘没打标识,或磁盘发现字符串不对按 6.1 的排查步骤处理
INST-0056: invalid value for parameter ORACLE_BASE响应文件里 ORACLE_BASE 路径有误确认 /u01/app/oracle 目录存在且属主正确

静默安装时要养成的习惯是:装完先看日志,不急着重跑。日志里第一条真正的错误信息往往藏在中间,而不是最后。用 tail 命令直接翻最后的几百行,可能全是后续错误导致的连锁反应,往前翻才能找到根因。我一般用 grep 过滤关键词:grep -E "ERROR|FATAL|PRVG|ORA-" /u01/app/oraInventory/logs/gridInstall/*.

补充一点,静默安装失败后如果想重跑,一定要先清理残留文件。之前安装写入了 inventory 的记录,重跑时程序可能以为软件已装过而中止。处理方式是把 /u01/app/oraInventory 下的 ContentsXML 里相关行删掉,或者干脆把 inventory 目录暂时移走重建。但移动 inventory 目录会影响已有的 GI 资源,所以生产环境重跑安装前最好备份全套配置。

6.4 启动顺序与日常运维注意事项

单实例 ASM 环境下,数据库、监听器、ASM 实例的启动顺序是:先启动 ASM 实例,再启动数据库实例,监听器可以并行。Oracle Restart 模式下,OHASD 会管理这些依赖,命令行习惯用 crsctl 控制。手动启动时注意:

# 以 grid 用户启动 ASM 实例 srvctl start asm # 以 oracle 用户启动数据库 srvctl start database -d orcl

用 srvctl 启动比直接用 sqlplus 启动更稳妥,因为它会维护资源依赖关系。如果你图省事直接 sqlplus startup,ASM 实例没起的情况下数据库是起不来的,报错 ORA-01078 或者 ORA-15077。日常运维建议安装完成后顺手把 srvctl 的自启动打开:

crsctl enable crs systemctl enable ohasd

服务器重启后,OHASD 会自动拉起 ASM 和数据库,省去人工介入。这个特性是单实例 ASM 部署中一个很大的便利,也是我推荐用它替代文件系统存储的重要原因。

我在实际部署过程中还发现,DBCA 建库后如果开了归档模式,但 FRA 空间分配不足,一周后告警日志就会开始刷“ARCHIVED LOG”相关的空间告警。处理方式有两个:一是把归档日志定期备份到外部存储后手动删除,二是扩大 FRA 磁盘组容量。ASM 下扩容量很简单,往磁盘组里加一块新盘后执行 ALTER DISKGROUP FRA ADD DISK '/dev/sdd';,ASM 会自动 rebalance。这也是我坚持在这一层使用 ASM 的另一个原因:容量调整基本可以做到在线完成。

最后还有一个小技巧:安装完成之后,把所有部署过程中用到的响应文件、udev 规则、内核参数变更统一保存到一台配置管理机器上。以后不管是新增节点还是重建环境,直接复用即可。我一般会把每个环境的 install_config.zip 归档,内容包括 /etc/sysctl.conf 的 Oracle 部分、udev 规则、grid 和 db 的响应文件、以及各用户的 .bash_profile 模板。这样再部署时,半小时就能把一套单实例 ASM 环境打出来,剩下的只是等待脚本跑完。

从个人经验来看,单实例 ASM 部署的难点从来不在于“敲命令”,而在于理解每一层组件为什么需要这样配置。你只要把 GI、ASM、数据库软件、DBCA 这四个环节的边界搞清楚,再配合响应文件做模板化,后续维护会轻松非常多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 6:59:19

iOS高效导出Excel:libxlsxwriter集成与实战指南

写 Excel 导出这件事,iOS 开发者迟早都会遇到。运营要一份用户数据、财务要月度报表、销售要客户台账,到了移动端就变成"能不能直接生成一个 .xlsx 发出去"。我最早用 CSV 糊弄过几次,后来发现根本不是那么回事,直到换到…

作者头像 李华
网站建设 2026/10/17 6:59:04

整站下载器实战:小飞兔10.0快速完成网站镜像与仿站交付

简介:小飞兔下载10.0是一款面向网页设计师、开发者和数据抓取人员的整站下载工具压缩包,用于快速抓取并备份完整网站内容。压缩包共25个文件,包含20个DLL组件、3个EXE启动程序、1个config配置文件及1个HTML使用说明,整体仅1.19MB。…

作者头像 李华
网站建设 2026/10/17 6:58:04

YOLOv5+ArcFace端到端人脸识别实战

简介:本资源是一个基于YOLOv5与ArcFace双模型协同的人脸识别完整项目实现,面向深度学习初学者、计算机视觉开发者及AI安防应用实践者,解决端到端人脸检测身份识别的一体化建模问题,适用于门禁系统、考勤管理、监控分析等实际场景。…

作者头像 李华
网站建设 2026/10/17 6:57:29

C#登录界面源码解析:WinForm无边框圆角渐变与验证码实现

简介:这是一份面向C#初学者与桌面应用开发者的登录界面源码示例,基于.NET平台,采用Windows Forms或WPF实现,帮助解决GUI入门阶段界面设计与交互逻辑无从下手的问题。压缩包共42个文件,约2.06MB,包含6个cs源…

作者头像 李华
网站建设 2026/10/17 6:57:29

旋转位置编码RoPE原理详解:从Transformer位置编码缺陷到Llama2实现

搞大模型训练的人,应该都遇到过这样的问题:同样一段文本,把词的顺序调换一下,模型算出来的注意力分布就完全变样了。Transformer结构本身没有时序概念,全靠外部注入位置信息才能感知“谁先谁后”。而Llama2里用得最顺手…

作者头像 李华
网站建设 2026/10/17 6:57:09

GitHack-master原理与实战:从HTTP泄露中还原Git源码

简介:GitHack-master是一款面向安全研究人员与开发者的Git源码泄露检测与利用工具,专用于发现并分析Web服务器意外暴露的.git目录,防范历史代码、敏感凭证等关键信息泄露风险。资源共14个文件,以10个Python脚本为核心(…

作者头像 李华