当前位置: 首页 > news >正文

RHEL7.9上Oracle 11gR2单机静默安装实战指南

1. 项目概述:为什么在 RedHat 7.9 上执着于 Oracle 11gR2 单机的一键安装?

我第一次在客户现场看到那台运行着 RedHat Enterprise Linux 7.9 的物理服务器时,心里就咯噔一下——它上面要跑一个老系统迁移过来的财务模块,核心数据库必须是 Oracle 11g Release 2(11.2.0.4),而且明确要求“单机部署、不能用 RAC、不能上虚拟化、不能动现有内核参数”。这不是技术选型,这是合规硬约束。而客户给的交付周期只有3天,运维同事连sqlplus / as sysdba都敲得不太利索。这时候,“一键安装”四个字,不是炫技,是救命稻草。

RedHat 7.9 是一个承上启下的关键版本:它默认使用 systemd 替代了传统的 SysV init,内核升级到 3.10.x,glibc 版本为 2.17,这些底层变化直接卡死了很多沿用 RHEL6 时代的 Oracle 11g 安装脚本。网上流传的所谓“一键包”,十有八九是把runInstaller命令简单封装成 shell 脚本,没处理oracle用户环境变量隔离、/etc/security/limits.conf的 soft/hard 限制冲突、/etc/sysctl.confkernel.shmallkernel.shmmax的动态计算逻辑,更别提oraInst.loc权限错乱、grid目录残留导致静默安装失败这些经典坑。我试过三个不同来源的“一键脚本”,最长一次卡在Linking Libraries阶段整整47分钟,最后发现是gcc版本太高(4.8.5)触发了 Oracle 11g 编译器兼容性检查,而脚本里压根没做降级或打补丁的判断。

这个项目标题里的每个词都是实打实的约束条件。“RedHat 7.9”意味着你必须和systemdfirewalldSELinux Enforcing正面刚;“Oracle 11gR2”特指 11.2.0.4 这个最终稳定版,它不支持systemd原生服务管理,必须用init.d兼容层;“单机”排除了 ASM、OCR、Vote Disk 等所有集群组件,但反而让监听器配置、数据库启动顺序、自动归档路径这些细节变得更敏感;“一键安装”不是省略步骤,而是把所有人工决策点——比如ORACLE_HOME路径是否含空格、DB_NAME是否符合 8 字符限制、MEMORY_TARGET是否超过物理内存 80%——全部前置校验并给出明确报错,而不是让安装程序在第17步突然弹出ORA-00845: MEMORY_TARGET not supported on this system这种让人抓狂的提示。

适合谁来参考这篇?第一类是还在维护老旧 ERP、HR 或财务系统的 DBA,你们的生产库可能就是 11gR2,测试环境却要快速拉起;第二类是信创适配工程师,需要在国产化硬件上复现 RHEL7.9+Oracle11g 的最小可行环境;第三类是备考 OCP 的考生,想在本地虚拟机里反复练习安装、监听配置、用户创建全流程,而不是被DISPLAY环境变量搞崩溃。它不教你 SQL 语法,但能让你在 12 分钟内从裸机 ISO 启动,走到SELECT * FROM v$version;返回正确结果这一步。接下来的所有内容,都是我在过去三年里,在 17 个不同客户现场、32 台物理/虚拟服务器上,把 Oracle 11gR2 在 RHEL7.9 上装了又卸、卸了又装,踩出来的血泪经验。

2. 整体设计思路与方案选型:为什么不用 Docker,也不用 Vagrant?

很多人看到“一键安装”第一反应是:“Docker 不香吗?拉个镜像docker run -d -p 1521:1521 oracle/database:11g-r2不就完了?”——这是最危险的幻觉。Oracle 官方从未发布过 11gR2 的 Docker 官方镜像,所有网络上流传的oracle/database:11g-r2镜像,要么是基于 Oracle 提供的dockerfiles自行构建(但那些dockerfiles本身只支持 12c 及以上),要么是第三方魔改,里面ORACLE_HOME路径硬编码、listener.ora配置写死、甚至root.sh脚本被阉割。我曾经在一个金融客户的测试环境里用这种镜像跑了三天,第四天凌晨数据库进程莫名僵死,strace跟踪发现是容器内systemd模拟层和 Oracle 后台进程的信号处理机制冲突,PMON收不到SIGUSR2导致实例无法正常关闭。这不是 Docker 的问题,是拿现代容器去套一个为物理机裸金属时代设计的数据库架构,属于典型的削足适履。

那用 Vagrant + VirtualBox 呢?理论上可行,但实际落地全是坑。Vagrantfile 里定义的vm.memory = 4096,在 RHEL7.9 里会被systemd解析为4096MB,而 Oracle 11gR2 的MEMORY_TARGET参数单位是bytes,如果你在响应文件里写MEMORY_TARGET=4096M,安装器会把它当成4096 bytes处理,直接报错退出。更麻烦的是共享文件夹权限:Vagrant 默认挂载的/vagrant目录,在 Oracle 安装过程中会被runInstaller用来存放临时日志,但它的umask0022,而 Oracle 要求oracle用户对安装目录有755权限,grid组成员必须能读取,这个权限链在 VirtualBox Guest Additions 里根本没法稳定控制。我试过用chmod -R 775 /vagrant强制修复,结果runInstaller在校验阶段又因为stale NFS handle报错,因为 VirtualBox 的共享文件系统根本不支持 Oracle 安装器依赖的flock()系统调用。

所以最终方案锁定为纯 Bash + Python 辅助的本地静默安装。核心逻辑分三层:第一层是precheck.sh,它不碰 Oracle 一字节,只做操作系统级预检——查ulimit -n是否 ≥ 65536,df -h /u01是否剩余空间 ≥ 12GB,rpm -q binutils gcc make glibc-devel ksh libaio libaio-devel compat-libstdc++-33 elfutils-libelf-devel是否全安装,甚至用python3 -c "import pwd; print(pwd.getpwnam('oracle').pw_uid)"精确验证oracle用户 UID 是否为 54321(这是 Oracle 推荐值,避免与系统用户冲突)。第二层是response.ora响应文件生成器,它用 Python 的jinja2模板引擎,根据precheck.sh的输出结果,动态填充oracle.install.db.config.starterdb.globalDBNameoracle.install.db.config.starterdb.SIDoracle.install.db.config.starterdb.characterSet等 37 个必填字段,比如characterSet不是固定写AL32UTF8,而是先执行locale -a | grep -i utf8 | head -1,如果返回空则强制设为ZHS16GBK,确保中文应用不乱码。第三层才是runInstaller -silent -responseFile /tmp/response.ora的调用,但它前面加了timeout 1800保护,超时自动 kill 并清理/tmp/OraInstall*临时目录,防止下次安装因残留文件失败。

这个方案的优势在于完全可控:所有操作都在宿主机真实文件系统上进行,systemd服务单元文件(/etc/systemd/system/oracle-db.service)可以精确控制After=network.targetWantedBy=multi-user.targetfirewalld规则用firewall-cmd --permanent --add-port=1521/tcp添加后立即--reloadSELinux上下文用semanage fcontext -a -t oracle_exec_t "/u01/app/oracle/product/11.2.0/db_1/bin(/.*)?"批量修正。没有抽象层,就没有意外。你看到的每一行命令,都能在终端里亲手敲出来,每一步失败,错误日志都清清楚楚写在/u01/app/oraInventory/logs/下,而不是藏在某个容器日志驱动的 JSON 文件里。

3. 核心细节解析与实操要点:从内核参数到监听器配置的魔鬼细节

3.1 内核参数的动态计算与安全边界

Oracle 11gR2 对共享内存的要求不是拍脑袋定的。kernel.shmmax必须 ≥SGA_MAX_SIZE,而SGA_MAX_SIZE又不能超过物理内存的 70%(官方白皮书建议值)。但 RHEL7.9 的free -m输出格式和 RHEL6 不同,Mem:行后面跟着的是totalusedfreesharedbuff/cacheavailable六列,其中available才是真正可用的内存(考虑了 page cache 回收),而不是free。所以precheck.sh里这行代码至关重要:

PHYSICAL_MEM_MB=$(awk '/MemAvailable:/ {printf "%.0f", $2/1024}' /proc/meminfo) SHMMAX=$((PHYSICAL_MEM_MB * 1024 * 1024 * 70 / 100)) echo "kernel.shmmax = $SHMMAX" >> /etc/sysctl.conf

注意这里用了MemAvailable而非MemFree,并且计算时乘以1024*1024转成字节,再乘以0.7。我曾经在一个 64GB 内存的服务器上,因为误用MemFree(当时显示只有 2GB),算出kernel.shmmax=2GB,结果数据库启动时报ORA-27102: out of memoryipcs -lm显示max total shared memory确实只有 2GB。后来改成MemAvailable,算出44GB,问题立刻解决。

另一个常被忽略的参数是fs.aio-max-nr。Oracle 11gR2 的异步 I/O 在高并发 OLTP 场景下极其关键,但它的默认值65536远远不够。precheck.sh会执行:

CURRENT_AIO=$(sysctl fs.aio-max-nr | awk '{print $3}') if [ "$CURRENT_AIO" -lt 1048576 ]; then echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf sysctl -p fi

为什么是1048576(1024K)?因为 Oracle 文档明确指出,aio-max-nr应该设置为processes参数的 2 倍,而processes默认是150,但生产环境通常设为500,所以1000是底线,1024K是向上取整的安全值。这个值如果太小,ALTER SYSTEM SET DISK_ASYNCH_IO=TRUE SCOPE=SPFILE会失败,v$parameterdisk_asynch_io始终为FALSE,I/O 性能直接打五折。

3.2oracle用户环境变量的隔离陷阱

RHEL7.9 的systemd有个致命特性:它启动的服务,其环境变量继承自systemd --system的初始环境,而不是/etc/profile~oracle/.bash_profile。这意味着,即使你在~oracle/.bash_profile里写了export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1systemd启动的oracle-db.service也完全看不到这个变量。解决方案是双管齐下:第一,在~oracle/.bash_profile里用export -p > /u01/app/oracle/env.sh生成一个纯export命令的脚本;第二,在oracle-db.serviceExecStart里写成/bin/bash -c "source /u01/app/oracle/env.sh && /u01/app/oracle/product/11.2.0/db_1/bin/dbstart /u01/app/oracle/product/11.2.0/db_1"。这样每次启动都重新加载环境,彻底规避systemd的环境隔离。

更隐蔽的坑在LD_LIBRARY_PATH。Oracle 11gR2 的libclntsh.so.11.1必须在LD_LIBRARY_PATH最前面,否则sqlplus会报libnnz11.so: cannot open shared object fileprecheck.sh会检测~oracle/.bash_profile里是否已存在LD_LIBRARY_PATH,如果存在,则用sed -i 's/^export LD_LIBRARY_PATH=.*$/export LD_LIBRARY_PATH=\/u01\/app\/oracle\/product\/11.2.0\/db_1\/lib:\&/' ~oracle/.bash_profile把 Oracle 的lib目录插到最前。这个操作必须在创建oracle用户后、安装前完成,否则runInstaller自己生成的oraenv脚本会覆盖你的修改。

3.3 监听器配置的HOST字段生死线

listener.ora里的HOST值,绝对不能写localhost127.0.0.1。这是 Oracle 11gR2 在 RHEL7.9 上最经典的连接失败原因。localhost会被解析为::1(IPv6),而 Oracle 11gR2 默认不监听 IPv6,导致tnsping显示OK(因为它走的是127.0.0.1),但远程客户端连接时ORA-12541: TNS:no listenerprecheck.sh会执行:

HOSTNAME=$(hostname -f 2>/dev/null || hostname) if echo "$HOSTNAME" | grep -q '\.'; then LISTENER_HOST="$HOSTNAME" else LISTENER_HOST=$(ip route get 8.8.8.8 | awk '{print $7}') fi

它优先取hostname -f的 FQDN(如db01.prod.example.com),如果失败(比如没配 DNS),就用ip route get获取默认路由的出口 IP(如192.168.1.100)。然后在response.ora模板里,oracle.install.db.config.starterdb.dbControlConfigurationType=NO_DBCONTROL这一行后面,强制插入:

oracle.install.db.config.starterdb.listenerPortNumber=1521 oracle.install.db.config.starterdb.listenerHostName=$LISTENER_HOST

这样生成的listener.ora就是:

LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) ) )

提示:ip route get 8.8.8.8这个技巧比hostname -I更可靠,因为hostname -I在某些多网卡服务器上会返回所有 IP,而ip route get只返回实际用于外网通信的那个 IP,这才是监听器该绑定的地址。

3.4 数据库字符集的终极妥协方案

AL32UTF8是国际化的黄金标准,但国内大量遗留系统(尤其是用 Delphi、PowerBuilder 开发的老财务软件)只认ZHS16GBK。强行用AL32UTF8INSERT INTO t VALUES ('测试')存进去是E6B58BE8AF95(UTF-8 编码),但老程序用ZHS16GBK解码,显示成娴嬭瘯precheck.sh的字符集探测逻辑是:先locale -a | grep -i 'zh_CN\|gbk',如果找到zh_CN.gbk,就设NLS_CHARACTERSET=ZHS16GBK;否则才用AL32UTF8。但这还不够,因为NLS_NCHAR_CHARACTERSET(国家字符集)必须和NLS_CHARACTERSET一致,否则CREATE TABLE t (c NCHAR(10))会报ORA-12714: invalid national character set specified。所以响应文件里必须同时指定:

oracle.install.db.config.starterdb.characterSet=ZHS16GBK oracle.install.db.config.starterdb.nationalCharacterSet=AL16UTF16

等等,这里矛盾了!NLS_NCHAR_CHARACTERSET必须是AL16UTF16,这是 Oracle 硬性规定,不能改。所以真正的妥协是:业务表用VARCHAR2(走ZHS16GBK),只在需要存储 emoji 或多语言混合数据时,才用NVARCHAR2(走AL16UTF16)。precheck.sh会在最后输出一行警告:“检测到 ZHS16GBK 字符集,建议所有业务表使用 VARCHAR2 类型,避免 NVARCHAR2”。

4. 实操过程与核心环节实现:从裸机到SELECT * FROM v$version的完整流水线

4.1 准备工作:ISO 挂载与基础包安装

假设你已经下载了rhel-server-7.9-x86_64-dvd.isolinux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip。第一步不是解压 Oracle,而是让 RHEL7.9 自身准备好。挂载 ISO:

mkdir -p /mnt/rhel79 mount -o loop rhel-server-7.9-x86_64-dvd.iso /mnt/rhel79

然后配置本地 YUM 源,避免安装过程被外网中断:

cat > /etc/yum.repos.d/local.repo << 'EOF' [local] name=Local RHEL7.9 DVD baseurl=file:///mnt/rhel79 enabled=1 gpgcheck=0 EOF yum clean all && yum makecache

现在安装 Oracle 依赖包。注意compat-libstdc++-33这个包在 RHEL7.9 的 ISO 里叫compat-libstdc++-33-3.2.3-72.el7.i686.rpm,必须手动安装,因为yum install compat-libstdc++-33会报错找不到包:

rpm -ivh /mnt/rhel79/Packages/compat-libstdc++-33-3.2.3-72.el7.i686.rpm yum install -y binutils gcc make glibc-devel ksh libaio libaio-devel elfutils-libelf-devel

注意:libaio-devel是开发头文件,libaio是运行时库,两者缺一不可。漏掉libaio-develrunInstaller会在 Linking 阶段报undefined reference to 'io_setup'

4.2 创建oracle用户与目录结构

严格遵循 Oracle 最佳实践,UID/GID 设为 54321:

groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba oracle echo "oracle:password123" | chpasswd

创建目录并赋权。/u01是 Oracle 推荐的主挂载点,/u01/app/oracle存放软件和数据文件,/u01/app/oraInventory存放全局库存:

mkdir -p /u01/app/oracle/product/11.2.0/db_1 mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01 chmod -R 775 /u01

关键一步:设置oracle用户的umask。在/home/oracle/.bash_profile末尾添加:

if [ $USER = "oracle" ]; then umask 022 fi

umask 022确保oracle用户创建的文件默认权限是644,目录是755,这是 Oracle 安装器能识别的唯一合法权限组合。umask 002会导致runInstallerPRVF-0002 : could not retrieve file permissions

4.3 静默安装执行与响应文件生成

解压 Oracle 安装包到/tmp/database

unzip linux.x64_11gR2_database_1of2.zip -d /tmp/ unzip linux.x64_11gR2_database_2of2.zip -d /tmp/

进入/tmp/database,运行precheck.sh(这个脚本我们前面已详细描述,此处略)。如果全部通过,它会生成/tmp/response.ora。现在执行静默安装:

cd /tmp/database ./runInstaller -silent -force -noconfig -responseFile /tmp/response.ora \ -ignorePrereqFailure \ -waitForCompletion \ -ignoreSysPrereqs \ -debug \ -logLevel 2

参数详解:

  • -ignorePrereqFailure:忽略非致命预检失败(如swap空间不足,但free -m显示available足够)
  • -waitForCompletion:阻塞等待,不返回 shell,方便捕获退出码
  • -ignoreSysPrereqs:跳过systemctl is-active firewalld这类服务状态检查(我们自己会关)
  • -debug -logLevel 2:开启最高级别调试日志,日志路径在/tmp/OraInstall<timestamp>/logs/

安装过程约 25-40 分钟,期间你会看到INFO: Completed Phase: Linking Libraries这样的关键节点。成功后,runInstaller会输出Successfully Setup Software.,并提示你以root用户执行两个脚本:

/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/db_1/root.sh

这两个脚本必须按顺序执行,且root.sh会自动调用orainstRoot.sh,所以只需执行root.sh即可。它会配置oraenv、设置ORACLE_HOME、注册systemd服务。

4.4 数据库创建与监听器启动

安装完软件只是第一步,还要创建数据库实例。Oracle 11gR2 的静默建库是通过dbca工具:

su - oracle -c "/u01/app/oracle/product/11.2.0/db_1/bin/dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl -sid orcl -responseFile NO_VALUE \ -characterSet ZHS16GBK \ -nationalCharacterSet AL16UTF16 \ -sysPassword password123 \ -systemPassword password123 \ -dbsnmpPassword password123 \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -storageType FS \ -memoryPercentage 40 \ -databaseType MULTIPURPOSE \ -automaticMemoryManagement FALSE \ -totalMemory 2048"

这里-automaticMemoryManagement FALSE是关键,因为 11gR2 的 AMM(自动内存管理)在 RHEL7.9 上与systemd的 cgroup 冲突,会导致SGA分配失败。我们显式关闭 AMM,用sga_targetpga_aggregate_target手动管理。

建库完成后,启动监听器:

su - oracle -c "/u01/app/oracle/product/11.2.0/db_1/bin/lsnrctl start"

验证监听器状态:

su - oracle -c "/u01/app/oracle/product/11.2.0/db_1/bin/lsnrctl status"

你应该看到Service "orcl" has 1 instance(s).Instance "orcl", status READY, has 1 handler(s) for this service...

4.5systemd服务注册与开机自启

创建/etc/systemd/system/oracle-db.service

[Unit] Description=Oracle Database Service After=network.target [Service] Type=forking User=oracle Group=oinstall Environment="ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1" Environment="ORACLE_SID=orcl" ExecStart=/u01/app/oracle/product/11.2.0/db_1/bin/dbstart $ORACLE_HOME ExecStop=/u01/app/oracle/product/11.2.0/db_1/bin/dbshut $ORACLE_HOME Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target

启用服务:

systemctl daemon-reload systemctl enable oracle-db.service systemctl start oracle-db.service

验证:

systemctl status oracle-db.service # 应该显示 active (running)

现在,你可以用任何客户端连接了:

sqlplus /nolog SQL> CONNECT / AS SYSDBA SQL> SELECT * FROM v$version;

输出应该是:

BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production PL/SQL Release 11.2.0.4.0 - Production CORE 11.2.0.4.0 Production TNS for Linux: Version 11.2.0.4.0 - Production NLSRTL Version 11.2.0.4.0 - Production

5. 常见问题与排查技巧实录:那些让你凌晨三点还在看日志的瞬间

5.1ORA-28547: connection to server failed, probable Oracle Net admin error

这个错误几乎 100% 是listener.oraHOST配置错误。排查三步法:

  1. su - oracle -c "lsnrctl status":看Listening Endpoints Summary里的HOST值是不是你期望的 IP;
  2. ping <HOST值>:确认该 IP 能 ping 通;
  3. telnet <HOST值> 1521:确认端口开放。

如果lsnrctl status显示HOST=localhost,立刻编辑/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora,把HOST=localhost改成HOST=192.168.1.100(你的服务器真实 IP),然后lsnrctl reload

实操心得:永远不要相信hostname命令的输出。用ip addr show查看所有网卡 IP,选那个和客户端在同一网段的 IP。如果客户端在192.168.1.0/24,服务器有192.168.1.10010.0.0.100两个 IP,必须选192.168.1.100

5.2ORA-00845: MEMORY_TARGET not supported on this system

这是tmpfs挂载点大小不足的经典错误。MEMORY_TARGET依赖/dev/shm,而 RHEL7.9 默认/dev/shm只有64MB。解决方案:

# 临时增大(重启失效) mount -o remount,size=4G /dev/shm # 永久生效,编辑 /etc/fstab echo "tmpfs /dev/shm tmpfs size=4G 0 0" >> /etc/fstab mount -a

4G是安全值,对应MEMORY_TARGET=3G/dev/shm大小必须 ≥MEMORY_TARGET,否则 Oracle 启动时会报错。

5.3PRVF-0002 : could not retrieve file permissions

这是umask设置错误的铁证。检查oracle用户的umask

su - oracle -c "umask" # 如果输出是 0002,立刻改 su - oracle -c "echo 'umask 022' >> ~/.bash_profile"

然后重新登录oracle用户,或者source ~/.bash_profile,再重跑runInstaller

5.4Error in invoking target 'agent nmhs' of makefile

这是gcc版本太高导致的编译失败。RHEL7.9 自带gcc 4.8.5,而 Oracle 11gR2 只认证到gcc 4.4。解决方案是降级gcc,但更稳妥的是打 Oracle 提供的p13390677_112040_Linux-x86-64.zip补丁:

unzip p13390677_112040_Linux-x86-64.zip -d /tmp/patch cd /tmp/patch/13390677 /u01/app/oracle/product/11.2.0/db_1/OPatch/opatch apply

这个补丁专门修复gcc 4.8+的兼容性问题,比降级gcc安全得多。

5.5 数据库启动后v$session里全是INACTIVE,但业务连不上

这通常是firewalld没关。systemctl stop firewalld && systemctl disable firewalld。如果客户要求firewalld必须开,则添加规则:

firewall-cmd --permanent --add-port=1521/tcp firewall-cmd --permanent --add-port=5500/tcp # OEM 端口 firewall-cmd --reload

5.6ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

监听器起来了,但没注册服务。检查tnsnames.ora里的SERVICE_NAME是否和v$database.name一致:

su - oracle -c "sqlplus / as sysdba << 'EOF' SELECT name FROM v\$database; EXIT; EOF"

如果输出是ORCL,但tnsnames.ora里写的是orcl.example.com,就会报这个错。统一改成ORCL即可。

6. 一键脚本的最终形态与交付物清单

我把所有上述逻辑,封装成了三个核心文件,放在 GitHub Gist 上(链接不提供,避免平台痕迹),交付物清单如下:

  • precheck.sh(1287 行):包含 37 项操作系统级检查,从SELinux状态到NTP服务,每项失败都有清晰的修复命令建议。
  • gen_response.py(412 行):用jinja2模板生成response.ora,支持ZHS16GBK/AL32UTF8自动切换,MEMORY_TARGET动态计算。
  • install_oracle.sh(89 行):主流程脚本,调用前两个脚本,处理runInstaller退出码,失败时自动清理/tmp/OraInstall*/u01/app/oracle

使用方法极简:

chmod +x precheck.sh gen_response.py install_oracle.sh ./precheck.sh ./gen_response.py ./install_oracle.sh

整个过程无需交互,全程静默。我在一台 4 核 8GB 内存的虚拟机上实测,从./precheck.sh开始到SELECT * FROM v$version成功,耗时 11 分 43 秒。脚本里所有路径、端口、密码都用变量定义,你可以用sed -i 's/password123/your_secure_password/g' *.sh一键替换。

最后再分享一个小技巧:如果客户环境网络完全隔离,无法访问公网,precheck.sh里的curl检查(如验证oracle.com是否可达)会超时。我在脚本里加了timeout 5 curl -I https://www.oracle.com 2>/dev/null | grep "HTTP/1.1 200",超时自动跳过,不影响主流程。真正的健壮,不是追求完美,而是知道哪里可以优雅地失败。

http://www.jsqmd.com/news/1149547/

相关文章:

  • Triton Inference Server动态批处理:并发请求下的吞吐与延迟权衡
  • OpenStack Nova手动安装配置指南:从源码到生产级部署
  • 终极指南:如何用FigmaToCode在5分钟内将设计稿变成可运行代码
  • RA6M5评估套件直流电机控制实战指南
  • 2026年AI自动化测试平台TOP10盘点
  • 条件流建模的边界一致性:从物理约束到工程落地
  • Node.js Windows安装配置:解决npm.ps1报错与全局路径问题
  • 缠论可视化通达信插件:免费快速掌握专业缠论分析技术
  • Codex CLI 实战指南:Windows/Mac 本地安装与 DeepSeek 模型配置
  • Khalil《非线性系统》第3版:平衡点计算与线性化实战 3 步法
  • MATLAB语音识别入门实战:MFCC特征提取+神经网络训练+4段测试音频一键运行
  • iframe 内嵌登录状态同步:从 Cookie 到 postMessage + localStorage 的 2 步迁移实战
  • Gemini 3.5 Flash:软硬协同的低延迟推理架构解析
  • Openclaw:ClaudeCode 的飞书与Discord神经接口
  • 云服务器传代码:scp/ssh/unzip 实操避坑指南
  • Windows本地部署OpenClaw+飞书Agent实战指南
  • 0元部署OpenClaw轻量AI助手:云服务器选型与实战指南
  • Hermes-Web-UI:在极空间NAS上部署OpenCLAW语音助手的Docker实践
  • TB6593FNG与PIC18LF47K42的直流电机双闭环控制方案
  • TB6593FNG与PIC18F86J50的直流电机控制方案详解
  • 免费查AIGC工具推荐:中英文AI率一键检测
  • 基于arduino单片机万年历的电子万年历数字时钟电子日历闹钟温度31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • WAM-Nav:无地图异步视觉导航框架原理与部署实践
  • 索尼相机终极解锁指南:3步免费开启30+隐藏语言和无限录制功能
  • 机器人视觉系统集成避坑指南:2D与3D相机选型的5个关键参数实测
  • Windows下Node.js环境配置:PATH、NODE_HOME与PowerShell策略详解
  • OpenCode终端AI编程工作流:TUI原生、深度上下文与模型无关的命令行开发增强
  • GEARS 0.1.0 双图神经网络架构解析:从基因/扰动嵌入到组合效应预测的5层设计
  • 高校社团管理毕设实战项目:Vue2+SpringBoot双端可运行,带权限分级与Redis会话缓存
  • multica多智能体协同系统部署实战:轻中心化架构落地指南