尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Oracle 26ai 静默安装升级:一键脚本适配与部署避坑指南
Oracle 26ai 的发布消息出来之后我第一反应不是去研究那些新特性而是打开自己维护了很长一段时间的 Oracle 一键安装脚本目录开始琢磨一个问题这套脚本还能不能继续用答案老实说有点悬。26ai 的安装包结构、响应文件规范、依赖包清单都和旧版有出入尤其是 AI 相关组件的加入让原本熟悉的静默安装路径多了不少岔路。于是就有了这次脚本升级。这套一键安装脚本解决的是数据库安装里最枯燥也最容易出错的环节从操作系统预检查、依赖包安装、用户与目录创建、内核参数配置到响应文件生成、静默安装、监听配置、实例创建全部自动化完成。过去手工装一套 Oracle熟练的老手也得一到两个小时中间还要反复对照文档核对参数和权限用脚本走一遍三十分钟内能完成主干流程而且每次的结果都可复现不会因为手抖输错口令导致返工。这篇内容写给三类人一是正在评估 Oracle 26ai 的 DBA 和运维工程师想知道新版本安装部署的变化点二是手里维护着旧版自动安装脚本、准备做版本兼容升级的人三是刚接触 Oracle 数据库部署、想理解静默安装底层逻辑的入门者。我会把这次脚本升级中的设计思路、关键代码、踩坑记录都摊开讲不藏私。1. 为什么要把脚本升级到 Oracle 26ai1.1 26ai 的安装方式和以前有什么不同Oracle 26ai 在宣传上主打的当然是 AI 能力比如内置向量检索、支持在数据库中直接托管 AI 模型推理。但从部署角度看真正影响安装脚本的并不是这些功能本身而是新版本对安装过程的约束。过去装 Oracle 19c 或者 23ai响应文件的 schema 版本号是rspfmt_dbinstall_response_schema_v19_0或类似的格式到 26ai 就变成了全新的版本。这不是换个数字那么简单新增的 AI 组件有自己的配置段落比如 ONNX Runtime 的路径、向量文件目录、模型加载需要的共享库路径。如果还用旧响应文件模板安装程序会在校验阶段直接报错退出根本走不到写软件那一步。另一个明显变化是操作系统兼容范围的收窄。26ai 把支持的 Linux 发行版集中到了较新的内核版本上旧脚本里针对 Linux 8 预设的依赖包清单明显不够用。一些原本可选的包在新版中变成了硬依赖少了任何一个都会在预检查阶段被拦下来。我对照安装文档逐个核对依赖项时发现新增了至少五项与 AI Runtime 相关的运行库这是之前在 19c 时代完全没见过的东西。还有权限模型的变化。26ai 对oracle用户的资源限制检查更严格了包括进程数上限、文件句柄数、共享内存段数量。旧脚本即使不配置这些也能勉强装完但在实例启动时会出现奇怪的性能问题。这次升级我把资源限制的配置从“可选优化”变成了“强制前置”宁可前面多花两分钟也不要让实例在 production 环境里被句柄限制卡住。1.2 脚本升级的原则和整体设计我定的升级原则很朴素尽量不推翻已有架构只做兼容层扩展。因为原来的脚本已经在多个环境里验证过核心逻辑是可靠的如果因为适配新版本就全部重写反而会引入一堆新问题。整个脚本的设计保持了三段式结构。第一段是环境准备包括版本检测、操作系统识别、依赖包批量安装、用户与组创建、内核参数和资源限制配置第二段是静默安装核心工作是生成正确的响应文件并调用安装程序第三段是实例配置包括监听器创建、数据库实例创建、基础安全加固。升级主要动的是第一段和第三段里那些版本相关的细节骨架没变。版本检测逻辑是升级中最关键的一处。脚本最开始要从安装包文件名或者解压目录里提取出版本号再根据版本号选择对应的响应文件模板和依赖清单。我设计了一张映射表把版本号与模板文件、依赖列表、补丁策略关联起来。这样以后再有新版本发布只需要在映射表里加一行而不是在脚本里到处改 if else。2. 升级脚本前需要重新确认的三件事2.1 操作系统与依赖包的兼容清单适配一个新版本第一步永远是确认“地基”变了多少。我把 Oracle 26ai 的官方系统兼容列表和自己原来支持的操作系统范围做了交集结果是Linux 9 系列是必选项旧脚本里默认的 Linux 8 支持可以直接放弃。这个决定很实际反正生产环境早晚要往新系统迁移为一个已经停止新增特性的旧系统维护兼容逻辑性价比太低。依赖包清单的更新比预想中繁琐。我整理了一组必须预装的包给读者一个直观的参考# 基础运行库与 19c 时代基本一致 binutils glibc glibc-devel ksh libaio libaio-devel libgcc libstdc libstdc-devel libxcb make nfs-utils net-tools python3 sysstat unixODBC # 26ai 新增的 AI Runtime 相关运行库 elfutils-libelf elfutils-libelf-devel libnsl libnsl2 compat-libpthread-nonshared libtirpc libattr libcap注意最后一组里的几个包尤其是compat-libpthread-nonshared和libtirpc。前者在旧版本里是可选项到了 26ai 变成了必装后者与 RPC 通信相关如果遗漏实例创建阶段的内部通信会莫名其妙地失败。我实测过一台干净的系统缺了libtirpc后安装程序能跑完但建库时报错信息非常隐晦排错花了很长时间才定位到是缺了这个包。批量安装我仍然推荐用 yum 或者 dnf 的本地软件源不要手动一个个去下载 RPM。封装命令的时候加一个--skip-broken不太好因为会把真正缺失的依赖一起跳过更稳妥的做法是先用dnf install跑一遍预装列表然后单独检查每个包是否已安装把缺失项明确列出来再处理。2.2 响应文件模板的变化点响应文件是静默安装的灵魂升级脚本的大部分精力都花在了这里。26ai 的响应文件 schema 版本我建议直接指定为对应 26 系列的版本号同时把新增的 AI 组件配置段加上。一个简化版的关键片段如下oracle.install.responseFileVersion/oracle/install/rspfmt_dbinstall_response_schema_v26_0 oracle.install.optionINSTALL_DB_SWONLY ORACLE_HOSTNAMEdbhost UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oraInventory SELECTED_LANGUAGESen,zh_CN ORACLE_HOME/u01/app/oracle/product/26.0.0/dbhome_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.OSDBA_GROUPdba oracle.install.db.OSBACKUPDBA_GROUPbackupdba oracle.install.db.OSDGDBA_GROUPdgdba oracle.install.db.OSKMDBA_GROUPkmdba oracle.install.db.OSRACDBA_GROUPracdba oracle.install.db.CLUSTER_NODES oracle.install.db.isRACOneInstancefalse oracle.install.db.ConfigureAsContainerDBtrue oracle.install.db.config.PDBNameORCLPDB oracle.install.db.EnableArchivetrue oracle.install.db.DatafileDestination/u01/app/oracle/oradata oracle.install.db.recoveryDestination/u01/app/oracle/fast_recovery_area # 26ai 新增段落 oracle.install.db.ai.vectorPoolSize1G oracle.install.db.ai.modelHome/u01/app/oracle/models oracle.install.db.ai.onnxRuntimeLib/usr/lib64/libonnxruntime.so这里有几个字段需要特别解释。oracle.install.db.ai.vectorPoolSize是给向量检索预留的内存池不设定的话默认值可能偏小后续跑 AI 类查询时容易出现内存分配失败。modelHome是存放 AI 模型文件的目录安装程序不会自动创建脚本阶段必须先把目录建好并授权给oracle用户否则校验阶段直接报路径不可写。onnxRuntimeLib指向 ONNX Runtime 共享库路径如果系统里装的是发行版自带的版本路径有概率不一致需要实际确认。一个容易踩的坑是INVENTORY_LOCATION。如果系统里之前装过其他 Oracle 版本oraInventory目录已经存在安装程序会复用并注册到已有的中央清单里。此时如果脚本强制指定不同的 inventory 路径会触发冲突检查可能要求在原有版本上继续安装。我做了兼容处理检测到已有 inventory 时就跳过指定没有时才显式写入路径。2.3 磁盘规划与目录结构调整26ai 对磁盘空间的“胃口”比旧版大不少。仅软件家目录ORACLE_HOME解压后的体积我实测大约比 23ai 多出 3GB 以上主要来自 AI Runtime 和预置的模型文件。脚本的预检查逻辑里我把软件目录和数据库数据目录的最低可用空间要求分别调高宁可准备的时候多留冗余也不要装到一半才发现 /u01 满了。目录结构方面的一个调整是/tmp空间。安装程序在解压和 OUI 阶段会往 /tmp 写入大量临时文件如果 /tmp 是用内存盘tmpfs挂载的空间大小直接受限于内存总量。我见过内存 16GB 的机器/tmp 默认只有 7.7GB跑到一半 OUI 报空间不足整个安装回滚。脚本里我加了一步检查如果 /tmp 是 tmpfs 且可用空间低于 12GB就提示先扩内存或挂载独立分区而不是硬着头皮跑。另一个容易被忽略的是文件目录的属主。Oracle 安装要求ORACLE_BASE、ORACLE_HOME的父目录都要归oracle用户所有但很多人只改了oracle目录本身忽略了/u01/app这一层。26ai 的权限校验对祖先目录的属主也做了检查不符合条件就会在最后阶段报“Permission denied on parent directory”。脚本里我用一条递归创建加上chown -R oracle:oinstall解决同时注意不要让chown误伤同路径下的其他软件目录所以先检测目录是否已存在存在则不重复授权。3. 一键安装脚本的实操拆解3.1 参数入口与配置文件设计我不想把脚本做成一个“黑盒”那样出了问题很难排查。所以参数入口保持了最简单的调用方式大部分配置集中在同一个配置文件里。./install_oracle.sh -v 26ai -s /data/install -b /u01/app/oracle-v指定版本-s指定安装包解压目录-b指定 ORACLE_BASE。其他细节参数比如 SID、PDB 名、字符集、内存分配比例统一放到conf/install.conf里。为什么不用全命令行传参因为参数太多容易手滑而且配置文件方便在不同环境之间复制和复用。我在配置文件里给每个参数都写了注释说明取值范围和推荐值后续维护的人不用翻脚本也能改得动。配置文件的默认值选择上有三个经验值得分享。第一是字符集默认设为AL32UTF8新项目基本都要求支持多语言用默认的WE8MSWIN1252后面改起来很痛苦。第二是数据文件目录不要放在 ORACLE_HOME 下面这是个老生常谈的坑但每次都能见到有人这么干重装数据库时软件目录一删数据也没了。第三是内存分配参数26ai 默认的MEMORY_TARGET比例比旧版激进如果机器内存只有 16GB建议把数据库内存目标固定为物理内存的 50% 左右而不是放任自动管理把内存吃满。3.2 自动化流程的主干逻辑脚本的主干逻辑在保证可读性的前提下做了适度压缩。整个执行过程分为预检查、依赖安装、环境配置、静默安装、后置配置五个阶段每个阶段有独立的日志函数和状态标记。任何一个阶段失败脚本会立即停止并输出当前阶段的日志文件路径方便排查。预检查阶段的代码思路大致是这样的check_prereq() { local version${ORACLE_VERSION} local mem_mb mem_mb$(free -m | awk /Mem:/ {print $2}) if [ ${mem_mb} -lt 8192 ]; then log_error Physical memory less than 8GB, current: ${mem_mb} MB exit 1 fi local disk_free disk_free$(df -Pm ${ORACLE_BASE} | awk NR2 {print $4}) if [ ${disk_free} -lt 20480 ]; then log_warn Available disk space on ${ORACLE_BASE} less than 20GB fi if [ ! -f ${INSTALL_MEDIA}/stage/Response/${version} ]; then log_error No response file template for version ${version} exit 1 fi log_ok Prerequisite check passed. }这段代码不算复杂但把最容易出问题的三个硬门槛卡住了内存、磁盘、模板文件是否存在。我刻意没有在预检查里做太多“软性警告”因为警告这种东西看多了就会被忽略真正重要的问题应该直接用非零退出码中断。依赖安装阶段用的是 dnf 加包列表的方式前面那段包列表已经列出来了。安装完成后会逐个用rpm -q验证确保不是“yum 说装好了但实际还有残留缺失”。这一步特别重要因为有的依赖包存在多版本共存的情况比如libstdc同时装了 8 和 9 两套rpm -q只验证一个包名无法确认正确的版本是否满足 Oracle 需求。所以包列表里直接写死具体版本比如libstdc-9.5.1-1.el9这种。3.3 从运行库到实例创建的关键命令静默安装的核心就是一条 runInstaller 命令。我先准备响应文件把前面讲到的配置项都渲染进去然后执行安装${ORACLE_HOME}/runInstaller \ -silent \ -responseFile ${RESPONSE_FILE} \ -ignorePrereqFailure \ -waitForCompletion这里我特意加了-waitForCompletion没有它脚本会在 OUI 还在后台写入时就往下走后面执行的orainstRoot.sh和root.sh会因为文件尚未就绪而失败。-ignorePrereqFailure是一把双刃剑我会在响应文件预检查里自己把问题挡住所以这里开启它只用于跳过一些跟实际环境无关的警告比如 NTP 校时提醒。软件安装完成后root 脚本必须以 root 权限执行。脚本里用su - root -c的方式调用把orainstRoot.sh和root.sh串在一起并检查退出码。这一步的常见问题是 root 环境变量里缺少必要的路径我写了两个export把ORACLE_HOME和ORACLE_BASE传进去避免“runs as root but cannot locate inventory”这类报错。实例创建推荐用 DBCA 静默模式。26ai 里容器数据库CDB已经是默认选项我直接用参数指定一个 PDBdbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName ORCL \ -sid ORCL \ -createAsContainerDatabase true \ -numberOfPDBs 1 \ -pdbName ORCLPDB \ -pdbAdminPassword ${PDB_PASSWORD} \ -sysPassword ${SYS_PASSWORD} \ -systemPassword ${SYSTEM_PASSWORD} \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -totalMemory 8192 \ -characterSet AL32UTF8 \ -sampleSchema false \ -automaticMemoryManagement false密码统一用脚本自动生成的随机串避免所有环境用同一套弱口令。-sampleSchema false是我习惯加的生产环境用不到示例表也少一点安全暴露。-automaticMemoryManagement false配合手写totalMemory是为了让内存分配更可控防止 AI 组件在内存紧张时把 SGA 挤爆。监听器配置用netca -silent一条命令搞定然后立刻用lsnrctl status验证。这里有个小细节创建监听后最好把/etc/hosts里的主机名解析确认一下因为有个旧坑是监听起来了但服务注册时反解出来的是localhost客户端连接时按完整主机名找不到服务排查起来很绕。4. 实测过程中遇到的坑与解决方案4.1 安装失败的典型场景排查我在升级后的三台系统上分别做了完整安装测试第一台顺利通过第二台和第三台分别踩了两个典型的坑值得记录。第二台机器的坑出在响应文件校验阶段报错信息是“Invalid value specified for oracle.install.db.ai.modelHome”。我检查配置时明明已经指定了路径为什么还会报无效后来发现是脚本里生成目录的时机太晚modelHome指向的/u01/app/oracle/models在响应文件写入前还不存在。Oracle 的校验逻辑不只是检查路径格式还会检查路径是否真实存在且可写。修复方式很简单在生成响应文件之前先创建目录并授权。第三台机器的坑出现在root.sh执行完后的建库阶段。DBCA 在创建数据字典时报了一个关于libnsl的错误直觉是缺少依赖包但明明安装时已经把libnsl装上了。进一步排查发现系统里同时存在libnsl.so.1和libnsl.so.2DBCA 加载的是旧版本导致符号解析失败。这类问题在升级脚本里很难通过“多装几个包”解决最有效的是在安装完成后检查ldconfig -p | grep libnsl确认链接指向正确的版本文件。4.2 隐藏的依赖与权限问题有些问题平时根本不会暴露但在特定环境组合下会突然跳出来卡住整个安装流程。我整理成一个速查表方便读者直接对照排查。症状可能原因处理方法OUI 预检查通过但写入阶段失败/tmp 空间不足预先检查/tmp可用空间tmpfs 挂载时更换为独立分区root.sh执行时找不到 inventoryroot 环境变量未包含 ORACLE_HOME显式 export ORACLE_HOME 和 ORACLE_BASE 后再执行建库时报libnsl符号错误系统存在多个 libnsl 版本用ldconfig -p确认加载路径卸载旧版本或添加软链接DBCA 建库后实例无法启动oracle 用户nofile限制过低在limits.conf中设置nofile65536、nproc16384服务注册后监听显示localhost/etc/hosts 主机名解析异常显式将主机名与固定 IP 写入 /etc/hostsAI 组件初始化失败缺少 ONNX Runtime 共享库安装libonnxruntime并确认.so路径权限问题里还有个容易忽略的oracle用户的 shell 不能是 nologin否则所有静默命令都会在切换用户后失败。脚本里我会在环境准备阶段检查用户的 shell 配置如果不是/bin/bash就强制修改。这个错误在首次部署时很典型因为大多数初始化脚本都只创建用户不会下意识去管 shell 设置。4.3 快速验证安装是否成功的清单装完不是结束验证环节如果做得好能省下后面应用上线时的大量排查时间。我的脚本最后会执行一组自检命令把结果直接输出到 Ansible 风格的清单里。第一步是进程与监听检查依次执行ps -ef | grep pmon、lsnrctl status确认实例进程在跑、监听状态是 READY 而不是 BLOCKED。第二步是登录数据库执行简单的 SQL我用的是select name, open_mode, database_role from v$database; select version, banner_full from v$version where rownum1;如果输出里OPEN_MODE是READ WRITE并且版本号匹配 26ai基本可以确认主流程没问题。第三步是检查 PDB 状态执行show pdbs确认 PDB 是READ WRITE状态。最后检查 AI 组件初始化是否完整查询视图确认向量池已分配、ONNX Runtime 已注册并允许加载模型。这套清单用脚本自动跑完结果同时写入日志文件。之后无论交付给谁手里都有一份机器可读的“体检报告”避免“明明装好了但没人敢说没问题”的尴尬局面。5. 这次脚本升级沉淀下来的几点经验把脚本从旧版一路升级到 26ai最大的感受是真正的成本不在新功能而在兼容性细节。AI 组件看起来很热但部署时它们只不过是多几个需要预装的库、多几个需要预分配的路径。反而是/tmp空间、libnsl版本、ancestor 目录属主这类不起眼的检查项在关键时刻拖后腿。我做了一个对自己很有帮助的习惯调整每一次适配新版本都先把官方文档里关于安装前置条件的部分从头读一遍而不是只对比“差异文件”。因为文档里有些表述只在特定章节里不显眼地出现一次比如对新内核版本的最低要求、对某些共享库版本的限制。如果只盯着旧的检查清单很容易漏掉这些藏在正文里的硬约束。另一个养成的习惯是在每个版本适配完成之后留一台干净虚机做全流程回归测试。干净环境是检验脚本健壮性的试金石因为生产环境里可能已经被手动的“临场处理”掩盖了脚本缺陷只有从不带任何 Oracle 残留的系统开始跑一遍才能知道脚本本身是不是真的够格交付。最后分享一个小技巧。脚本里所有需要联网获取的内容我都改成了离线包或本地软件源优先。这样做有两个直接好处一是安装过程不依赖外部网络状况每次部署的结果都一致二是排查问题时更简单因为你不用去区分“脚本逻辑错了”还是“下载的文件不完整”。在这个基础上配合完善的日志记录升级脚本这件事就会变得比较省心。
RELATED

相关推荐

深入理解Cookie Secure属性:原理、配置与实战踩坑

深入理解Cookie Secure属性:原理、配置与实战踩坑

做Web开发的人,迟早会遇到一个诡异的线上问题:某位用户反馈“登录状态经常莫名其妙失效”,你查日志、看代码、反复测试都没复现,最后偶然发现——只有直接用IP访问或某些非标准端口访问时才会触发。排查到最后,问题往往…

📅 2026/10/17 7:14:18
AI批量清洗图片中文与水印:全托管供货图片质检过关实战方案

AI批量清洗图片中文与水印:全托管供货图片质检过关实战方案

做全托管供货的老哥,最近是不是又被平台的图片质检搞到心态崩了?上一秒还在为出单量兴奋,下一秒就收到驳回通知,理由通常是“图片存在非目标语言信息”“图片包含水印或第三方标识”“图片做过不当遮挡处理”。我在跨境供货圈里泡…

📅 2026/10/17 7:09:17
Git代码审计实战:从提交规范到问题定位的完整工具箱

Git代码审计实战:从提交规范到问题定位的完整工具箱

1. 版本控制的底层逻辑:为什么审计能力决定了协作质量做开发这些年,我越来越觉得 Git 不仅仅是一个“存档工具”。很多人把 Git 当网盘用,一天下来就是add、commit、push三连,等到真出了问题——谁改的这行代码、为什么改、这个提…

📅 2026/10/17 7:09:17
MORE NEWS

更多资讯

📰

把一亿阅读量变成Coze Skill:内容资产AI化实操全解

做内容的人多多少少都遇到过这个阶段:流量涨起来了,阅读量用亿来算,但每天晚上对着后台数据,心里其实很慌。因为这些数字留在别人平台里,换个算法或改个规则,可能就什么都没了。我盯着一亿阅读量想了一个很…

📰

一个人+AI:重构成本结构,打造高效超级个体的新路径

先讲一个我最近常被问到的场景:一位做社区团购的小老板,手里十几个微信群,每天要回复几百条消息,要处理售后,还要写第二天的货品预告,他一个人干到半夜。他问我,有没有办法让AI帮他扛掉一半的事…

📰

AI写专著实战:从工具选型到章节级流水线全解析

过去三个月,我用手头几款AI写作工具完成了一本近20万字的专业著作。这个经历让我确信,AI写专著这件事,已经从"能不能写"的阶段进入"怎么写得又快又能用"的新阶段。很多人以为AI写书就是向对话框扔一句"帮我写一本关…

📰

大模型官方agent效率高于开源方案?从TaoToken统一Key看调用链差异

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

人工智能与心理学交叉:行为建模而非读心,让心理状态可计算

简介:一份探讨人工智能与心理学交叉融合的专题资料,面向科研工作者、心理学从业者及高校师生。内容围绕数据挖掘、机器学习与认知心理学的深度结合展开,梳理了司马贺、辛顿等跨界学者的学术背景,并重点讲解Eliza心理咨询聊天机器人…

📰

产品思维与用户需求挖掘:从决策系统到产品意识内化的实战方法

1. 产品思维不是玄学,是一套可拆解的决策系统很多人第一次听到“产品思维”这四个字,脑子里浮现的要么是乔布斯式的灵光乍现,要么是各种高大上的方法论名词堆砌。我在带过几期产品训练营之后发现,真正让学员卡住的从来不是“不知道…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬