1. 为什么 RedHat 8.9 上装 Oracle 12cR2 单机不能照搬 7.9 的脚本你手头有一份在 RedHat 7.9 上跑得飞起的 Oracle 12cR2 一键安装脚本兴冲冲地把它拷到一台全新的 RedHat 8.9 服务器上执行./OracleShellInstall -n rhel8 -op oracle ...结果卡在“正在安装依赖包”这一步报错信息密密麻麻全是No match for argument: xxx或者Error: Unable to find a match: yyy。别急着骂脚本作者这根本不是脚本的问题而是 RedHat 8.x 和 7.x 之间那道看不见却无比坚硬的“代际鸿沟”。RedHat 8.9 的核心变化是彻底告别了yum拥抱了dnf作为默认的包管理器。这听起来只是换了个命令名但背后是整个软件仓库生态、依赖解析引擎和元数据格式的全面升级。yum在 8.x 上只是一个指向dnf的软链接而很多老脚本里硬编码的yum install -y gcc-c这类命令在 8.9 上会因为dnf对依赖关系更严格的校验而直接失败——它不会像yum那样“将就”而是会明确告诉你“这个包名在当前启用的仓库里根本不存在或者它的依赖链有冲突。”更关键的是Oracle 12cR212.2.0.1官方文档明确标注的最低支持操作系统版本是 RedHat 7对 8.x 的支持属于“Certified on RHEL 8”范畴这意味着它需要额外的兼容性补丁和特定的内核参数。我第一次在 8.9 上部署时就栽在了transparent_hugepage这个坑里。脚本里沿用 7.9 的echo never /sys/kernel/mm/transparent_hugepage/enabled命令在 8.9 上执行后cat一看值又变回always了。后来才搞明白8.9 的 systemd 启动流程里tuned服务会接管内存管理策略你手动改的瞬间就会被它覆盖。这根本不是脚本写错了而是你没跟上操作系统的“新规矩”。所以所谓“一键安装”从来不是把脚本复制粘贴就完事。它是一套与操作系统发行版深度耦合的精密工艺。RedHat 8.9 的dnf、systemd、tuned、grubby每一个组件都像一个齿轮必须严丝合缝地咬合在一起才能让 Oracle 这台“老式蒸汽机”在现代的“数字高速公路”上平稳运行。接下来的内容就是我把这套在生产环境反复验证、踩过所有坑之后总结出来的、专为 RedHat 8.9 定制的完整方案。2. 环境准备从零开始构建一个“无菌”的 Oracle 温床在 RedHat 8.9 上启动 Oracle 安装之前你面对的不是一个空白画布而是一块需要被彻底消毒、平整、施肥的土壤。任何微小的疏忽比如一个未关闭的 SELinux都可能在数据库创建的最后一步让你功亏一篑。下面是我经过数十次重装后提炼出的、不可跳过的“无菌”准备清单。2.1 操作系统基础配置图形化不是可选项而是必选项Oracle 12cR2 的 Database Configuration Assistant (DBCA) 在静默模式下虽然可以工作但其内部的某些校验逻辑尤其是关于字体渲染和 GUI 库的依赖在纯字符终端下会异常脆弱。RedHat 8.9 默认安装的最小化系统缺少大量 X11 相关的库。因此强烈建议在安装操作系统时直接选择“Server with GUI”。这不是为了让你去点鼠标而是为了确保底层的libXtst.so,libXrender.so,libXft.so等关键库已就位。如果你已经装好了最小化系统那么请执行以下命令来补全# 启用高可用性仓库HA repo它包含了 Oracle 所需的额外依赖 dnf config-manager --enable codeready-builder-for-rhel-8-x86_64-rpms # 安装基础 GUI 库即使你不打算用 GUI dnf groupinstall Server with GUI -y # 安装 Oracle 明确要求的开发工具组 dnf groupinstall Development Tools -y提示codeready-builder-for-rhel-8-x86_64-rpms是 RedHat 8.x 的“万能钥匙”仓库。它里面包含了gcc,gcc-c,glibc-devel,libaio-devel,ksh,make,sysstat,unixODBC-devel等所有 Oracle 官方文档列出的依赖包。不启用这个仓库你后续会陷入无穷无尽的No match for argument循环。2.2 网络与主机名一个字符都不能错的“身份证”Oracle 对主机名的解析有着近乎偏执的要求。它不仅要求/etc/hosts文件里有正确的条目还要求hostname命令返回的值与/etc/hostname文件内容完全一致并且这个主机名必须能通过nslookup或dig正向和反向解析即使你用的是本地 hosts 解析。假设你的服务器 IP 是192.168.10.50规划的主机名是ora89db那么你需要按顺序执行以下操作# 1. 设置主机名永久生效 hostnamectl set-hostname ora89db # 2. 编辑 /etc/hostname确保内容只有这一行 echo ora89db /etc/hostname # 3. 编辑 /etc/hosts添加两行注意必须是 IPv4 地址不能用 ::1 echo 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 /etc/hosts echo 192.168.10.50 ora89db ora89db.localdomain /etc/hosts # 4. 验证三步缺一不可 hostname # 输出应为 ora89db cat /etc/hostname # 输出应为 ora89db ping -c 1 ora89db # 必须能 ping 通注意ping测试是关键。如果ping ora89db失败DBCA 在创建数据库时会卡在“Configuring Oracle Net Services”阶段报错ORA-12545: Connect failed because target host or object does not exist。这不是网络问题纯粹是 Oracle 自己的解析逻辑在作祟。2.3 存储规划/u01和/oradata的物理意义Oracle 的安装目录 ($ORACLE_HOME) 和数据文件目录 ($ORACLE_BASE/oradata) 的规划直接决定了你未来三年的运维体验。我见过太多人把两者都放在/根分区下结果数据库跑了一年/分区爆满连df -h都执行不了。标准的、生产级的规划如下目录路径推荐大小用途说明关键挂载选项/u01≥ 15GB$ORACLE_HOME存放 Oracle 软件二进制文件noatime, nodiratime/oradata≥ 50GB$ORACLE_BASE/oradata存放数据文件、控制文件、联机日志noatime, nodiratime, xfs为什么是 XFS因为 RedHat 8.9 默认文件系统是 XFS它对大文件如 Oracle 的数据文件的读写性能和扩展性远超 ext4。挂载时加上noatime和nodiratime可以避免每次文件访问都更新时间戳这对 I/O 密集型的数据库至关重要。创建并挂载的完整命令# 假设你有一块新磁盘 /dev/sdb fdisk /dev/sdb # 创建一个主分区 /dev/sdb1 mkfs.xfs -f /dev/sdb1 mkdir -p /u01 /oradata echo /dev/sdb1 /u01 xfs defaults,noatime,nodiratime 0 0 /etc/fstab echo /dev/sdb1 /oradata xfs defaults,noatime,nodiratime 0 0 /etc/fstab mount -a chown -R oracle:oinstall /u01 /oradata chmod -R 755 /u01 /oradata3. 核心依赖与内核调优让操作系统为 Oracle “让路”Oracle 不是一个普通的应用它是一个“操作系统之上的操作系统”。它需要操作系统为其让出一部分资源管理权。在 RedHat 8.9 上这主要体现在两个层面软件包依赖和内核参数调优。3.1 DNF 依赖包安装一份精确到版本号的清单RedHat 8.9 的dnf仓库结构比 7.9 更加模块化很多包被拆分到了不同的流stream中。以下是经过实测、能 100% 保证 Oracle 12cR2 安装成功的依赖包清单请务必逐条执行不要合并成一条dnf install命令因为某些包的安装顺序是有依赖关系的# 1. 启用必要的仓库流 dnf config-manager --set-enabled crb dnf config-manager --set-enabled codeready-builder-for-rhel-8-x86_64-rpms # 2. 安装基础开发库顺序很重要 dnf install -y glibc-devel dnf install -y libaio-devel dnf install -y unixODBC-devel dnf install -y ksh dnf install -y make dnf install -y sysstat # 3. 安装 Oracle 特定的兼容性库这是 8.9 独有的关键步骤 dnf install -y compat-libcap1 dnf install -y compat-libstdc-33 # 4. 验证安装结果必须看到所有包的状态都是 installed rpm -qa | grep -E (glibc-devel|libaio-devel|unixODBC-devel|ksh|make|sysstat|compat-libcap1|compat-libstdc)注意compat-libcap1和compat-libstdc-33这两个包是 Oracle 12cR2 的“遗老遗少”。它们是为兼容旧版 glibc 和 libstdc 而设计的在 8.9 的新环境中是必需的。漏掉任何一个runInstaller在启动时就会报error while loading shared libraries: libcap.so.1或类似的错误直接退出。3.2 内核参数调优sysctl.conf的每一行都是血泪教训RedHat 8.9 的内核4.18默认参数是为通用服务器优化的而 Oracle 需要的是极致的内存和进程管理。下面这份sysctl.conf配置是我从 Oracle 官方文档、Metalink 文档以及无数次ORA-27102: out of memory报错中总结出来的黄金组合# 编辑 /etc/sysctl.conf cat /etc/sysctl.conf EOF # 共享内存段SHMMAX必须大于 SGA_MAX_SIZE这里设为 16GB kernel.shmall 4194304 kernel.shmmax 17179869184 kernel.shmmni 4096 # 信号量SEMMNS必须足够大以支持大量并发连接 kernel.sem 250 32000 100 128 # 文件句柄数必须足够大否则会遇到 ORA-20000: unable to open file 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 4194304 # 内存过度分配Oracle 强烈推荐设为 1 vm.overcommit_memory 1 vm.swappiness 1 EOF # 立即应用 sysctl -p其中vm.overcommit_memory 1是最具争议也最关键的设置。它告诉内核“允许进程申请超过物理内存交换空间总和的内存”。Oracle 的 SGA共享全局区在启动时会一次性mmap几 GB 的内存如果设为默认的0启发式检查内核会因为无法预估其实际使用量而拒绝分配导致ORA-27102。设为1后内核只做简单的“总量检查”只要不超过vm.overcommit_ratio的限制即可这正是 Oracle 所需的“信任模式”。3.3 透明大页THP与 NUMA必须亲手“拧断”的两根保险丝RedHat 8.9 默认启用了transparent_hugepageTHP和numa_balancing这两项技术对大多数应用是福音但对 Oracle 数据库却是“毒药”。THP 的危害Oracle 的内存管理器MMAN自己就是一套成熟的、针对数据库负载优化的内存分配算法。THP 的自动合并和拆分行为会与 MMAN 发生严重冲突导致严重的内存碎片和 CPU 空转表现为DB CPU等待事件飙升。NUMA 的危害在多路 CPU 服务器上NUMA 平衡会尝试将进程迁移到离其内存最近的 CPU 上。但对于 Oracle 这种需要跨 CPU 访问大量共享内存的进程频繁的迁移反而会造成巨大的延迟。在 8.9 上禁用它们的方法与 7.9 截然不同必须通过grubby修改内核启动参数# 查看当前默认内核 grubby --default-kernel # 为当前默认内核添加启动参数 grubby --argstransparent_hugepagenever numa_balancingdisabled --update-kernel$(grubby --default-kernel) # 重启后验证 reboot # 重启后执行 cat /sys/kernel/mm/transparent_hugepage/enabled # 输出应为 [never] cat /proc/sys/kernel/numa_balancing # 输出应为 0提示grubby是 RedHat 8.x 的标准内核参数管理工具。直接编辑/boot/grub2/grub.cfg是危险且无效的因为该文件会在dnf update kernel后被自动重写。4. 用户、组与环境变量Oracle 运行的“宪法”Oracle 数据库不是以root身份运行的它需要一个严格定义的、权限最小化的运行环境。这个环境由用户、组和一系列环境变量共同构成它们共同构成了 Oracle 的“宪法”。任何一项配置错误都会导致sqlplus找不到库或者lsnrctl启动失败。4.1 创建用户与组oinstall和dba的神圣分工Oracle 官方强烈建议使用两个独立的组oinstallOracle 安装组和dba数据库管理员组。这种分离是安全最佳实践的核心。# 创建组GID 必须是固定的这是 Oracle 的硬性要求 groupadd -g 501 oinstall groupadd -g 502 dba groupadd -g 503 oper # 创建 oracle 用户UID 固定为 501主组为 oinstall附加组为 dba 和 oper useradd -u 501 -g oinstall -G dba,oper oracle # 为 oracle 用户设置密码生产环境请使用强密码 echo oracle:MySecurePass123! | chpasswd # 设置 oracle 用户的家目录权限 mkdir -p /home/oracle chown -R oracle:oinstall /home/oracle chmod 755 /home/oracle注意-u 501和-g 501的 UID/GID 数字不是随意选的它是 Oracle 安装程序内部硬编码的检查项。如果你用了其他数字runInstaller会直接报错The user you are trying to install as is not in the correct group.4.2 环境变量配置.bash_profile里的“圣杯”Oracle 的所有命令sqlplus,rman,lsnrctl都依赖于几个核心环境变量。它们必须被精确地、无一遗漏地设置在oracle用户的.bash_profile中。以下是我的标准模板它经过了数百次source ~/.bash_profile echo $ORACLE_HOME的验证# 切换到 oracle 用户 su - oracle # 编辑 .bash_profile cat ~/.bash_profile EOF # Oracle Environment Variables export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/12.2.0/dbhome_1 export ORACLE_SIDlucifer export PATH$ORACLE_HOME/bin:/usr/sbin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/lib:/usr/lib export CLASSPATH$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib # 防止 SQL*Plus 启动时出现乱码关键 export NLS_LANGAMERICAN_AMERICA.AL32UTF8 # 为 DBA 工具提供便捷别名 alias sassqlplus / as sysdba alias lsnrlsnrctl alias tnspingtnsping # 加载 Oracle 的环境脚本如果存在 if [ -f $ORACLE_HOME/oracle_env.sh ]; then . $ORACLE_HOME/oracle_env.sh fi EOF # 立即生效 source ~/.bash_profile其中NLS_LANG的设置是解决sqlplus中文乱码的终极方案。AMERICAN_AMERICA.AL32UTF8表示客户端使用 UTF-8 字符集与数据库通信。如果数据库的字符集是AL32UTF8这是 12cR2 的默认值那么这个设置就能保证一切正常。如果数据库是ZHS16GBK则需要相应改为AMERICAN_AMERICA.ZHS16GBK。4.3 用户资源限制/etc/security/limits.conf的隐形枷锁Linux 系统对每个用户的进程数、打开文件数等都有默认限制。对于一个可能承载数千并发连接的 Oracle 数据库这些默认值通常是 1024简直是灾难。编辑/etc/security/limits.conf为oracle用户添加以下行# 编辑 limits.conf cat /etc/security/limits.conf EOF oracle soft nofile 65536 oracle hard nofile 65536 oracle soft nproc 16384 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 oracle soft memlock 32768 oracle hard memlock 32768 EOF然后必须确保 PAM 模块pam_limits.so已被启用。检查/etc/pam.d/login文件确认包含以下行session required pam_limits.so如果没有就手动添加。否则上面的limits.conf配置将完全失效ulimit -n命令永远显示1024。5. 安装与创建从解压到SQL Connected.的完整旅程万事俱备现在终于到了最激动人心的环节执行安装。这个过程分为两个阶段第一阶段是安装 Oracle 软件runInstaller第二阶段是创建数据库实例DBCA。我们将全程使用静默Silent模式因为它最稳定、最可重复。5.1 准备安装介质LINUX.X64_122010_db_home.zip的正确解压方式Oracle 12cR2 的安装包是一个巨大的 ZIP 文件。在 RedHat 8.9 上直接用unzip解压可能会因为文件名编码问题导致部分文件损坏。最稳妥的方式是使用jar命令Java 自带# 切换到 root 用户进入安装包所在目录例如 /soft cd /soft # 使用 jar 命令解压比 unzip 更可靠 jar -xvf LINUX.X64_122010_db_home.zip # 解压完成后你会得到一个名为 database 的目录 ls -l database/ # 输出应包含 response/ install/ stage/ 等子目录5.2 静默安装 Oracle 软件response/db_install.rsp的定制化Oracle 的静默安装依赖于一个响应文件response file。我们不能直接使用安装包里自带的模板必须根据 RedHat 8.9 的环境进行深度定制。首先复制模板cp /soft/database/response/db_install.rsp /tmp/db_install_89.rsp然后用sed命令批量修改关键参数这是高效、无误的秘诀sed -i s/^oracle.install.option.*$/oracle.install.optionINSTALL_DB_SWONLY/ /tmp/db_install_89.rsp sed -i s/^ORACLE_HOSTNAME.*$/ORACLE_HOSTNAMEora89db/ /tmp/db_install_89.rsp sed -i s/^UNIX_GROUP_NAME.*$/UNIX_GROUP_NAMEoinstall/ /tmp/db_install_89.rsp sed -i s/^INVENTORY_LOCATION.*$/INVENTORY_LOCATION\/u01\/app\/oraInventory/ /tmp/db_install_89.rsp sed -i s/^SELECTED_LANGUAGES.*$/SELECTED_LANGUAGESen,zh_CN/ /tmp/db_install_89.rsp sed -i s/^ORACLE_HOME.*$/ORACLE_HOME\/u01\/app\/oracle\/product\/12.2.0\/dbhome_1/ /tmp/db_install_89.rsp sed -i s/^ORACLE_BASE.*$/ORACLE_BASE\/u01\/app\/oracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.InstallEdition.*$/oracle.install.db.InstallEditionEE/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.isCustomInstall.*$/oracle.install.db.isCustomInstalltrue/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.customComponents.*$/oracle.install.db.customComponentsoracle.rdbms.util:12.2.0.1.0,oracle.rdbms.rsf:12.2.0.1.0,oracle.swd.oui:12.2.0.1.0/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.DBA_GROUP.*$/oracle.install.db.DBA_GROUPdba/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.OPER_GROUP.*$/oracle.install.db.OPER_GROUPoper/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.BACKUPDBA_GROUP.*$/oracle.install.db.BACKUPDBA_GROUPbackupdba/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.DGDBA_GROUP.*$/oracle.install.db.DGDBA_GROUPdgdba/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.KMDBA_GROUP.*$/oracle.install.db.KMDBA_GROUPkmdba/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.type.*$/oracle.install.db.config.starterdb.typeGENERAL_PURPOSE/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.globalDBName.*$/oracle.install.db.config.starterdb.globalDBNamelucifer/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.SID.*$/oracle.install.db.config.starterdb.SIDlucifer/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.characterSet.*$/oracle.install.db.config.starterdb.characterSetAL32UTF8/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.memoryOption.*$/oracle.install.db.config.starterdb.memoryOptiontrue/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.memoryLimit.*$/oracle.install.db.config.starterdb.memoryLimit2048/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.password.ALL.*$/oracle.install.db.config.starterdb.password.ALLoracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.password.SYS.*$/oracle.install.db.config.starterdb.password.SYSoracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.password.SYSTEM.*$/oracle.install.db.config.starterdb.password.SYSTEMoracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.password.DBSNMP.*$/oracle.install.db.config.starterdb.password.DBSNMPoracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.password.SYSMAN.*$/oracle.install.db.config.starterdb.password.SYSMANoracle/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.enableRecovery.*$/oracle.install.db.config.starterdb.enableRecoveryfalse/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.storageType.*$/oracle.install.db.config.starterdb.storageTypeFILE_SYSTEM_STORAGE/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.fileSystemStorage.dataLocation.*$/oracle.install.db.config.starterdb.fileSystemStorage.dataLocation\/oradata/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation.*$/oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation\/oradata\/fast_recovery_area/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.automatedBackupEnabled.*$/oracle.install.db.config.starterdb.automatedBackupEnabledfalse/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.autoBackupDest.*$/oracle.install.db.config.starterdb.autoBackupDest\/oradata\/fast_recovery_area/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.storageType.*$/oracle.install.db.config.starterdb.storageTypeFILE_SYSTEM_STORAGE/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.fileSystemStorage.dataLocation.*$/oracle.install.db.config.starterdb.fileSystemStorage.dataLocation\/oradata/ /tmp/db_install_89.rsp sed -i s/^oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation.*$/oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation\/oradata\/fast_recovery_area/ /tmp/db_install_89.rsp提示上面的sed命令之所以如此冗长是因为它确保了每一个参数都被精确地、无歧义地替换。^和$锚定了行首和行尾避免了部分匹配导致的错误。这是我在线上环境反复验证后得出的最安全的修改方式。5.3 执行静默安装runInstaller的终极命令一切准备就绪现在执行安装# 切换到 oracle 用户 su - oracle # 进入 database 目录 cd /soft/database # 执行静默安装关键必须指定 -ignorePrereq因为 8.9 的某些检查会误报 ./runInstaller -silent -force -ignorePrereq -responseFile /tmp/db_install_89.rsp -waitforcompletion -ignoreSysPrereqs # 安装过程大约需要 20-30 分钟请耐心等待 # 当看到 Successfully Setup Software. 时表示软件安装成功安装成功后runInstaller会提示你以root身份运行两个脚本# 切换回 root su - # 运行第一个脚本设置全局环境 /u01/app/oraInventory/orainstRoot.sh # 运行第二个脚本设置 Oracle Home 权限 /u01/app/oracle/product/12.2.0/dbhome_1/root.sh这两个脚本的输出中必须看到Finished running generic part of root script.和Finished execution of /u01/app/oracle/product/12.2.0/dbhome_1/root.sh才算真正完成。5.4 创建数据库实例dbca静默模式的黄金配置软件安装完毕现在用dbca创建数据库。同样我们需要一个定制的响应文件# 创建一个空的响应文件 cat /tmp/dbca.rsp EOF [GENERAL] RESPONSEFILE_VERSION 12.2.0 OPERATION_TYPE createDatabase [CREATEDATABASE] GDBNAME lucifer SID lucifer DATABASETYPE MULTIPURPOSE TEMPLATENAME General_Purpose.dbc SYSPASSWORD oracle SYSTEMPASSWORD oracle SYSMANPASSWORD oracle DBSNMPPASSWORD oracle STORAGETYPE FILE_SYSTEM_STORAGE DISKGROUPNAME DATAFILEDESTINATION /oradata RECOVERYAREADESTINATION /oradata/fast_recovery_area CHARACTERSET AL32UTF8 NATIONALCHARACTERSET AL16UTF16 TOTALMEMORY 2048 EOF然后执行创建命令# 切换到 oracle 用户 su - oracle # 执行静默建库 $ORACLE_HOME/bin/dbca -silent -responseFile /tmp/dbca.rsp # 建库过程大约需要 10-15 分钟 # 当看到 Copying database files... 和最终的 Database creation complete. 时大功告成最后验证你的成果# 连接数据库 sqlplus / as sysdba # 在 SQL*Plus 中执行 SQL select instance_name, status from v$instance; # 输出应为lucifer OPEN SQL select name, open_mode from v$database; # 输出应为LUCIFER READ WRITE SQL exit当你看到Connected to an idle instance.然后变成Connected to:最后SQL Connected.那一刻所有的等待和调试都值得了。你已经在 RedHat 8.9 上亲手打造了一个坚如磐石的 Oracle 12cR2 单机数据库。6. 验证与收尾让数据库从“能用”到“好用”安装完成只是万里长征的第一步。一个真正“好用”的数据库还需要最后几道精雕细琢的工序它们决定了你未来是轻松惬意还是焦头烂额。6.1 监听器Listener的健壮性测试监听器是数据库的“门卫”它的稳定性直接决定了应用能否连上。在 RedHat 8.9 上lsnrctl的默认配置有时会因为tuned服务的干扰而变得不稳定。首先检查监听器状态lsnrctl status如果输出中Listening Endpoints Summary下没有PORT1521的条目或者Services Summary里没有你的lucifer服务那就说明监听器没起来。此时不要慌先检查listener.oracat $ORACLE_HOME/network/admin/listener.ora确保里面包含类似这样的内容LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST ora89db)(PORT 1521)) (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) ) )最关键的是(HOST ora89db)这一行。如果这里写的是localhost或者 IP 地址lsnrctl start可能会失败。必须是hostname命令返回的那个名字。然后强制重启监听器lsnrctl stop lsnrctl start6.2 TNSNAMES.ORA应用连接的“地图”为了让外部应用比如 Java 应用、PL/SQL Developer能连接到你的数据库你必须在$ORACLE_HOME/network/admin/tnsnames.ora文件中为你的数据库创建一个服务名Service Name。添加以下内容cat $ORACLE_HOME/network/admin/tnsnames.ora EOF LUC