尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Red Hat 6.8安装Oracle 12c实战:从系统准备到常见报错全流程

Red Hat 6.8安装Oracle 12c实战:从系统准备到常见报错全流程 接到在 Red Hat 6.8 上装 Oracle 12c 的时候我一开始以为这就是个“解压、下一步、下一步、完成”的活儿。可真操作起来才发现麻烦全藏在你看不见的地方装到一半找不到某个 32 位兼容库、图形界面死活起不来、前提条件检查红了一大片、最后监听又连不上。这台机器我前前后后折腾了一整天把每个坑都踩了一遍才把库干干净净地建起来。这篇文章就把完整过程梳理出来从系统准备到内核参数、从建用户到跑 DBCA一直到开机自启和常见报错排查全部按 Red Hat 6.8 的实际操作顺序来写。理论上只要是 RHEL 6 系的发行版这套流程都通用Oracle Linux 6 更是可以直接照搬。1. 安装介质与系统摸底先把准备工作做扎实1.1 确认系统版本和内核别拿到 7 的资料硬套Red Hat 6.8 用的还是 2.6.32 内核和 RHEL 7 的 3.10 内核差别很大。这直接决定了 Oracle 12c 在安装时的很多底层行为特别是compat-libstdc这类 32 位兼容库的依赖关系。装之前先三件事cat /etc/redhat-release uname -r df -h /u01Oracle 12c 对磁盘的需求比想象中大数据库软件加上实例数据建议至少预留 50G 到 80G 空间。尤其是你后面还要开归档日志、装补丁磁盘小了光清理就能烦死你。内存方面2G 勉强能跑4G 以上才顺畅官方最低要求是 1G 但实际测试中低于 2G 建库时 OUI 会慢到怀疑人生。1.2 依赖包清单宁可多装不要等报错了再回头这是我踩坑最多的地方。RHEL 6.8 的默认最小化安装缺一堆库Oracle 的安装前置检查会报各种missing required package。把下面这串一次性装全yum install -y binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libXi libXtst make sysstat \ numactl-devel unixODBC unixODBC-devel elfutils-libelf-devel如果 yum 源没配好直接挂载 RHEL 6.8 ISO 后用本地源安装也行。关键是compat-libstdc-33这个包RHEL 6 默认源里经常找不到需要从 ISO 的Packages目录下手动装mount -o loop rhel-server-6.8-x86_64-dvd.iso /mnt cd /mnt/Packages rpm -ivh compat-libstdc-33-*.rpm另外提醒一句ksh这个包也容易漏Oracle 12c 的安装脚本会调用 ksh 执行一些预检查脚本没装会直接导致runInstaller启动失败。1.3 内核参数调整与生效验证Oracle 12c 对内核参数有硬性要求特别是共享内存和信号量。编辑/etc/sysctl.conf追加以下内容fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 2097152 kernel.shmmax 536870912 kernel.shmmni 4096 kernel.sem 250 32000 100 128 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这里需要解释一下为什么是这些值。kernel.shmmax表示单个共享内存段的最大大小Oracle SGA 通常建立在一个或多个共享内存段上如果这个值设小了实例启动时会报ORA-27102: out of memory。官方推荐设为物理内存的一半。比如机器有 8G 内存可以考虑设置成4294967296。kernel.sem的四个数字分别代表信号量最大值、系统范围最大值、每次操作最大值和信号量集合数量Oracle 官方要求的250 32000 100 128在绝大多数场景下都不会触发信号量瓶颈。net.ipv4.ip_local_port_range这个很多人会忽略但它直接影响数据库连接数。Linux 默认端口范围是32768 61000Oracle 建议扩展到9000 65500。当你的应用同时建立的连接多了源端口不够用就会出现奇怪的连接超时。改完后执行sysctl -p然后验证sysctl kernel.shmmax sysctl kernel.sem如果在/proc/sys/kernel/shmmax里看到生效后的值就说明内核参数没问题了。2. 用户、目录和环境变量一个都不能错2.1 用户和组的概念Oracle 安装要求使用专用用户不允许用 root 直接装。这里面的逻辑不仅仅是安全考虑更是权限模型的问题。Oracle 软件在运行过程中会涉及很多文件的操作如果全部用 root 跑权限边界会乱掉而且数据库实例进程绝对不能以 root 身份运行。标准做法是创建两个组oinstall和dba如果后续要搭 RAC 或者 Data Guard还会用到oper、backupdba、dgdba、kmdba等组但单实例装这两个就够了。groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle注意-g指定主组-G指定附加组。把 oracle 用户的主组设成oinstall同时让它成为dba组成员。这样既能保证软件文件归属oinstall组又允许 oracle 用户执行 DBA 管理任务权限分离清晰。2.2 目录规划ORACLE_BASE 和 ORACLE_HOME 不能搞混我见过不少新手把ORACLE_HOME直接设在ORACLE_BASE下或者干脆混用一个目录。Oracle 12c 引入的 Optimum Flexible ArchitectureOFA标准对目录结构有明确的约定/u01/app/oracle -- ORACLE_BASE放管理员文件和启动脚本 /u01/app/oracle/product/12.1.0/dbhome_1 -- ORACLE_HOME放数据库软件 /u01/app/oraInventory -- 安装清单记录装的组件有的文档把 OraceHome 写成/u01/app/oracle/product/12.2.0/dbhome_1具体版本号根据自己的安装包来。目录创建命令mkdir -p /u01/app/oracle/product/12.1.0/dbhome_1 mkdir -p /u01/app/oraInventory chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app权限这里提一个细节oraInventory目录如果权限不对安装器启动时就会报OUI-10054类似的错误。755 会导致 oracle 用户无法写入建议统一 775。2.3 .bash_profile 的环境变量配置切到 oracle 用户编辑~/.bash_profilevi /home/oracle/.bash_profile写入以下内容export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/12.1.0/dbhome_1 export ORACLE_SIDorcl export PATH$PATH:$HOME/bin:$ORACLE_HOME/bin export LD_LIBRARY_PATH$ORACLE_HOME/lib:$LD_LIBRARY_PATH export NLS_LANGSIMPLIFIED CHINESE_CHINA.ZHS16GBKNLS_LANG这个变量建议在安装前就设置好。如果你用中文环境装数据库字符集选择会比英文环境少很多。更麻烦的是如果前面已经用默认英文装完了库再回头改NLS_LANG字符集转换会让你痛不欲生。所以最好在安装阶段就把字符集规划好。我用的是ZHS16GBK如果你的应用需要支持多国语言可能要考虑AL32UTF8。设置完后执行source ~/.bash_profile再用echo $ORACLE_HOME验证。这里我特意建议把ORACLE_HOME写得相对固定不要在.bash_profile里用通配符动态拼因为后续执行dbca、sqlplus等工具时脚本会基于这个绝对路径来找库。3. 安装包解压与图形界面启动最容易卡住的一关3.1 传输安装包和解压Oracle 12c 的安装包从官网下载后通常是两个 zip 文件比如linuxamd64_12102_database_1of2.zip和linuxamd64_12102_database_2of2.zip。一定要两个都下载少一个解压都会报缺失文件。解压时要注意不能分别解压到两个目录再合并必须先把两个文件放到同一目录下然后依次解压到同一个路径cd /u01/software unzip linuxamd64_12102_database_1of2.zip unzip linuxamd64_12102_database_2of2.zip解压后会出现一个database目录。如果解压过程出现中文乱码建议用unzip -O CP936指定编码避免解压出来一堆乱码文件名后期引用出错。3.2 DISPLAY 和 xhost图形界面起不来的根因Oracle 12c 的安装器runInstaller默认是图形界面。如果你的服务器没有桌面环境需要通过 X11 转发在本地电脑上弹出安装窗口。这里有两个前置条件本地电脑要有一个 X ServerWindows 上常见的有 MobaXterm、XmingSSH 转发要开启 X11 功能首先确认 vnc 或 xterm 是否安装了rpm -qa | grep xterm rpm -qa | grep vnc如果没有直接 yum 安装yum install -y xterm vnc然后用 oracle 用户切换到database目录启动安装器export DISPLAY192.168.1.100:0.0 xhost ./runInstallerDISPLAY里的 IP 是你本地电脑的 IPxhost 是临时放开访问控制。这种方式在局域网内调试没问题但如果跨网段或者本地有防火墙就算 DISPLAY 设置对了也弹不出窗口。这种情况下建议直接用 VNC 登录服务器在远程桌面里本地打开安装界面反而省事。3.3 运行 runInstaller 之前的自检Oracle 12c 的安装器在正式进入界面之前会先做一次环境检查。常见的拦截项有缺少cvuqdisk包内核参数不达标依赖包缺失cvuqdisk这个包最容易让人忽略。它是 Cluster Verification Utility 需要的磁盘访问组件不装的话会在“执行先决条件检查”时直接卡住。这个 rpm 在安装介质里有路径是cd /u01/software/database/rpm rpm -ivh cvuqdisk-1.0.10-1.x86_64.rpm如果找不到这个文件用find / -name cvuqdisk*搜索。这个包比较特殊它必须由 root 用户安装因为它要在ORACLE_HOME下创建一个设备访问权限相关的配置。3.4 安装类型选择图形界面起来后会让你选择安装类型。单实例数据库一般选第二个“Install database software only”仅安装数据库软件然后单独建库。为什么我不建议在安装软件时顺手建库因为先装软件、再单独 DBCA 建库出问题时定位更快。如果你把建库过程也合并进 OUI一旦建库中途失败软件安装和实例创建的状态混在一起排查非常痛苦。安装到 78% 左右时安装器会提示你以 root 身份执行两个脚本/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/12.1.0/dbhome_1/root.sh这两个脚本必须执行不执行的话安装流程不会继续。orainstRoot.sh会设置 inventory 目录的权限和组root.sh会配置一些 root 用户的软链接和初始化文件。4. 监听器配置为什么你连不上数据库4.1 监听器在整个链路上的位置很多人装完数据库软件后迫不及待用 DBCA 建库建完库再用 SQL*Plus 连接发现什么都正常但本机以外的机器就是连不上。90% 的原因是监听器没配好或者没启动。数据库实例在本地通过内存访问而远程连接必须经过监听器的 TCP 端口转发到数据库实例。用netca配置监听器netca在图形界面里选择“Listener configuration”添加一个监听器端口默认 1521。监听器配置完成后会生成/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora。这个文件内容类似LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 主机名或IP)(PORT 1521)) ) )注意HOST这一项可能默认写成了主机名。如果/etc/hosts里没有正确的解析其他机器连过来就会出问题。最稳妥的做法是写成实际 IPLISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.101)(PORT 1521)) ) )然后启动监听lsnrctl start用lsnrctl status确认状态看到类似The command completed successfully就对了。如果状态里显示no service handler也没关系这是还没建库时的正常现象。4.2 tnsnames.ora 与服务名监听器负责接电话tnsnames.ora则是电话本。远程连接时客户端根据 tnsnames 里的信息找到监听器再由监听器转发给实例。以典型配置为例ORCL (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.101)(PORT 1521)) (CONNECT_DATA (SERVICE_NAME orcl) ) )这里有个容易搞混的地方SERVICE_NAME和ORACLE_SID不是同一个概念。ORACLE_SID是实例的唯一标识SERVICE_NAME是数据库对外提供的服务名默认等于全局数据库名。连接时用哪个取决于你客户端的连接串。最直观的验证方式是本机测试sqlplus sys/password192.168.1.101:1521/orcl as sysdba如果还报ORA-12541: TNS:no listener先检查监听是否活着如果报ORA-12514: TNS:listener does not currently know of service requested in connect descriptor说明监听活着但不知道 orcl 这个服务需要确认实例是否注册到监听器了。实例注册一般发生在数据库STARTUP时等十几秒再用lsnrctl services查看。4.3 防火墙策略RHEL 6.8 默认防火墙是 iptables。很多人在本机测得好好的跨机器就通不了就是防火墙把 1521 端口挡了。要么放行iptables -I INPUT -p tcp --dport 1521 -j ACCEPT service iptables save要么直接停掉测试环境里的防火墙service iptables stop chkconfig iptables off生产环境不建议停防火墙只放行特定 IP 访问更稳妥iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 1521 -j ACCEPT5. DBCA 建库字符集和内存参数选择背后的依据5.1 启动 DBCA 的完整流程监听器配好后用 DBCA 建库dbca图形界面启动后选择“Create a database”输入全局数据库名和 SID。之后会问你 Enterprise Manager 是否启用一般选“Register with Enterprise Manager”或者直接跳过。下一步是设置 sys 和 system 用户的密码这里有个小建议密码别带、#这类特殊字符否则后面写脚本时转义非常麻烦。5.2 字符集不能随便选走到字符集那一步时Oracle 默认可能是AL32UTF8。你要是拿不准就想清楚业务到底需要什么。ZHS16GBK理论上只支持中文和英文但如果你们的业务系统只在中文环境用这个更省空间查询排序也更符合汉字习惯。AL32UTF8则更适合支持多语言、国际化程度高的应用代价是相同内容占用空间更大。这个选择在 DBCA 里定了之后后期改字符集的成本非常高所以开工之前就要决定了。5.3 内存管理12c 的自动管理到底开不开Oracle 12c 支持 AMMAutomatic Memory Management直接在 DBCA 里拖一个内存比例滑块就行。但我要提醒的是如果你后续计划上大并发、做性能调优建议先关掉 AMM改用 ASMM。原因是 AMM 调整 SGA 和 PGA 时会动态改变共享内存段大小这在生产环境可能引发不必要的性能抖动尤其是大页内存场景下AMM 跟 HugePages 冲突几乎是必然的。DBCA 建库过程中会有一步确认数据库文件存储位置选择“File System”模式即可后续想迁移 ASM 另说。整个建库时间在 20 到 40 分钟之间取决于你的机器性能建到一半别脑抽去动 system 表空间文件。6. 安装后的系统配置自启动、补丁与备份习惯6.1 配置数据库和监听随系统启动装完之后重启机器发现数据库没跟着起来这是没有配置/etc/oratab导致的。Oracle 安装的时候会生成这个文件每行对应一个实例。编辑它将最后一列改为 Yvi /etc/oratab内容类似orcl:/u01/app/oracle/product/12.1.0/dbhome_1:Y然后把dbstart和dbshut脚本配置到开机启动项里。比较常见的做法是在/etc/rc.d/rc.local中添加su - oracle -c /u01/app/oracle/product/12.1.0/dbhome_1/bin/dbstart /u01/app/oracle/product/12.1.0/dbhome_1 su - oracle -c /u01/app/oracle/product/12.1.0/dbhome_1/bin/emctl start dbconsole为了防止误操作先把/u01/app/oracle/product/12.1.0/dbhome_1/bin/dbstart里的ORACLE_HOME_LISTENER确认好。如果这个变量是空值dbstart 不会启动监听器sed -i s/ORACLE_HOME_LISTENER$1/ORACLE_HOME_LISTENER$ORACLE_HOME/ $ORACLE_HOME/bin/dbstart我曾经在一台没做这个修改的机器上配置自启动结果每次开机后监听都不起来排查半天才发现是这里的问题。6.2 补丁包与 OPatch别等到出了问题再更新Oracle 12c 发布后出过不少安全补丁和 bug 修复尤其是 PSUPatch Set Update和 CPU装完基础版本后最好尽快把补丁打上。补丁更新跟 Oracle 版本有关系不同的小版本补丁号不一样打补丁前要先确认$ORACLE_HOME/OPatch/opatch lsinventory这行命令可以看到当前安装的补丁版本。下载补丁后解压到一个目录然后cd $ORACLE_HOME/OPatch ./opatch apply /u01/software/patch路径opatch 也会检查环境变量如果ORACLE_HOME没设对它会报错。打补丁之前务必备份$ORACLE_HOME下面要改的文件因为有些补丁是不可回滚的一旦打了新的补丁想要回退只能从全备恢复。6.3 备份习惯是最容易偷懒但最不该偷懒的事DBA 的核心职责从来不在安装而在装了之后的运维。安装完成后建议至少配置三种备份习惯归档日志开启archivelog mode是数据库恢复的基础不开启的话 rman 备份也没多大意义。RMAN 定期全备写一个简单的 rman 脚本每天凌晨执行一次全库备份。控制文件自动备份configure controlfile autobackup on这个设置会让控制文件每次备份后自动产生一份备份关键时刻能救命。开启归档日志sqlplus / as sysdba shutdown immediate startup mount alter database archivelog; alter database open;6.4 一张图理顺安装步骤步骤操作关键命令/文件常见错误1系统准备/etc/sysctl.conf、/etc/security/limits.conf缺少依赖包、内核参数不满足2创建用户目录useradd oracle、mkdir /u01目录权限不对3解压安装unzip、./runInstallerDISPLAY 错误、cvuqdisk 缺失4配置监听netca、listener.ora监听未启动、主机名解析错误5建库dbca字符集无法回退、内存不足6收尾/etc/oratab、opatchdbstart 监听器不启动7. 实操总结我在多台机器上反复遇到的那些典型报错装完这台机器之后我又陆续在几台同样环境的服务器上重装过总结出几个高频问题的完整排查链路。7.1 INS-30131 错误的完整排查思路这个错误很经典表现形式是安装器弹窗提示Failed to access the temporary location。本质上是安装器访问/tmp目录或者oraInventory目录时权限或挂载方式不满足。排查路径如下先检查/tmp目录的权限ls -ld /tmp正常应该是 1777如果被改成了 755 就先恢复。检查/tmp是否被挂载成noexec。执行mount | grep /tmp查看挂载选项如果包含noexecOracle 的临时脚本就执行不了去掉noexec再重新挂载即可。如果/tmp没问题再看oraInventory目录的属主。ls -ld /u01/app/oraInventory如果不是oracle:oinstall直接chown -R oracle:oinstall /u01/app/oraInventory。还有可能/var/tmp空间不足df -h /var/tmp看一眼满了就清理core.*之类的临时文件。7.2 ORA-01034 和 ORA-27102内存参数引发的连锁反应ORA-01034: ORACLE not available这个报错在实例启动时很常见通常紧接着会给一个ORA-27102: out of memory。这个问题的根因往往不在当前会话而是/etc/sysctl.conf里的kernel.shmmax和kernel.shmall没配对。shmmax设得比实际内存小很多时Oracle 分配 SGA 就会失败。可以临时把shmmax调大再来一次但最保险的做法是设置成物理内存的一半并且确保shmall的值不小于shmmax除以页面大小通常 4KB。一旦改了 sysctl记得sysctl -p重新加载。7.3 安装完成后 sqlplus 命令找不到这种情况多半是 PATH 没配好或者/usr/local/bin下面的链接没有建立。先执行echo $ORACLE_HOME如果没有输出说明.bash_profile没生效。再检查$ORACLE_HOME/bin/sqlplus是否存在。如果文件存在但直接敲sqlplus却提示 command not found手动执行export PATH$PATH:$ORACLE_HOME/bin然后再看sqlplus / as sysdba。有时候 root 用户装的软件oracle 用户这边的环境变量没同步这时候直接su - oracle登录而不是su oracle也能解决一部分问题。7.4 建库过程中卡在 80% 的进度条DBCA 建库到 80% 左右会执行一些库脚本这时候卡住最常见的原因是磁盘空间不足。另开一个窗口运行df -h检查/u01和/的空间如果满了就把安装时的临时 zip 包删掉。还有一个隐蔽原因是没有配置/etc/hosts导致主机名解析慢DBCA 卡在网络等待上。配置echo 192.168.1.101 your-hostname /etc/hosts7.5 修改 ulimit 没生效的隐蔽原因Oracle 官方文档还要求配置用户的资源限制比如建议把nofile的软硬限制都设成 65536nproc设为 16384。但不少人把/etc/security/limits.conf改完之后重启会话还是没效果。这通常有两层原因第一只改了 hard 没改 soft需要在limits.conf里同时写两行第二RHEL 6 默认会有ulimit -S -u被设置成 1024 的限制需要检查/etc/security/limits.d/90-nproc.conf里面往往有* soft nproc 1024这样的默认配置把它注释掉或者改成足够大的值。这个坑我踩了整整一个下午症状就是 OUI 到后面步骤时总是崩溃日志里没有任何明确报错最后才发现是 nproc 不够。所以环境检查阶段不仅要用id确认用户权限还要用ulimit -a把所有资源限制看一遍。8. 一些值得留存的操作心得把整套流程跑顺之后回头看安装 Oracle 12c 最大的障碍其实不是某个具体的技术细节而是“环境不一致”带来的连锁反应。虚拟机里测试好好的换到物理机就报错开发环境全通上生产就卡在防火墙。这逼着我养成一个习惯每次装之前先用脚本把系统版本、内存、磁盘、内核参数、依赖包全部扫一遍列成清单核对缺什么就补什么绝不直接开跑安装器。另一个心得是日志文件永远是第一排查入口。OUI 有installActions.log监听器有listener.log数据库有alert_orcl.log遇到报错先看日志别盲目上网搜。很多报错表面上看起来莫名其妙日志里会直接给出根本原因。如果你也是第一次在 Red Hat 6.8 上装 Oracle 12c我建议你留出一整个空闲时间来做这件事不要试图压缩在两小时里搞定。别装了。如果你也是第一次在 Red Hat 6.8 上装 Oracle 12c我建议你留出一整个空闲时间来做这件事不要试图压缩在两小时里搞定。慢是正常的中间每遇到一个问题解决掉你后面运维这台库的时候就会心里有底一分。装库这个东西真不是网上那些“一条命令搞定”的文章说的那么轻松真正动手才知道每一层依赖、每个权限背后都是设计过的。
返回列表