Linux下Oracle 19c + ASM生产环境数据库部署实战指南

Oracle 19cASMLinux 本内容遵循CC 4.0 BY-SA版权协议
光启元 光启元 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要

生产环境的数据库部署,历来是运维和 DBA 团队最谨慎的活儿之一。我自己在多个项目中先后把不同版本的 Oracle 数据库搬到 Linux 平台上,最近两三年主力使用的组合就是 Linux + Oracle 19c + ASM。这篇内容来自我实际整理的部署实施记录,也算是一个偏实战的系列笔记。不打算复读官方安装文档,而是把选型逻辑、环境准备、GI 安装、ASM 磁盘组规划、建库过程和项目上线中的真实踩坑一次性理清楚。

先给结论:生产环境选 Oracle 19c,核心原因是它的支持周期长、稳定性验证充分;再叠加 ASM 作为统一的存储管理组件,把多块磁盘组成磁盘组自动管理,省去后续维护数据文件路径的麻烦。无论你是在筹备新项目落地,还是想把旧库迁移到新 Linux 服务器,这套流程都可以直接拿来做参照。适合读者主要是系统管理员、数据库运维和负责基础设施交付的工程师,涵盖从平台搭建到项目切换上线的完整链路。

1. 生产环境方案选型:为什么是 Linux + Oracle 19c + ASM

1.1 Oracle 19c 的版本定位与选型逻辑

Oracle 19c 本质上就是 12.2.0.3,属于 12c 家族的收官版本。Oracle 产品线里有 18c、19c、20c、21c 和后续的 23ai 这些版本,但生产环境不能只看新版本功能多不多,更要看支持的持久性和社区踩坑的充分度。从这些年的运维反馈来看,19c 是各方验证最全面、坑相对最少的一个版本。

另外,19c 默认推荐使用容器数据库架构,也就是 CDB 加 PDB 的模式。一个实例内可以挂载多个可插拔数据库,业务部门多、环境数量多的场景下特别合适,部署一套数据库就能承载多个独立业务,资源隔离度比单实例多 Schema 要好,管理成本比部署多个实例要低。非容器数据库架构在 19c 里依然保留,但 Oracle 官方已经明确不推荐在新项目中使用,这个趋势做选型时要心里有数。

安装配置前还有一件事要想清楚:数据库用单机还是 RAC。如果业务还处在发展期,预算有限,单机 ASM 已经能满足绝大多数场景,后续如果要升级,RAC 的扩展路径也顺畅。数据安全主要靠备份和 Data Guard,而不是靠 RAC。关于这一点我的建议很直接:不要把高可用混同于负载均衡,选 RAC 前先确认业务的负载增长曲线和预算投入,否则单机加 DG 明显更划算。

1.2 ASM 在数据库存储环节的真实作用

ASM 全称是 Automatic Storage Management,Oracle 自家的卷管理器和文件系统。传统部署方式里,数据库文件要么放在普通文件系统,要么用 LVM 逻辑卷,管理员要手动规划目录、做软链接,还要担心磁盘空间分配不合理带来的 IO 不均。ASM 解决了这个问题:把多块物理盘统一加入一个磁盘组,数据文件自动均匀分布在磁盘组内,从数据库侧看,文件路径变成了 +DATA 这种 ASM 路径,底层落到哪块盘、怎么分散 IO,都由 ASM 自动完成。

用生活化的比喻,普通文件系统像一个手动仓库,得自己决定每箱货放哪个货架、担心某个货架空间不够;ASM 则是一个智能仓储系统,货物进来它会自动选择空闲位置并尽量让各个货架负载均衡。数据库文件的 IO 分布对性能影响极大,ASM 在这方面省掉了大量手工调优工作。

在单机生产环境里,ASM 的另一个好处是磁盘热扩展方便。数据库运行一段时间后磁盘空间不够,普通文件系统要么挂新盘、扩逻辑卷,再改数据文件路径,麻烦且容易出错;ASM 只要把新盘加入磁盘组,空间自动纳入可分配范围,不需要中断数据库。项目实战中这个特性救过我好几次,扩容时间从小时级压缩到分钟级。

1.3 生产环境架构规划的先后顺序

很多新手一上来就拷安装包、解压软件、跑安装向导,结果装到一半发现磁盘组没规划、目录空间不够、主机名解析有问题,又得重来。我习惯的步骤是先做架构规划,再动任何安装动作。

第一步是定架构形态,明确单机还是 RAC、是否搭配 Data Guard 备用库、ASM 磁盘组怎么拆。第二步是定存储方案,本地盘、外置存储还是云盘,是否用多路径软件。第三步是定目录规范,比如 /u01 分区大小、GI 软件目录、数据库软件目录各自放哪里,这些先写进设计文档。第四步才进入实际操作。

磁盘组规划上,我的经验是至少拆成两个组:DATA 放数据文件、临时文件、控制文件,FRA 放归档日志、闪回日志和 RMAN 备份集。有些人图省事把所有东西放一个组,一旦归档写得猛把空间填满,数据库直接挂起,这种事故我在不少客户现场见过。生产环境必须把数据路径和备份/归档路径隔离,这是底线原则。

2. 环境准备与底层配置:把地基打牢

2.1 操作系统层面的核心参数调整

Linux 环境安装 Oracle 19c 前,最容易被忽略的是内核参数调整。Oracle 安装在系统层面会做很多预检查,参数不合适直接报错。我在生产环境常用的一组 sysctl.conf 配置如下,注意具体数值要结合物理内存大小调整。

BASH
# /etc/sysctl.conf 关键参数
kernel.semmsl = 250
kernel.semmns = 32000
kernel.semopm = 100
kernel.semmni = 128
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.shmmni = 4096
fs.file-max = 6815744
fs.aio-max-nr = 1048576
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
vm.swappiness = 10
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80

信号量参数控制并发进程数量,共享内存参数直接关系到 SGA 是不是能分配成功。vm.swappiness 调低是为了避免生产数据库服务器发生过早使用 swap 的情况,这一点在数据库负载高时特别重要。改完 sysctl.conf 后执行 sysctl -p 让参数即时生效,再用 sysctl -a 抽查几个关键项确认没问题。

同属系统层的还有 limits.conf,这组参数控制的是 oracle 和 grid 用户能打开的文件数、进程数和可锁定内存大小。我的实践配置如下:

BASH
# /etc/security/limits.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
grid soft memlock 3145728
grid hard memlock 3145728
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle soft memlock 3145728
oracle hard memlock 3145728

memlock 是特别容易忽略的一项,数据库启用大页或者 ASMM 自动内存管理时,如果 memlock 不够,启动阶段可能报内存分配失败的错。生产环境建议把 memlock 设置成物理内存的 60% 以上,具体数值以部署前实测为准。配套的还有 pam_limits.so 是否被加载,有些精简安装的系统默认没启用这个模块,导致 limits.conf 不生效,排查起来很隐蔽。

2.2 用户、组、目录结构与安装介质准备

数据库软件在生产环境建议用独立用户运行,不要直接用 root 干活。常规拆分是创建 grid 用户负责 Grid Infrastructure 和 ASM,oracle 用户负责数据库软件和实例。相关用户组要一起建好,主要是 oinstall、dba、asmadmin、asmdba、asmoper 这五个。

BASH
groupadd oinstall
groupadd dba
groupadd asmadmin
groupadd asmdba
groupadd asmoper
useradd -g oinstall -G dba,asmdba,asmadmin grid
useradd -g oinstall -G dba,asmdba,asmoper oracle

用户建好后规划软件目录,我通常单独划一个 /u01 分区,空间大小按 200GB 起步,然后把软件全部放在 /u01/app 下。grid 用户的 GI 软件放 /u01/app/grid_home,oracle 用户的数据库软件放 /u01/app/oracle_home,Inventroy 目录用 /u01/app/oraInventory。目录创建好之后要 chown 到对应用户和组,权限别随意放大,生产环境尤其注意不要把所有目录都 chmod 777。

安装介质建议提前准备好一份放在本地镜像仓库,避免安装时临时找包。Oracle 19c 的 GI 软件包和 DB 软件包都从官方渠道下载,文件较大,下载后做校验,避免压缩包不完整导致解压或安装时出现奇怪的报错。解压时先解压到一个临时目录,再移动到最终安装路径,注意解压后文件属主要改成对应用户,否则安装向导写文件会权限报错。

2.3 国产化环境与部署形态补充

最近两年我在国产化交付项目里也做了不少 Oracle 19c 单机环境的搭建,麒麟 v10 这类基于 openEuler/CentOS 生态的操作系统部署 19c 的需求明显上升。这里补充几个和生产环境强相关的注意点。

依赖包补齐是最常见的问题。国产化环境通常没有外网,直接用系统自带 yum 源很可能缺 libaio、elfutils-libelf-devel、compat-libcap1 这些包。我一般会提前准备一份依赖 RPM 包列表,放到内网软件仓库,安装前统一批量安装。另一个需要注意的是 oracleasm 内核模块,在麒麟或 openEuler 这类系统上不一定有对应内核版本的 ASMLIB,与其折腾内核模块,不如直接用 udev 固定磁盘别名,更稳也更通用。

图形安装界面在国产化服务器上不一定有桌面环境,生产环境推荐直接走静默安装,把响应文件提前编辑好,一条命令跑到底。响应文件里的参数在图形界面能选的项,它全都能配置,只是对操作者的细致程度要求更高。后面章节我会结合具体命令说明。

3. Grid Infrastructure 安装与 ASM 实战

3.1 GI 安装的前置检查和安装流程

GI 全称 Grid Infrastructure,是 ASM 实例、监听器和集群文件等组件的基础服务。在单机环境里,它仍然会启动 OHASD、CRSD 等相关进程,负责 ASM 的启动和资源管理。

进入正式安装前,先跑一遍安装目录下的预检查脚本。这一步在生产环境不能省,它能提前暴露主机名解析问题、内存交换分区不足、依赖包缺失等风险。比如 19c 要求物理内存和 Swap 满足一定比例,一个常见阈值是物理内存大于 8GB 时 swap 建议至少 8GB,不够的话预检查会直接标红。

BASH
cd /u01/app/grid_home
./gridSetup.sh

图形界面弹出来后,我觉得几个关键选项需要写清楚。Configure Oracle Grid Infrastructure for a Standalone Server 是单机模式,RAC 场景才选 Oracle Real Application Clusters。配置 ASM 时选择磁盘组名称,设置 SYSASM 密码。接下来会扫描候选磁盘,要求磁盘已经提前绑定并授予 grid 用户组权限。后续步骤会提示执行 root 脚本,这一步必须在终端里以 root 用户执行,不能跳过。

root.sh 执行过程会启动一系列资源,出现卡顿是正常的,不要随便中断。执行完成后可以登回 grid 用户用命令检查资源状态:

BASH
su - grid
crsctl stat res -t

单机 GI 同样会生成 OCR 相关元数据和资源注册信息,只不过不像 RAC 那样需要独立的表决盘集群,安装向导一般会把相关元数据引导到一个 ASM 磁盘组中。如果不确定,默认选择安装向导提示的位置即可。

3.2 用 udev 绑盘与 ASM 磁盘组创建

ASM 能识别的磁盘必须具备稳定可靠的设备名。直接使用 /dev/sdb 这种名称风险很大,重启后盘符可能漂移,ASM 会找不到磁盘组导致数据库起不来。生产环境我强烈建议用 udev 规则固定磁盘别名。

以 4 块 SSD 为例,先通过 lsblk 查看磁盘信息,然后用磁盘的 ID 或者 size + 序列号生成 udev 规则。下面是一个典型的 udev 规则写法:

BASH
# /etc/udev/rules.d/99-oracle-asm.rules
KERNEL=="sd*", SUBSYSTEM=="block", ATTR{size}=="17581844480", OWNER="grid", GROUP="asmadmin", MODE="0660"

这里 ATTR{size} 的单位是 512 字节块,要用 fdisk -l 查到的实际块数填写。规则写好后执行 udevadm control --reload 和 udevadm trigger 让规则生效,再检查 /dev 下对应的设备文件属主是否被正确修改。这一步做完,ASM 磁盘组创建前的重要条件就齐了。

创建 ASM 磁盘组有两个常用入口。一个是图形化的 asmca,适合交互式操作;另一个是 SQL*Plus 里以 sysasm 身份执行命令。生产环境我更习惯用命令方式,方便记录到操作文档里。

SQL
CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/asm-disks/asm-data1' NAME DATA1;

常见冗余级别有三种:EXTERNAL 表示没有冗余,完全依赖底层存储本身;NORMAL 代表两路镜像,至少需要两块盘;HIGH 是三路镜像。生产环境如果底层存储已经做了 RAID,通常选 EXTERNAL 降低成本;如果底层是普通盘没有冗余,选 NORMAL。真实项目里很多事故都是冗余级别选错导致空间开销超出预期,这个决策要提前拍板。

3.3 ASM 日常运维与常用命令

安装部署完成后,日常维护 ASM 最常碰到的就是进入命令环境的姿势。很多新手分不清 asmcmd 和 sqlplus 的差异,这里列一下两种入口。

BASH
# 以 grid 用户进入 ASM 文件系统命令行
su - grid
asmcmd
lsdg
lsdsk
lsct
 
# 以 sysasm 身份进入 ASM 实例的 SQL*Plus
sqlplus / as sysasm

asmcmd 的 lsdg 能看磁盘组总空间、可用空间和冗余状态,lsdsk 能看底层磁盘的归属情况。SQL*Plus 里则更适合执行创建磁盘组、查看 ASM 实例参数等管理操作。日常巡检时,我会同时看 v$asm_diskgroup 和 v$asm_disk 两张视图,确认磁盘组的 USABLE_FILE_MB 是否充足。

在线扩容磁盘组的命令在生产中很常用,比如给 DATA 组加入一块新盘:

SQL
ALTER DISKGROUP DATA ADD DISK '/dev/asm-disks/asm-data5';

执行后 ASM 会自动做 rebalance,把已用数据分布到新盘上。rebalance 是异步的,可以通过 v$asm_operation 查看进度。这个特性在实际项目中相当实用,扩容时看到新盘空间被识别,过一段时间再查,空间已经释放到可用值。停车维护的时间完全省掉了。

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

4.1 数据库软件安装与 root.sh 执行

GI 安装成功后,接下来装 Oracle 数据库软件。以 oracle 用户解压 DB 安装包到 /u01/app/oracle_home,然后运行 runInstaller。

生产环境我一般选择“仅安装数据库软件”,不勾选“安装并创建数据库”,原因很简单:软件安装是一个相对独立的过程,建库则涉及表空间、字符集、归档策略等一堆业务相关决策,分开做更清晰,排除故障时也更容易定位。

BASH
cd /u01/app/oracle_home
./runInstaller

安装向导的步骤不多,重点检查 Base 目录设置、软件语言是否包含简体中文、数据库版本是否为 Enterprise Edition。安装过程同样会在接近结束时让你以 root 执行 root.sh,这个脚本会给集群资源注册数据库软件信息。如果执行 root.sh 中途报错,不要重复执行,先去看日志确认错误原因,很多资源竞争类问题强行重跑会留下脏数据。

软件装完可以用 sqlplus -v 验证版本,能看到 19c 的版本号说明安装成功。生产环境多版本并存的机器上,还有一步很容易漏掉:确认 PATH 和 ORACLE_HOME 的关联正确,避免写自动化脚本时调用到错误版本。

4.2 使用 DBCA 创建容器数据库

数据库软件就绪后,我习惯用 DBCA 的静默模式建库。命令行的好处是可以把所有参数写进文件,可重复执行,也方便记录到变更单里。下面是一个生产环境用的建库命令示例:

BASH
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-sid PROD \
-gdbName PROD \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName PDBPROD \
-sysPassword "Sys_password_2024" \
-systemPassword "System_password_2024" \
-storageType ASM \
-diskGroupName DATA \
-recoveryAreaDestination FRA \
-recoveryAreaSize 200 \
-characterset AL32UTF8 \
-nationalCharacterSet AL16UTF16 \
-memoryPercentage 40 \
-autoManageMemoryMgmt true

这里把数据库建在 +DATA 磁盘组,使用 FRA 作为快速恢复区,字符集选择 AL32UTF8。生产库的字符集必须在建库前想清楚,一旦有业务数据写入,字符集再迁移会非常痛苦。PDB 的密码强度也值得注意,生产环境不要偷懒用太简单的口令,否则后续安全基线检查很难过。

建库完成后用 sqlplus 登录验证:sqlplus / as sysdba,然后检查实例状态、PDB 是否自动启动。默认建好的 PDB 需要确认容器实例是否设置 PDB 随 CDB 自动打开,如果不设置,主机重启后 PDB 是关闭状态,应用连接就会报错。生产库我一般都会执行一条命令:

SQL
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE ALL SAVE STATE;

4.3 生产环境初始化参数与建库后立即要做的事

生产库刚建成时只是“裸库”状态,离真正可用还有一段距离。我每次拿到新建的 19c 数据库,第一件事就是做基础参数与安全加固。

归档模式是生产库的必选项。没有归档就没有 point-in-time 恢复,数据库一旦在某个时间点损坏,只能恢复到全备时间,业务数据损失不可接受。

SQL
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
ALTER DATABASE FORCE LOGGING;

开启归档时同步设置 FRA 的归档目标:DB_RECOVERY_FILE_DEST 指向 +FRA。闪回功能建议一并开启,闪回保留时间按业务恢复目标设置,一般填 1440 分钟即一天。闪回并不是替代备份,但它能快速处理逻辑误操作,业务方误删数据时的恢复速度远快于从备份集 restore。

参数方面,19c 默认启用了自动内存管理,但如果物理内存有限,我更倾向于手动分配 SGA 和 PGA。比如 64GB 内存的服务器,SGA 给 24GB、PGA 给 8GB,剩下的留给操作系统和文件缓存。具体数值要看业务并发和数据量,没有统一答案,关键是别让数据库把物理内存吃得太满,否则主机层面会出现 swap 波动。

安全加固条目包括:锁定不用的内置账号、修改默认用户口令、开启审计但限制审计保留时间、关闭没用的数据库组件。内置样本用户如果不需要,直接 drop 掉,避免成为安全隐患。

5. 项目实战:从部署到上线的一整套动作

5.1 一套典型生产业务的部署日志

拿一个真实项目举例,业务方是一家制造企业的财务系统迁移,原库跑在老旧单机上,数据量约 800GB,并发峰值 300 左右。新环境硬件配置是双路处理器、128GB 内存、4 块 960GB SSD,操作系统使用 Linux。磁盘组规划为 DATA 组约 1.8TB,FRA 组约 900GB。

第一天做系统初始化和环境准备,包括内核参数、用户组、目录规划和 udev 绑盘,半天时间富余。第二天安装 GI 并创建 ASM 磁盘组。第三天安装数据库软件。第四天建库并着手导入数据。因为源端是 11g 环境,跨版本逻辑导出成了首选方案,expdp 全量导出加上 VERSION 参数控制兼容性。导入过程主要耗时在索引创建和统计信息收集,利用并行 hint 把时间控制在业务可接受的窗口内。

第五天进入上线切换。切换方案是:白天完成最后一次增量导出,晚上停业务,导入增量数据,核对行数和关键数据后,修改应用连接串指向新库,正式对外提供服务。整个切换过程预留了两小时的窗口,实际上 40 分钟完成了写操作,剩下的时间用来做功能和并发回归验证。

这个过程中回滚预案同样重要。我把旧环境保留了一周,没有立刻回收资源,万一新库出现重大性能问题或数据不一致,能够立即切回。事实证明这个做法虽然保守但很稳,尤其对业务连续性要求高的企业系统来说,回滚能力本身就是一种高可用保障。

5.2 备份与容灾策略落地

新库上线当天必须把备份挂上,不能等到出问题再补。我用的是一套基于 RMAN 的定时备份方案,核心思路是全备加增量归档备份结合。周日凌晨做 0 级全备,周一到周六每天做 1 级增量备份,归档日志每两小时备份一次,备份直接写入 FRA 磁盘组或外部 NAS 路径。

BASH
# /backup/scripts/rman_level0.sh
# !/bin/bash
export ORACLE_SID=PROD
export ORACLE_HOME=/u01/app/oracle_home
export PATH=$ORACLE_HOME/bin:$PATH
 
rman target / log=/backup/logs/rman_level0_$(date +%Y%m%d).log <<EOF
BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG DELETE INPUT;
DELETE NOPROMPT OBSOLETE;
CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
EOF

脚本里的 DELETE OBSOLETE 用于清理超出保留策略的旧备份,避免备份把磁盘撑满。生产环境里备份失败最常见的原因就是目标空间不足,所以每次备份完成后一定要检查备份日志,并且做一个恢复演练。不要等到数据库真坏了才发现某个月的备份根本恢复不了,这样的教训太贵了。

容灾层面,如果预算允许,给生产库配一个 Data Guard 物理备库是不错的选择。主营业务对 RPO 要求高的话,物理备库能做到秒级数据同步,主库故障切换速度相对可控。如果只是核心报表分析类场景,可以每周用 RMAN 做一致性备份恢复到测试环境,也能达到业务连续性要求。关键是容灾方案要和业务方明确恢复时间目标和数据丢失容忍度,这两个指标直接决定技术选型。

5.3 性能监控与隐患排查

数据库上线只是开始,上线后的第一周是最容易暴露性能问题的阶段。我通常在数据库运行平稳后开启 AWR 自动快照,每天保留快照,并每周生成一份 AWR 报告和一份 ADDM 分析报告。

生成 AWR 报告的命令很直接:

SQL
SQL> @?/rdbms/admin/awrrpt.sql

报告会给出负载概况、Top 等待事件、SQL 语句排名、IO 统计等关键指标。生产环境我最关心的几个点集中在:数据库时间分布是否集中在 DB CPU 和用户 IO;Top SQL 的物理读和逻辑读是否失衡;日志文件的写入延迟是否稳定。如果发现某类 SQL 的 CPU 消耗异常,基本能推断出执行计划问题或索引缺失,再配合执行计划做针对性优化。

19c 默认开启了自动维护任务,包括统计信息收集、自动 SQL 调优、空间顾问等。默认配置在大多数环境够用,但要留意统计信息收集窗口是否落在业务高峰段。如果业务是全天高并发,建议把维护窗口挪到凌晨低频段,并单独评估统计信息收集对生产的影响。

巡检脚本也是排查隐患的好帮手。我的巡检清单包括:数据库实例状态、监听状态、ASM 磁盘组空间、归档日志空间使用、SYSAUX 表空间占用、最近的告警日志错误、备份结果。每周巡检一次,把异常项记入运维台账,连续观察趋势比只看单日值更能发现问题。

6. 常见问题与排查技巧实录

6.1 安装部署阶段的高频报错

安装阶段是最容易让人心态崩溃的环节,这里整理一张生产中高频报错速查表,都是我在项目里实际遇到并解决过的。

报错信息 原因分析 解决办法
PRVF-0002 : could not retrieve local node name 主机名解析异常,/etc/hosts 未配置 FQDN 检查 hostname 与 /etc/hosts 对应关系,补全主机名解析
INS-32013 : Insufficient space 安装目录空间不足 提前规划 /u01 分区大小,预留 200GB 以上,检查 tmp 目录
PRCD-1035 : Failed to execute root script root.sh 执行前资源未完全就绪 查看 root.sh 日志,确认资源服务状态,通常重跑 root.sh 前先清理残留资源
CRS-5017 : The resource action failed ASM 实例启动异常 查 ASM 告警日志,确认磁盘组权限和磁盘设备是否被正确识别
ORA-15032 / ORA-15017 ASM 磁盘挂载失败 检查磁盘组状态、磁盘设备是否存在、udev 规则是否满足要求

这些报错对老手来说可能一眼看穿,但对第一次部署 19c 的人来说,最忌讳的是不看日志瞎猜。Oracle 的日志路径非常有规律:GI 日志在 $GRID_HOME/log,数据库告警日志在 $ORACLE_BASE/diag/rdbms。报错出现后先打开对应日志文件,搜 ORA- 或者 CRS- 关键字,大多数原因都能直接从日志里读出来。

另外还遇到过 /dev/oracleasm/disks 目录在重启后消失的情况,根因是 ASMLIB 未随系统启动加载或磁盘绑定规则没有生效。解决办法很直接:改成 udev 静态绑定,不依赖 ASMLIB 的自动加载机制,重启后设备名依旧稳定。

6.2 运维阶段容易踩的坑

运维阶段比安装阶段更考验人的是“表面正常但隐患很深”的问题。这里专门列两个生产中反复碰到的坑。

第一个是 SYSAUX 表空间膨胀。这个坑几乎每个 19c 环境都会遇到,网上搜索量也常年很高。SYSAUX 里主要塞了 AWR 历史快照、优化器统计信息历史、审计记录、自动维护任务的日志、SMO 管理信息等。如果放任不管,几个月后 SYSAUX 可能涨到几十 GB,而且单纯用表空间扩展压制根本不是办法。

排查思路是执行一条查询:

SQL
SELECT occupant_name, space_usage_kbytes
FROM v$sysaux_occupants
ORDER BY space_usage_kbytes DESC;

看到哪个组件占用最高就针对性清理。AWR 快照保留期太长的,用 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 缩短到 7-10 天;统计信息历史太长的,用 DBMS_STATS.PURGE_STATS 清理 15 天前的数据。生产环境建议把这些清理动作写进月度巡检,防止 SYSAUX 无声无息地变大。

第二个坑是主机重启后 ASM 实例自动启动但磁盘组挂载延迟。如果是 udev 绑定磁盘且开机服务依赖顺序正常,这个问题基本不会发生。但在 kvm 虚拟机场景里,有时候磁盘设备和 udev 规则的加载顺序不稳定,导致 ASM 启动时找不到设备,数据库起不来。解决方案是在 /etc/fstab 或 systemd 里增加延迟启动依赖,或者把磁盘绑定写成带重试机制的服务,等设备出现后再自动挂载磁盘组。

6.3 两个必须搞清楚的概念:跨版本恢复与 CDB/PDB

这个问题被问过太多次了:Oracle 19c 的备份文件能不能在 Oracle 11g 上恢复出来?答案是明确的,不能。RMAN 的备份集严格遵循版本兼容规则:低版本备份可以恢复到高版本实例,但高版本生成的备份集无法恢复到低版本。原因是数据文件的物理块格式、控制文件信息、恢复元数据在不同版本间存在差异,低版本软件不理解高版本生成的数据。

可行的迁移路径只有逻辑导出。用 expdp 从 19c 导出,导入 11g 时附加 VERSION 参数加以限制:

BASH
expdp directory=DUMP_DIR dumpfile=exp.dmp logfile=exp.log schemas=APP VERSION=11.2.0.4

但即便加了 VERSION 参数,如果库里的对象用了 19c 独有特性(比如某个高级压缩参数、新版本的数据类型),到 11g 导入阶段仍会失败。所以跨低版本迁移前,一定要先跑一遍完整的对象兼容性评估,不能在导出完成那一步就认为大功告成。

CDB/PDB 架构也需要澄清一个常见误解:PDB 不是传统意义上的独立数据库,它需要 CDB 根容器和底层实例做支撑。备份恢复时,19c 支持在 CDB 级别做全量备份,也支持针对单个 PDB 做备份恢复。这个特性让多业务整合场景的恢复显得非常灵活。如果计划做 PDB 级别的移植,还有另一个思路:利用 19c 的 PDB 拔出插入功能,把一个 PDB 从源 CDB 拔出,再插入目标 CDB,这在同版本环境里比传统迁移更高效。

我在实际生产环境中的体会是,数据库搭建这件事,难点经常不在那几步标准的安装动作,而在于装好之后很长一段时间里,你不知道哪些隐患会在哪天爆发。磁盘绑定稳不稳定、归档空间够不够、SYSAUX 会不会悄悄膨胀、备份恢复路径通不通,这些都需要在搭建期就养成规划和巡检的习惯。建议第一次做生产部署的工程师,把每一步操作都记录成标准文档,配上输出结果截图和参数解释,同时把备份恢复演练当作上线前的固定步骤,确保关键节点全部走通过。这套流程熟练之后,再遇到类似的数据库环境部署,基本就是一晚上加一上午的事。

相关推荐

基于Python+Open CV的手势识别算法设计

伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。

努力学习前端的小陈

ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像

ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)

Willis Wang

计算机视觉图像处理-CV2与图像插值算法

用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int

weixin_38697274

基于水平集CV模型的图像分割(Matlab代码)

基于水平集CV模型的图像分割(Matlab代码),全套代码

小宇QAQ

导向滤波(guide_filter)的python实现

导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

zachzhan_g
返回顶部
光启元
博客等级 码龄8年 35粉丝 2,033原创