ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

CentOS 7上Oracle 11g数据库安装部署全流程与深度排错指南

CentOS 7上Oracle 11g数据库安装部署全流程与深度排错指南 1. 项目概述与核心挑战最近在帮一个朋友的公司做数据库架构迁移他们想把一个核心业务从Windows Server迁移到Linux平台上指定要用Oracle 11g。虽然现在Oracle 19c、21c都出来了但很多老系统、特定行业的软件对11g的依赖还是很深尤其是那些基于特定版本客户端或中间件开发的系统升级数据库版本牵一发而动全身。所以在Linux上部署Oracle 11g服务端依然是一个有现实需求的技术活。这个活儿听起来就是“安装”两个字但真正干过的人都知道在Linux上装Oracle尤其是老版本的11g更像是一次对系统知识、耐心和排错能力的综合考试。它不像用yum或apt安装MySQL那样“一键搞定”需要你手动处理大量的系统参数、依赖包、环境变量和权限配置任何一个环节的疏漏都可能导致安装失败或者数据库运行不稳定。这次安装的目标是在一台全新的CentOS 7.x系统上部署一个稳定可用的Oracle Database 11g Release 2 (11.2.0.4) 服务端实例。整个过程会涉及到操作系统层面的深度调优这对于很多习惯了图形化安装向导的DBA或开发者来说是一个重新理解数据库与操作系统关系的好机会。我会把整个过程中遇到的坑、关键的配置项以及背后的原理都详细拆解出来。无论你是运维工程师、DBA还是需要自己搭建测试环境的开发者跟着走一遍不仅能成功装上Oracle更能明白为什么每一步要这么做以后再遇到类似问题就能自己排查了。2. 安装前的深度准备不只是下载安装包很多人安装失败八成是倒在了准备阶段。以为下载了安装包就能点下一步结果第一步就报错。Linux下安装Oracle 11g准备工作的重要性占到了50%以上。2.1 操作系统与硬件资源核查首先你的Linux系统必须满足Oracle的最低要求。对于11.2.0.4官方主要支持Red Hat Enterprise Linux (RHEL) 及其衍生版如CentOS、Oracle Linux的5、6、7系列。我强烈推荐使用CentOS 7.x它在社区支持、软件包兼容性上比较均衡。硬件检查清单内存物理内存至少1GB官方建议2GB以上。实际生产环境根据数据量和并发4GB是起步价。你可以用free -g命令查看。交换空间这是一个关键且容易忽略的点。交换分区的大小有明确公式不是随便设的。当物理内存为1GB-2GB时交换空间应为物理内存的1.5倍。当物理内存为2GB-16GB时交换空间等于物理内存大小。当物理内存超过16GB时交换空间固定为16GB。 例如我的测试机有4GB内存那么交换分区至少需要4GB。用swapon -s或free -m可以查看。磁盘空间/tmp目录至少需要1GB空间。Oracle软件本身安装需要大约4.5GB企业版数据文件存储的目录比如/u01/app/oracle建议预留20GB以上。用df -h命令检查。内核参数这是Linux安装Oracle的核心难点之一。Oracle数据库运行需要操作系统提供足够的资源配额比如共享内存段、信号量、文件句柄数等。这些都需要在/etc/sysctl.conf文件中进行修改。2.2 系统依赖包安装解决“令人头疼”的兼容性问题Oracle 11g的安装介质是很多年前发布的它依赖的某些系统库版本在较新的CentOS 7上可能已经过时或者默认没有安装。缺少任何一个包图形化安装界面runInstaller都可能无法启动或者安装中途报错。最稳妥的方式是使用Yum组安装和单独安装相结合。首先安装必要的软件包组yum groupinstall -y \Development Tools\ yum install -y \compat-libstdc-33\ \elfutils-libelf-devel\ \libaio-devel\ \unixODBC-devel\compat-libstdc-33这个包尤其重要它提供了老版本C运行库的兼容支持没有它安装程序几乎必然崩溃。除了这些还需要一系列额外的包。我整理了一个比较全的列表可以一次性安装yum install -y binutils.x86_64 compat-libcap1.x86_64 gcc.x86_64 gcc-c.x86_64 glibc.x86_64 glibc-devel.x86_64 ksh.x86_64 libaio.x86_64 libaio-devel.x86_64 libgcc.x86_64 libstdc.x86_64 libstdc-devel.x86_64 libXi.x86_64 libXtst.x86_64 make.x86_64 sysstat.x86_64实操心得如果你是在内网环境或无法连接互联网的服务器上操作这一步会非常麻烦。你需要提前在一台有网的相同系统版本的机器上使用yum install --downloadonly --downloaddir/path/to/dir命令将所有依赖包下载下来然后制作成本地Yum源或手动用rpm安装。务必确保系统版本一致否则rpm依赖地狱会让你痛不欲生。2.3 创建Oracle用户与目录结构规划绝对不要使用root用户直接安装Oracle这违反了最小权限原则会带来巨大的安全风险。我们需要创建专门的用户和组。创建用户组通常创建两个主要组oinstall软件安装组和dba数据库管理组。groupadd oinstall groupadd dba创建Oracle用户将用户oracle的主组设为oinstall附加组为dba。useradd -g oinstall -G dba oracle设置用户密码passwd oracle创建目录结构并授权Oracle的最佳实践是将软件、配置文件、数据文件分开存放。我常用的结构是mkdir -p /u01/app/oracle/product/11.2.0/dbhome_1 mkdir -p /u01/app/oradata # 用于存放数据文件、控制文件、重做日志 mkdir -p /u01/app/oracle/oraInventory # 用于存放OUI库存目录 chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app这里/u01是一个挂载点你可以根据实际情况换成/opt或/data。关键是路径要有足够的空间并且权限正确。2.4 内核参数与用户限制调优这是让Oracle数据库稳定高效运行的基础。修改后需要重启系统或执行sysctl -p使参数生效。编辑/etc/sysctl.conf在文件末尾添加或修改以下参数# 共享内存最大值通常设置为物理内存的一半以上这里设4GB kernel.shmmax 4294967296 # 共享内存段总大小单位是页通常4KB计算方式shmmax / 页大小 少量开销 kernel.shmall 1048576 # 整个系统可分配的信号量集最大数量 kernel.sem 250 32000 100 128 # 文件句柄数对于数据库服务器非常重要 fs.file-max 6815744 # 网络相关参数提升性能 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 fs.aio-max-nr 1048576shmmax和shmall的计算需要根据你的实际内存来调整。shmmax是单个共享内存段的最大字节数shmall是所有共享内存段总大小的页数。编辑用户限制配置文件/etc/security/limits.conf为oracle用户添加oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240这些限制确保了oracle用户有足够的进程数、打开文件数和栈空间来运行数据库实例。编辑/etc/pam.d/login确保包含以下行通常已有session required pam_limits.so这使limits.conf的配置在用户登录时生效。编辑oracle用户的shell配置文件如~/.bash_profile设置关键环境变量export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SIDorcl # 你的数据库实例名可自定义 export PATH$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH$ORACLE_HOME/lib:/usr/lib export NLS_LANGAMERICAN_AMERICA.AL32UTF8 # 设置字符集避免乱码 umask 022执行source ~/.bash_profile使环境变量立即生效。ORACLE_SID是实例标识连接数据库时会用到。3. 安装介质准备与图形化安装界面启动完成上述所有准备后我们终于可以开始接触Oracle安装程序了。3.1 获取并解压安装介质你需要从Oracle官网下载适用于Linux x86-64的11gR2安装文件通常是两个压缩包linux.x64_11gR2_database_1of2.zip和linux.x64_11gR2_database_2of2.zip。将它们上传到服务器比如/tmp目录下。以oracle用户身份解压cd /tmp unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip解压后会生成一个database目录这就是安装程序的根目录。3.2 解决图形化界面显示问题Oracle的安装程序runInstaller是一个Java写的图形化程序。在无图形界面的服务器上我们需要通过X11转发来显示界面。在本地客户端你的Windows/Mac电脑上需要安装X11服务端比如Windows下的Xming或MobaXterm内置的X ServerMac下的XQuartz。确保SSH客户端支持X11转发。例如使用PuTTY时在Connection - SSH - X11里勾选“Enable X11 forwarding”。使用命令行ssh则添加-X参数ssh -X oracle服务器IP。以oracle用户登录服务器后先测试一下图形显示是否正常xclock如果弹出一个时钟窗口说明X11转发成功。如果失败检查本地X Server是否运行以及SSH配置。3.3 启动安装程序并响应预检查进入解压后的目录启动安装程序cd /tmp/database ./runInstaller如果一切环境配置正确Oracle Universal Installer (OUI) 的图形界面将会在你的本地电脑上弹出。安装程序首先会进行“先决条件检查”。这是我们之前所有准备工作的“期末考试”。OUI会检查软件包、内核参数、空间等。如果看到有失败的项通常是警告不要慌张。对于“物理内存不足”或“交换空间不足”的警告如果你确认资源足够比如检查时其他进程占用了内存可以勾选“Ignore All”忽略但生产环境务必满足要求。对于缺少软件包的警告OUI会给出缺少的包名。你需要以root身份用yum安装它们然后回到OUI点击“Retry”重新检查。最关键的一步在安装选项界面选择“仅安装数据库软件”。我强烈建议将“软件安装”和“建库”分开进行。先确保软件100%安装成功再用DBCADatabase Configuration Assistant工具来创建数据库这样逻辑更清晰出了问题也容易定位。在指定安装位置时ORACLE_BASE和ORACLE_HOME会自动识别我们之前在环境变量中设置好的路径/u01/app/oracle和/u01/app/oracle/product/11.2.0/dbhome_1确认即可。接下来安装程序会总结你的选择确认后开始真正的文件复制和链接阶段。这个过程可能需要10-30分钟取决于服务器性能。3.4 执行root脚本安装的最后一步软件文件复制完成后OUI会弹出一个提示窗口这是整个安装过程中最重要的一步。它会提示你需要以root身份执行两个脚本/u01/app/oracle/oraInventory/orainstRoot.sh/u01/app/oracle/product/11.2.0/dbhome_1/root.sh千万不要关闭这个提示窗口新开一个终端用root用户登录依次执行这两个脚本。su - root cd /u01/app/oracle/oraInventory ./orainstRoot.sh # 主要作用是设置oraInventory目录的权限 cd /u01/app/oracle/product/11.2.0/dbhome_1 ./root.sh # 这个脚本非常重要会创建/etc/oratab文件配置一些系统服务执行root.sh时可能会提示输入本地bin目录的路径直接按回车使用默认值/usr/local/bin即可。脚本执行成功后回到OUI的提示窗口点击“OK”。至此Oracle数据库软件安装完毕。4. 使用DBCA创建数据库实例软件安装好了但还没有可用的数据库。我们需要创建一个数据库实例这才是存储数据的地方。4.1 启动DBCA配置助手切换到oracle用户确保环境变量已生效然后启动DBCAsu - oracle dbca同样DBCA也是图形界面需要通过X11转发显示。4.2 关键配置步骤详解选择操作选择“创建数据库”。选择模板为了方便可以选择“一般用途或事务处理”。这个模板包含了大多数常用选项。你也可以选“定制数据库”进行完全控制。数据库标识全局数据库名例如orcl.example.com这是数据库在网络中的唯一标识。SID这里会自动填充我们之前环境变量ORACLE_SID设置的值如orcl。SID是实例在操作系统层面的标识。管理选项取消“配置Enterprise Manager”的勾选。对于11gEM企业管理器比较重且常需要额外配置初次安装可以先跳过用命令行管理。数据库身份证明为重要的管理账户SYS, SYSTEM, DBSNMP等设置密码。可以选择“所有账户使用同一管理口令”以简化。务必使用强密码并牢记存储位置存储类型选择“文件系统”。数据库文件位置使用“模板中的数据库文件位置”或者指定到我们之前创建的/u01/app/oradata目录。这决定了你的数据文件、控制文件、重做日志文件存放在哪里。恢复配置指定快速恢复区Flash Recovery Area的位置和大小。这是用于存放备份和归档日志的区域对于数据安全很重要。可以设置为/u01/app/oracle/fast_recovery_area大小设为几个GB。数据库内容保持默认或者取消“示例方案”以节省空间除非你需要学习用的示例表。初始化参数这是性能调优的起点但初次安装可以大部分保持默认。需要关注内存设置“内存”选项卡下的“典型”分配。例如给4GB内存的服务器可以分配2GB给Oracle的SGA系统全局区和PGA程序全局区。字符集确保“数据库字符集”选择AL32UTF8Unicode UTF-8这是目前最通用、支持最好的字符集避免未来出现乱码问题。“国家字符集”保持AL16UTF16。数据库存储可以查看和确认控制文件、数据文件、重做日志组的设置。对于重做日志建议至少创建3个组每组大小至少50MB生产环境需更大。创建选项勾选“创建数据库”和“生成数据库创建脚本”。后者非常有用它会在指定目录如$ORACLE_HOME/assistants/dbca/templates下生成这次建库的所有SQL脚本方便你了解底层操作或用于重建。点击“完成”DBCA会展示一个摘要页面。确认无误后点击“确定”开始创建数据库。这个过程会持续较长时间20分钟到1小时不等因为它要执行一系列复杂的脚本创建数据字典、视图、包等。5. 安装后配置与基础验证数据库创建成功后并不意味着万事大吉。还需要进行一些基本的配置和验证确保数据库是可访问、可用的。5.1 配置监听器Listener监听器是客户端连接数据库服务的“门户”。它默认在1521端口监听。通常DBCA会帮你配置好一个监听器LISTENER但我们最好手动验证和启动。检查监听器状态lsnrctl status如果看到“The listener supports no services”说明监听器已启动但还没有注册上数据库服务。这是正常的因为数据库实例可能还没启动或者动态注册需要时间。启动监听器如果未启动lsnrctl start编辑监听器配置文件$ORACLE_HOME/network/admin/listener.ora如果需要手动配置LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST your_hostname)(PORT 1521)) ) )HOST最好使用服务器IP或能在网络中被解析的主机名。5.2 启动数据库实例并验证以oracle用户使用SQL*Plus连接sqlplus / as sysdba这里使用了操作系统认证/因为oracle用户属于dba组所以可以直接以sysdba身份登录无需密码。启动数据库实例STARTUP;这条命令会按顺序启动实例Instance、挂载数据库Mount、打开数据库Open。进行基本验证-- 查看数据库名称和状态 SELECT name, open_mode FROM v$database; -- 查看实例状态 SELECT instance_name, status FROM v$instance; -- 尝试创建一个测试用户和表 CREATE USER testuser IDENTIFIED BY testpass; GRANT CONNECT, RESOURCE TO testuser; CONNECT testuser/testpass; CREATE TABLE test_table (id NUMBER, name VARCHAR2(50)); INSERT INTO test_table VALUES (1, Hello Oracle); COMMIT; SELECT * FROM test_table;如果以上命令都能成功执行那么恭喜你一个完整的Oracle 11g数据库服务端已经成功安装并运行起来了。5.3 配置开机自启动可选但建议为了避免服务器重启后需要手动启动数据库和监听器我们可以将其配置为系统服务。编辑/etc/oratab文件这个文件是在执行root.sh时创建的。找到你数据库实例的那一行将最后的N改为Y。orcl:/u01/app/oracle/product/11.2.0/dbhome_1:Y这表示允许dbstart命令自动启动这个实例。创建启动/停止脚本以CentOS 7的systemd为例 创建服务文件/usr/lib/systemd/system/oracle-rdbms.service[Unit] DescriptionOracle Database 11g Afternetwork.target [Service] Typeforking Environment\ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1\ Environment\ORACLE_SIDorcl\ ExecStart/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbstart $ORACLE_HOME ExecStop/u01/app/oracle/product/11.2.0/dbhome_1/bin/dbshut $ORACLE_HOME Useroracle Groupoinstall [Install] WantedBymulti-user.target重新加载systemd配置并启用服务systemctl daemon-reload systemctl enable oracle-rdbms.service现在可以使用systemctl start oracle-rdbms和systemctl stop oracle-rdbms来管理数据库了。6. 常见问题与深度排查实录即便按照指南操作也难免会遇到各种问题。这里记录几个我踩过且具有代表性的“坑”。6.1 图形界面runInstaller/DBCA无法启动问题现象执行./runInstaller或dbca后长时间无响应或者报错“无法打开显示”。排查思路检查X11转发这是最常见的原因。确保本地X Server在运行SSH连接开启了X11转发。用xclock命令测试。检查oracle用户的环境变量特别是DISPLAY变量。它应该被自动设置为类似localhost:10.0的值。可以手动设置export DISPLAY你的本地IP:0.0但注意安全。检查依赖包再次用yum list installed核对所有必需的兼容包是否已安装尤其是libXp,libXtst,compat-libstdc-33。使用静默安装如果图形界面实在无法解决可以考虑静默安装。这需要事先编辑一个响应文件response file然后运行./runInstaller -silent -responseFile /path/to/response.rsp。这需要你对安装选项非常熟悉。6.2 安装过程中出现“链接阶段”错误问题现象在安装进度到“链接产品”时大量报错提示某些库文件找不到或链接失败。根本原因几乎可以肯定是系统库依赖问题。虽然安装了包但可能版本不对或者64位/32位库混淆。解决方案仔细查看错误日志通常位于/u01/app/oraInventory/logs下。错误信息会明确指出是哪个库如libnnz11.so出了问题。使用find或ldd命令检查这个库文件是否存在以及其依赖是否满足。例如ldd $ORACLE_HOME/bin/oracle。最常见的是缺少32位兼容库。在64位系统上Oracle 11g的某些组件仍然是32位的。需要安装32位的库yum install -y glibc-devel.i686 libstdc-devel.i686。确保LD_LIBRARY_PATH环境变量正确包含了$ORACLE_HOME/lib和/usr/lib可能还需要/lib和/usr/lib64。6.3 数据库创建DBCA在某个百分比卡住或失败问题现象DBCA进度条停在某个百分比如44%70%很长时间最后弹出错误。排查思路查看详细日志DBCA的日志文件位于$ORACLE_HOME/cfgtoollogs/dbca/数据库名目录下。查看最新的.log文件里面会有具体的错误堆栈信息。常见原因一空间不足。检查/tmp目录和数据库文件目标目录如/u01/app/oradata的剩余空间。DBCA在创建过程中需要大量临时空间。常见原因二权限问题。确保oracle用户对ORACLE_BASE,ORACLE_HOME, 数据文件目录有完整的读写权限。可以用ls -ld /u01/app/oradata检查。常见原因三内核参数或用户限制仍未生效。即使修改了sysctl.conf和limits.conf也可能需要重启服务器才能完全生效。对于limits确保oracle用户是通过su或ssh新登录的会话使新限制生效。6.4 监听器启动正常但客户端无法连接问题现象lsnrctl status显示监听器运行但用sqlplus username/password//host:1521/service_name连接时报错“ORA-12541: TNS:no listener”或“ORA-12514: TNS:listener does not currently know of service requested”。排查步骤检查防火墙这是最大的“隐形杀手”。确保服务器防火墙firewalld或iptables开放了1521端口。firewall-cmd --zonepublic --add-port1521/tcp --permanent firewall-cmd --reload检查监听器是否注册了服务在服务器上用lsnrctl services命令查看监听器已注册的数据库服务。如果列表为空说明数据库实例的动态注册没成功。手动注册服务在SQL*Plus中执行ALTER SYSTEM REGISTER;。然后稍等片刻再查看lsnrctl services。检查连接字符串确保客户端使用的服务名service_name或SID正确。可以在数据库内查询SELECT name FROM v$database;和SELECT instance_name FROM v$instance;。对于动态注册通常服务名就是全局数据库名如orcl.example.com或DB_NAME如orcl。6.5 ORA-01034: ORACLE not available 与 ORA-27101: shared memory realm does not exist问题现象使用sqlplus / as sysdba可以连接但STARTUP时报错或者远程连接时报ORA-01034和ORA-27101。问题本质Oracle实例没有启动或者环境变量ORACLE_SID设置不正确导致sqlplus连接到了错误的或不存在的实例。解决方案确认当前操作的oracle用户的环境变量ORACLE_SID是否是你想启动的数据库实例名。用echo $ORACLE_SID查看。检查/etc/oratab文件确认实例名和ORACLE_HOME的对应关系。如果实例确实没启动尝试用STARTUP启动。如果启动失败查看$ORACLE_HOME/diag/rdbms/dbname/instance/trace目录下的alert日志文件这是Oracle最重要的故障诊断文件里面有启动过程的详细记录和错误原因。共享内存问题ORA-27101通常与/etc/sysctl.conf中的kernel.shmmax,kernel.shmall参数设置过小有关请按照前面的公式重新计算并设置然后执行sysctl -p并重启实例。整个安装过程本质上是在Linux系统上为一个复杂的企业级软件搭建一个符合其“脾气”的运行环境。每一个错误提示都是系统在告诉你某个前提条件未满足。耐心阅读日志理解每个配置项背后的意义是解决所有问题的万能钥匙。当你终于看到SQL提示符并成功执行查询时那种成就感就是对之前所有繁琐工作的最好回报。
返回列表