Oracle 19c+ASM生产环境部署实战:从Linux裸机到业务可用

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

之前有个学员私下问我:为什么别人装 Oracle 19c 那么快,我照着 PDF 一步步点,装完用起来却老觉得不踏实?这个问题其实特别典型。装一套能用的数据库和装一套“敢上生产”的数据库,中间差的不是鼠标点击的熟练度,而是对 Linux 环境、对存储层、对 Oracle 体系结构的理解深度。

我这篇 FGMT03 讲的不是“怎么点下一步”,而是你动手装 Linux + Oracle 19c + ASM 之前必须先想清楚的那些事,以及从裸机到能跑业务的完整链路。全程按生产环境的规格来,不会给你那种装完就完事的“玩具实例”。这套流程我前前后后在虚拟机上验证过不下十遍,也在测试环境中模拟过生产压力,里面的坑基本都是我实际踩过的。

1. 为什么生产环境的Oracle 19c跑在ASM上才靠谱

1.1 普通文件系统装Oracle的最大隐患

很多人第一次接触 Oracle,是在 Windows 或者没有 ASM 的 Linux 上,数据文件放在 ext4/xfs 文件系统里。这种部署方式在开发和测试环境完全可以用,但它有两个在生产环境里很要命的短板。

第一,文件系统对数据库文件的 IO 路径多了一层。数据库进程发起的 IO 要先经过文件系统、经过操作系统页缓存,中间还可能有各种锁。Oracle 在企业级场景里一直强调直接用裸设备或者 ASM,因为 ASM 本身就是一个为数据库 IO 设计的卷管理器 + 文件系统,它把数据文件切成一个个 Allocation Unit(默认 1MB,也可以设 4MB),通过指针把这些 AU 映射到底层磁盘上,IO 路径比普通文件系统更可控。

第二,也是最现实的:如果文件系统损坏,你恢复起来很痛苦。数据库文件的损坏检测、坏块自动修复能力(比如 ASM 的镜像和修复),在普通文件系统上完全发挥不出来。生产环境最怕的就是存储出问题,而 ASM 恰恰是 Oracle 在存储层加的那道保险。

1.2 ASM干了什么,以及它带来的部署变化

用一句话说,ASM 是 Oracle 自己做的“软件 RAID + 集群文件系统”组合体。你不需要再花钱买存储厂商的卷管理软件,也不用依赖 Linux 的 LVM,只需要给 ASM 指定几块“裸”磁盘,它自己会做条带化和镜像。

这就带来一个很明显的部署结构变化:以前数据库软件和数据库文件都在一块盘上,现在整个系统被拆成了三个层次:

层次 组件 作用
存储层 ASM 磁盘组 存放数据文件、控制文件、日志文件、备份
基础设施层 Grid Infrastructure(GI) 管理 ASM 实例、监听、集群资源
数据库层 Oracle Database 19c 提供业务访问

我见过不少人在虚拟机里硬装 ASM,结果因为共享磁盘、SCSI ID 之类的问题装到崩溃。其实单机环境完全不需要搞复杂的共享存储,ASM 在单机上照样能跑,只需要配置好磁盘的权限和名称,让 GI 能识别出来。虚拟机里做实验时,我给每个 ASM 磁盘单独划分一个 SCSI 控制器槽位,避免和多路径软件打架。

1.3 这台“生产环境”机器到底该怎么准备

既然标题里有“生产环境”四个字,很多人第一反应是去翻官方的最低配置:2GB 内存、10GB 磁盘。我只想说,最低配置装出来的实例根本没法做任何实战测试,连启动一套像样的 PDB 都费劲。我的建议是不要低于 8GB 内存、100GB 磁盘,建议配置如下:

  • CPU:4 核以上,安装过程中那些检查脚本很吃 CPU。
  • 内存:8GB 起步,16GB 更舒服。ASM 实例本身只占几百 MB,主要是留给数据库 SGA 和 PGA。
  • 磁盘:系统盘 50GB,ASM 磁盘 3-5 块,每块 20GB 左右。

操作系统我推荐 Oracle Linux 7.9 或者 Rocky Linux 8.x。虽然 Oracle 19c 官方支持列表里主要是 Oracle Linux 和 RHEL,但只要你内核参数配置到位,基于 RHEL 的发行版都能跑。本文档里的命令在 Oracle Linux 7.9 上验证过,CentOS 7、Rocky 8 也适用。

2. 从零构建一台干净的Linux服务器

2.1 操作系统安装与网络规范

这一步看似简单,但踩过坑的人都知道,Linux 系统盘的 /boot 分区和根分区布局如果规划不当,后期会异常难受。我的建议是:

  • /boot 分区给 1GB
  • swap 给 4GB(如果物理内存 16GB 以上,swap 可以给 4GB 或干脆不要,因为 Oracle 对 swap 的建议是物理内存的 0.5 到 1 倍之间)
  • 根分区 / 给完剩余全部空间,直接格式化为 xfs

网络方面,生产环境强烈建议配置固定的 IP 地址和主机名,不要依赖 DHCP。主机名不能用“oracle”或“db”这种过于简单和容易冲突的名字,我一般在规划文档里定义成 fgtm-db01 这种格式,并且在 /etc/hosts 里写清楚 IP 和主机名的对应关系。安装 GI 时有很多反向解析检查,hosts 文件里写不好会直接卡在检查阶段。

2.2 磁盘布局:留给ASM的盘子要干净

ASM 对磁盘的要求只有一个——它必须是未格式化的裸设备。这句话的坑在于“未格式化”三个字。很多人在虚拟机里加了一块新盘,安装操作系统时顺手给它建了分区,或者进系统后 mkfs 了一下,结果 ASM 识别时总是提示磁盘头有问题。

正确的做法是:给 ASM 预留的磁盘,从创建到使用都不要碰它。加盘之后用 fdisk -l 查看能看到三块 20GB 的盘,比如 /dev/sdb、/dev/sdc、/dev/sdd,但坚决不要对它们执行 fdisk 或 mkfs。ASM 在初始化磁盘时自己会写磁盘头,你提前写了任何文件系统,都可能导致后续 asmcmd 操作时报 “ORA-15018: diskgroup cannot be created” 这类错误。

2.3 安装依赖包:决定你后面顺不顺的唯一前置条件

Oracle 19c 的安装程序在安装前会执行一系列检查,其中一个让人烦躁的检查项就是缺少某些 RPM 包。如果你用的是 Oracle Linux 自带的 public yum 源,直接执行下面这一串命令:

BASH
yum install -y bc binutils compat-libcap1 compat-libstdc++-33 \
gcc gcc-c++ elfutils-libelf-devel glibc glibc-devel ksh \
libaio libaio-devel libX11 libXau libXi libXtst libXrender \
libXrender-devel libgcc libstdc++ libstdc++-devel libxcb \
make net-tools nfs-utils smartmontools sysstat unixODBC unixODBC-devel

注意 compat-libstdc++-33 这个包在 CentOS 8 及其后续版本里已经不在默认源中了,需要手动去 EPEL 或者用兼容包替换。如果你卡在这一步,可以直接使用 oracle-database-preinstall-19c 这个 rpm,它是 Oracle 官方提供的预安装包,执行完依赖全装好,用户和目录也会自动建好。不过在真实生产项目中,我更倾向于手动配置,因为预安装包有一些默认行为和我的环境规范不完全一致。

2.4 内核参数和Shell限制

这一步是最容易“照抄出错”的环节。很多博客直接丢一个 sysctl.conf 让你覆盖,也不告诉你每一项在干嘛。生产环境的系统上,内核参数是全局生效的,随便乱改可能影响同一台机器上的其他应用。

我按 Oracle 官方文档排序,把对 19c 最关键的几个参数说明一下:

参数 推荐值 意义
kernel.shmmax 物理内存的一半(字节) 单个共享内存段的最大尺寸
kernel.shmall 物理内存的页数 共享内存总页数上限
kernel.sem 250 32000 100 128 信号量参数,Oracle 并发访问依赖它
fs.file-max 6815744 系统级文件句柄上限
fs.aio-max-nr 1048576 异步 IO 请求数上限
net.ipv4.ip_local_port_range 9000 65500 预留端口范围,防止 Oracle 端口被临时端口占用
vm.swappiness 10 减少内存换页频率

怎么算物理内存对应的字节数?用 free -b 看 Mem 那行 total 值,shmmax 设成它的一半即可。shmall 则是把物理内存的总字节数除以页大小(通常是 4096 字节)。注意在真实生产环境里,如果机器还跑着别的业务进程,shmmax 不能随便吃满一半,否则其他应用可能起不来。

Shell 限制方面,编辑 /etc/security/limits.conf 加上:

TEXT
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

这些设置的值不是随便写的,Oracle 官方安装文档里有对应的检查标准。测试环境中可以临时用 ulimit -n 调整,但生产环境一定要持久化配置,否则重启后失效。

3. 用户、目录与权限:数据库系统的地基

3.1 用户组规划

安装 Oracle 19c 的 Grid Infrastructure 和数据库软件,最少需要两个用户:grid 和 oracle。grid 负责管理 ASM 实例和集群资源,oracle 负责运行数据库。很多人图省事只用 oracle 一个用户装完所有组件,这在生产环境是非常不推荐的,因为 Oracle 官方支持的最低权限设计就是两者分离。

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

注意 oracle 用户不要加入 asmadmin 组,正常情况下它只需要访问 ASM 数据的权限(asmdba),而不应该有管理员级别的权限。如果加了,数据库和 ASM 的权限边界就模糊了,这在生产环境审计时是个问题。

3.2 目录结构设计

Oracle 的目录规划直接影响后续的升级、补丁和卸载。我用的是下面这套经典的结构,避免 Oracle Home 和 ORACLE_BASE 混在一起:

TEXT
/u01/app/oraInventory # Oracle 所有组件共享的清单目录
/u01/app/grid # grid 用户的 ORACLE_BASE
/u01/app/19.0.0/grid # Grid Infrastructure 的 HOME
/u01/app/oracle # oracle 用户的 ORACLE_BASE
/u01/app/oracle/product/19.0.0/dbhome_1 # 数据库软件的 HOME

权限设置:

BASH
mkdir -p /u01/app/oraInventory
mkdir -p /u01/app/grid
mkdir -p /u01/app/19.0.0/grid
mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1
chown -R grid:oinstall /u01/app/grid /u01/app/19.0.0
chown -R oracle:oinstall /u01/app/oracle
chown -R grid:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app

这里有一个很多人忽略的细节:/u01/app/oraInventory 的所有者第一次会由安装程序自动创建,但在安装之前指定好所有者能避免后续跑 root.sh 时因为权限错误出现 OUI-100 这种问题。

3.3 udev规则:让ASM找到磁盘的正确姿势

Linux 下磁盘设备名不固定,重启后 /dev/sdb 可能变成 /dev/sdc。生产环境绝对不能依赖这种不稳定的命名来让 ASM 识别磁盘,所以必须通过 udev 规则绑定磁盘的稳定标识。

常用的绑定方式有两种:一是按 UUID(通过 blkid 查看文件系统 UUID,不过裸盘没有文件系统),二是按 /dev/disk/by-id/ 下的 scsi id 或 wwn。对 ASM 这种裸盘场景,我习惯用 scsi_id 命令获取设备唯一标识,然后写 udev 规则。

BASH
/usr/lib/udev/scsi_id -g -u -d /dev/sdb

拿到序列号后新建 /etc/udev/rules.d/99-oracle-asm.rules:

TEXT
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="361234567890abcdef", OWNER="grid", GROUP="asmadmin", MODE="0660"

有三条规则就要写三行,分别指定三块盘。写完执行 udevadm control --reload-rules 和 udevadm trigger,再检查一下权限是否变成 grid:asmadmin。这一步做不好,后面启动 ASM 实例时会出现 ORA-15032: Not all alterations performed 这种让人摸不着头脑的报错。

4. Grid Infrastructure安装与ASM磁盘组规划

4.1 安装前检查与cvuqdisk

从 Oracle 19c 开始,安装介质自带一个 cvuqdisk 包,它在安装前检查 chk 包时需要用到。这个包在 stage 目录的 cvu/cv/rpm 下,需要先安装到系统里:

BASH
rpm -ivh /path/to/stage/cvu/cv/rpm/cvuqdisk-1.0.10-1.rpm

完整检查所有安装环境是否满足要求,用 runcluvfy.sh:

BASH
/u01/app/19.0.0/grid/runcluvfy.sh stage -pre crsinst -n fgtm-db01 -fixup -method root

如果环境有什么问题,它会在输出里明确提示你该修什么。我当时在虚拟机上第一次跑这台命令,报了一个关于物理内存不足的警告(因为虚拟机默认 4GB),后来把内存调到 8GB 才彻底通过。这里提醒一下:chk 不通过不代表不能装,如果只是 warning 级别可以继续,但如果涉及 missing packages 或者 hard limit 不达标,最好停下来处理完再继续。

4.2 图形界面还是静默安装

生产环境我建议至少先学会静默安装,因为很多生产机器是内网环境,没有图形界面,也无法通过 X11 转发桌面。虽然图形界面交互起来直观一些,但在内网堡垒机环境下,静默安装文件才是你真正要维护的东西。

Grid Infrastructure 的静默安装响应文件用 gridSetup.sh -silent -responseFile 来调用。响应文件模板在安装介质的 response 目录下,其中 gridsetup.rsp 需要重点配置这几个参数:

参数 值 说明
oracle.install.option CRS_CONFIG 安装集群就绪服务
ORACLE_BASE /u01/app/grid grid 用户基础目录
ORACLE_HOME /u01/app/19.0.0/grid GI 安装位置
oracle.install.asm.OSDBA asmdba 指定 DBA 权限组
oracle.install.asm.OSOPER asmoper 操作员权限组
oracle.install.asm.OSASM asmadmin ASM 管理员组
oracle.install.crs.config.scanType LOCAL_NODE 单机环境用本地节点
oracle.install.asm.diskGroup.name DATA 首个磁盘组名称
oracle.install.asm.diskGroup.redundancy NORMAL 冗余模式
oracle.install.asm.diskGroup.disks /dev/sdb,/dev/sdc,/dev/sdd 磁盘列表
oracle.install.asm.diskGroup.diskDiscoveryString /dev/sd* 磁盘发现字符串

其中 redundancy 有 EXTERNAL、NORMAL、HIGH 三档,生产环境有硬件 RAID 的存量环境有时候会为了空间利用率选 EXTERNAL,这个见仁见智。但软件层面的冗余永远是低于底层硬件冗余的,硬件有 RAID 保护的情况下用 EXTERNAL 不是不能接受。一般来说,我建议虚拟机实验环境至少有 NORMAL,这样能理解 ASM 的镜像机制。

4.3 root.sh 和 ASMCA 磁盘组验证

安装 GI 的最后一步一定会让你在 root 用户下执行 /u01/app/19.0.0/grid/root.sh。这一步没跑好,后面各种 crsctl 命令都会罢工。常见的 root.sh 卡住原因有两个:一是 /etc/oratab 文件被之前的尝试污染,二是 ohasd 启动失败。

执行完 root.sh,用下面这些命令验证 ASM 集群状态:

BASH
crsctl check crs
crsctl stat res -t

crsctl stat res -t 的输出很长,只要看到 ora.asm 是 ONLINE 状态,就说明 GI 这一层基本没问题了。

接下来用 asmca 图形工具或 asmcmd msod 命令检查磁盘组的状态。如果没有图形环境,用 asmcmd 更直接:

BASH
asmcmd -p
lsdg

lsdg 输出里要注意 State 一栏,正常显示 MOUNTED。每个磁盘组的 TOTAL_MB 和 FREE_MB 也要心里有数,这个直接对应你未来建表空间时可用容量。

5. 数据库软件的安装、监听和PDB规划

5.1 数据库软件的静默安装

GI 装好只是把地基打了,数据库软件本身还要单独装。数据库软件的静默安装响应文件是 db_install.rsp,关键参数如下:

BASH
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=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
oracle.install.db.ConfigureAsContainerDB=false

启动安装:

BASH
./runInstaller -silent -responseFile /path/to/db_install.rsp

这一步骤时间比较长,我等过二十多分钟的,期间屏幕上没有任何输出,不要急着中断。安装完要再跑一次 root 脚本:

BASH
/u01/app/oracle/product/19.0.0/dbhome_1/root.sh

5.2 监听配置与DBCA建库

先用 netca -silent 创建监听:

BASH
netca -silent -responseFile /u01/app/oracle/product/19.0.0/dbhome_1/assistants/netca/netca.rsp

监听端口默认 1521,如果 1521 被占用,需要先调整 listener.ora 里的端口再启动。这个情况在企业内网挺常见,尤其是一台服务器上可能跑过其他数据库或中间件。

建库用 DBCA 静默模式:

BASH
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName ORCL -sid ORCL \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName ORCLPDB \
-sysPassword Oracle1234 \
-systemPassword Oracle1234 \
-pdbAdminPassword Oracle1234 \
-storageType ASM \
-diskGroupName DATA \
-recoveryAreaDestination FRA \
-datafileJarLocation /u01/app/oracle/product/19.0.0/dbhome_1/assistants/dbca/templates \
-characterset AL32UTF8 \
-nationalCharacterSet AL16UTF16 \
-memoryPercentage 50 \
-emConfiguration NONE

注意 -createAsContainerDatabase true 意味着你建的是 CDB,这是 19c 的默认形态。如果你选 false,建的就是传统非容器数据库(非 CDB),这在 19c 上属于 deprecated 配置,官方已经不推荐但还支持。除非你有历史版本的升级兼容性需求,否则一律按 CDB 来。

5.3 生产库的PDB数量绝对不是越多越好

CDB 的好处是管理集中、资源隔离方便,很多人在一个 CDB 里塞十几个 PDB,表面上看节约了资源开销。但生产环境我提醒一句:PDB 数量一多,SYSAUX 表空间的膨胀速度会明显加快,AWR、统计信息、审计信息会为每个 PDB 各存一份。我自己就遇到过 SYSAUX 被 WRH$_ACTIVE_SESSION_HISTORY 相关段占满的例子,后面清理起来特别费劲。

一个 CDB 里放多少 PDB,取决于业务确权和运维人员的管理能力。如果每个业务线的 DBA 是同一批人,3 到 5 个 PDB 是合理的;如果 PDB 由不同团队自治,我强烈建议一个 CDB 少放几个,或者干脆每个业务一个独立 CDB,别为了省内存把运维复杂度拉满。

6. 项目实战:把一张订单表送进ASM

6.1 场景设计:一个小型订单系统的库表结构

这一节用一个简单的订单系统做例子,让大家感受数据到底是怎么进 ASM 的。场景:一个电商项目的订单库,数据量中等,每天产生约 10 万条订单记录,保留 12 个月。

首先在 PDB 内创建业务用户和表空间:

SQL
alter session set container=ORCLPDB;
 
create tablespace TBS_ORDER datafile size 2G autoextend on next 200M maxsize 16G;
create user order_app identified by "OrderApp123" default tablespace TBS_ORDER quota unlimited on TBS_ORDER;
grant connect, resource to order_app;

建订单表:

SQL
create table order_app.t_order (
order_id number(16) primary key,
user_id number(12),
order_amount number(10,2),
order_status varchar2(2),
create_time timestamp default current_timestamp
) tablespace TBS_ORDER;

这里有个值得说的细节:你建表空间时如果没指定 datafile 的路径,Oracle 会在 DB_CREATE_FILE_DEST 指定的位置自动创建。而 DB_CREATE_FILE_DEST 在 DBCA 建库时会自动设置成 ASM 磁盘组路径。也就是说正常情况下,你根本不需要在 SQL 里写类似 +DATA/ORCL/DATAFILE 这种路径,Oracle 会自动帮你把数据文件放到 ASM 的 DATA 磁盘组里。

如果你想确认数据文件确实在 ASM 里,执行:

SQL
select file_name, tablespace_name from dba_data_files;

返回结果里 file_name 是 +DATA/ORCL/DATAFILE/tbs_order.272.123456789 这种格式,而不是 /u01/app/oracle/oradata/xxx.dbf。名字里的 .272. 是 ASM 内部的文件编号,掌握这个规律后,在 asmcmd 里定位文件就很容易。

6.2 ASM日常运维与监控命令

项目运行起来之后,日常需要关注的 ASM 操作主要是这几类。

查看磁盘组空间:

BASH
export ORACLE_SID=+ASM
asmcmd lsdg

看到 USABLE_FILE_MB 小于 0 就说明磁盘组空间不足了。这个字段很特殊,它代表去掉冗余后还能安全使用的空间,NORMAL 冗余下实际可用空间是物理空间的一半。

看每个磁盘是否均衡,用:

BASH
asmcmd lsdsk -k

重点看 READ_ERRS 和 WRITE_ERRS,如果某块盘频繁出现 IO 错误,ASM 会自动把它的数据重平衡到其他盘上,但你需要尽早发现并替换这块盘。

SQL 里也能查 ASM 状态:

SQL
select name, state, type, total_mb, free_mb, usable_file_mb
from v$asm_diskgroup;

建议在监控系统里加一个磁盘组空间使用率的指标,这种大表数据一涨起来,磁盘空间可能一两周就吃掉几十个 GB。

6.3 RMAN备份与恢复验证

生产库的备份策略不是可选配置。19c 默认安装完 ARCHIVELOG 是关闭的,所以建库后第一件事就是把数据库切成归档模式:

SQL
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
alter pluggable database all open;

然后设置快速恢复区和归档日志路径,DBCA 如果指定了 -recoveryAreaDestination FRA 会自动配好,没有指定的话手动执行:

SQL
alter system set db_recovery_file_dest='+FRA' scope=both;
alter system set db_recovery_file_dest_size=20G scope=both;
alter system set db_flashback_retention_target=1440 scope=both;

RMAN 全库备份命令:

BASH
rman target /
backup database plus archivelog;

RMAN 会把备份写到 db_recovery_file_dest 指定的 ASM 磁盘组。想验证备份可用,不一定要真的恢复,用 restore validate database; 可以检查备份集是否完好。真实生产环境建议在测试机定期做一次恢复演练,这个步骤最有价值,因为不出事你永远不知道备份脚本到底有没有遗漏。

7. 安装运行中那些折磨人的故障

7.1 安装阶段的经典报错

安装 GI 或 DB 软件时最经典的一个错误是 INS-06006,它通常出现在你安装完依赖包之后还需要额外安装某个 rpm 的场景。比如某个版本的 Oracle Linux 上缺少 libnsl.so.1,安装程序就会报找不到这个库。处理方法很简单:安装对应的兼容库,比如 yum install -y libnsl,报什么缺什么,装完重跑安装程序就行。

另一个高频错误是 ORA-15031: disk specification does not match any disks,这通常是磁盘发现字符串的问题。解决方法是确认 /etc/udev/rules.d/ 里的规则确实生效了,并且权限确实是 grid:asmadmin。执行 ls -l /dev/sdb 看看。

如果磁盘的属主不对,八成是 udev 规则没重载或者 RESULT 字符串写错了。/usr/lib/udev/scsi_id -g -u -d /dev/sdb 返回带有 /dev/ 前缀还是不带,不同系统版本会不一样,写 udev 规则时要特别注意。

7.2 运行阶段的空间问题:sysaux为什么会膨胀

运行阶段的故障基本围绕数据库打开速度和性能问题展开。我遇到过一个很典型的案例:数据库实例启动后,一条 AWR 报告要等几十分钟才能生成,后来发现 SYSAUX 表空间已经用满了 32GB。

主要原因有三个方向:AWR 基线数据过多、审计记录堆积、STATISTICS_LEVEL 设置过高等。清理方式可以参照下面这个顺序:

SQL
select occupant_name, space_usage_kbytes from v$sysaux_occupants order by 2 desc;

查出占用大头后,再针对具体组件处理。比如 AWR 快照保留时间过长,可以调短快照保留时间:

SQL
begin
dbms_workload_repository.modify_snapshot_settings(
retention => 43200, -- 保留 15 天
interval => 30 -- 每 30 分钟采集一次
);
end;
/

这些操作在生产环境都是可以动态执行的,不需要重启数据库,但也建议在变更窗口内操作,避免 AWR 数据大规模清理影响业务。

7.3 “卸载Oracle”在Linux上为什么不是删目录

很多从 Windows 转过来的朋友,看到教程里写着“清注册表”,一到 Linux 就懵了,因为 Linux 没有注册表。你这个标题下面的热搜词里都有“如何卸载oracle19c注册表”,足以说明这问题困扰过很多人。

Linux 上卸载 Oracle 的正确做法分三步:

  • 停掉所有相关进程:crsctl stop crs
  • 用图形工具或者静默方式调用卸载脚本:$ORACLE_HOME/deinstall/deinstall
  • 清理残留目录和系统文件:/etc/oratab、/etc/oraInst.loc、/u01/app 下相关 HOME 目录,以及 /etc/udev/rules.d/ 里的 ASM 磁盘规则

没有“注册表”不等于没有残留。/etc/oratab、/etc/oraInst.loc 和 oracle 用户的环境变量里都留有痕迹,不清理干净,等下一次安装的检查阶段就会异常,甚至把新安装的实例和旧的监听混在一起。

8. 上线前必须补完的收尾工作

8.1 归档、闪回与备份策略的联动

很多人装完数据库,导完数据,觉得“能用就行”,结果几个月后硬盘满了才发现归档日志已经把空间吃光。ASM 磁盘组里 FRA 的空间规划和磁盘组本身的容量规划同样重要。

推荐的生产参数组合是:

SQL
alter system set db_flashback_retention_target=1440 scope=both;
alter system set db_recovery_file_dest='+FRA' scope=both;
alter system set db_recovery_file_dest_size=20G scope=both;
alter system set control_file_record_keep_time=7 scope=both;

归档日志保留时间建议拉到 7 天以上,闪回保留 1 天左右。具体的值取决于业务容忍的停机时间和你对数据丢失的容忍度。备份策略上,我目前实际使用频率最高的是每周日 0 点全备,每天增量备份,归档日志实时备份到异机。RMAN 里可以这样配增量备份:

BASH
backup incremental level 0 database plus archivelog;

8.2 打开数据库级别的调优

19c 默认安装后,有一些参数和真实生产负载匹配得不好。比如 processes 默认只有 300,很多业务一上线就报 ORA-00020: maximum number of processes exceeded。根据你的最大并发连接数,提前调高:

SQL
alter system set processes=3000 scope=spfile;

内存管理如果是手动模式,建议检查 sga_target 和 pga_aggregate_target,使用 memory_target 自动管理虽然省事,但在内存申请和实例稳定性之间需要平衡。我的个人建议是生产库使用 sga_target + pga_aggregate_target 的手动管理方式,这样实例内存使用更可控,OOM 风险更小。

8.3 监控、告警和变更记录

说实话,这一节是我最想跟大家强调的“非技术”环节。我也见过太多项目,数据库装得漂亮,参数调得也专业,但没接监控,出故障时靠人肉登录。

生产库至少要监控这几个指标:

  • ASM 磁盘组空间使用率,超过 70% 预警,超过 85% 告警
  • 告警日志中的 ORA-600 和 ORA-7445 错误
  • 数据库会话数和活跃会话数
  • 归档日志生成速率和磁盘增长趋势

变更记录我建议使用简单的数据库变更清单,每次操作都记下时间、操作人、变更内容、验证结果。这个习惯在排查性能问题时价值巨大,你能快速知道是不是某次参数调整导致的性能回退。

最后再分享一个我的个人习惯:在每台数据库服务器的 ~/.bash_profile 里加上环境变量别名,把 sqlplus / as sysdba 和 asmcmd 这两个最短命令写成 alias,减少生产环境误操作的概率。装完这套环境,建议把从操作系统安装到 DBCA 建库的全过程在文档里重新走一遍,不只是记命令,而是把每一步背后的意图写下来。你亲自验证过一遍之后,再遇到任何安装问题,都会比直接搜“xxxx教程”可靠得多。

相关推荐

基于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
返回顶部
Pinxian Li
博客等级 码龄9年 48粉丝 8,202原创