三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

CentOS 7下Oracle 11g静默安装全攻略:从环境配置到安全加固

CentOS 7下Oracle 11g静默安装全攻略:从环境配置到安全加固

1. 项目缘起与核心挑战

最近在帮一个朋友的公司部署一套内部使用的业务系统,数据库选型定在了Oracle 11g。虽然现在19c、21c都出来了,但对于一些特定的遗留应用或者对授权成本、硬件资源有严格限制的场景,11g依然是一个务实的选择。朋友那边服务器环境是CentOS 7,一个典型的Linux生产环境。他之前尝试照着网上一些零散的教程安装,结果卡在了图形化安装界面出不来、依赖包缺失、内核参数设置不对等各种问题上,折腾了两天没搞定,这才找到我。

Linux下安装Oracle数据库,尤其是11g这个版本,确实是个有点“年代感”的技术活。它不像现在很多开源数据库那样,一个docker pull或者一个yum install就能轻松搞定。整个过程涉及到操作系统层面的深度配置,包括用户、组、内核参数、文件系统、软件依赖等一系列环节,任何一个步骤的疏漏都可能导致安装失败或者后续运行不稳定。网上教程虽多,但要么过于简略跳过了关键细节,要么环境差异太大无法直接套用。这次我就把这次完整的安装过程、踩过的坑以及背后的原理梳理出来,目标是在一台干净的CentOS 7(或其他主流Linux发行版)上,从零开始,成功安装并配置好一个可用的Oracle 11g服务端。整个过程我们将摒弃对图形界面的依赖,采用静默安装模式,这对于服务器环境来说更可靠、更高效。

2. 安装前的深度环境准备:不只是运行脚本

很多人安装失败,第一步就栽在了环境准备上。Oracle官方有详细的预检查脚本,但仅仅运行脚本并按照提示修复是不够的。你需要理解每一项要求背后的意义,这能帮助你在出问题时快速定位。

2.1 操作系统与用户规划

首先确认系统版本。Oracle 11g R2(11.2.0.4)官方认证支持RHEL/CentOS 5, 6, 7。我们以CentOS 7.9最小化安装为例。一个干净的Minimal Install系统是最佳起点,避免不必要的软件冲突。

核心的一步是创建Oracle软件安装所需的用户和组。这里不能随意,必须遵循Oracle的最佳实践(也是硬性要求)。

# 1. 创建主要的操作系统组 groupadd oinstall # 软件安装组,拥有Oracle软件的安装目录 groupadd dba # 数据库管理员组,拥有最高的数据库管理权限 # 对于11g,通常还需要oper组(某些版本的安装助手需要) groupadd oper # 2. 创建Oracle软件所有者用户 useradd -g oinstall -G dba,oper oracle # -g:指定主组为oinstall # -G:指定附加组为dba和oper # 3. 为oracle用户设置密码 passwd oracle

接下来,创建目录结构。我强烈建议将Oracle的软件安装目录(ORACLE_HOME)和数据文件存储目录(ORACLE_BASE)分离。这不仅符合OFCA(Oracle Flexible Architecture)规范,也便于后续的备份、升级和管理。

# 假设我们使用 /u01 作为基础目录 mkdir -p /u01/app/oracle # ORACLE_BASE mkdir -p /u01/app/oraInventory # 软件库存目录 chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app

注意:目录权限775(即rwxrwxr-x)确保了oinstall组的成员也有写权限,这在多管理员协作时很重要。如果只有你一个人管理,设置为755也可以。

2.2 内核参数与系统限制调优

Oracle数据库是一个大型企业级软件,对操作系统资源(如共享内存、信号量、进程数、文件句柄)有较高要求。我们需要修改Linux内核参数来满足这些要求。

编辑/etc/sysctl.conf文件,添加或修改以下参数。这些值对于11g在中等配置的服务器上是一个推荐的起点,你可以根据实际硬件进行调整。

# 在文件末尾添加或修改 fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 # 共享内存总页数。计算公式:物理内存(GB)*1024*1024*1024/页大小(4096)。例如8GB内存:8*1024^3/4096=2097152 kernel.shmmax = 536870912 # 单个共享内存段的最大字节数,建议设置为物理内存的一半。这里512MB。 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 # 信号量设置:SEMMSL, SEMMNS, SEMOPM, SEMMNI 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(系统全局区)可能无法分配。通常设置为物理内存的一半或稍大。你可以通过getconf PAGE_SIZE获取系统页大小(通常是4096),然后计算。例如,想分配2GB的SGA,shmmax至少需要2*1024*1024*1024 = 2147483648
  • kernel.sem:信号量用于进程间同步。四个值分别代表:每个信号量集的最大信号量数、系统范围内最大信号量数、每个semop调用可操作的最大信号量数、系统范围内最大信号量集数。Oracle对并发进程数有要求。

修改后,执行sysctl -p使配置立即生效。

接下来,修改用户资源限制,编辑/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 hard stack 32768

nproc是进程数,nofile是打开文件数,stack是堆栈大小。这些限制确保了Oracle进程在运行时不会因资源不足而异常退出。

还需要编辑/etc/pam.d/login,确保包含session required pam_limits.so这一行,以便用户登录时加载限制。

最后,禁用透明大页(Transparent HugePages)。在CentOS 7/RHEL 7+上,透明大页可能会引起Oracle数据库性能问题甚至内存分配错误。这是一个非常关键的步骤。

# 查看当前状态 cat /sys/kernel/mm/transparent_hugepage/enabled # 输出通常为:[always] madvise never # 临时禁用(重启失效) echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag # 永久禁用,修改GRUB配置 # 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行末尾添加 transparent_hugepage=never # 例如:GRUB_CMDLINE_LINUX="... rhgb quiet transparent_hugepage=never" # 然后生成新的grub配置 grub2-mkconfig -o /boot/grub2/grub.cfg # 重启生效

2.3 软件依赖包安装

Oracle 11g的安装介质本身不包含所有依赖,需要手动安装。对于CentOS 7,很多包在默认的Base和EPEL仓库中。

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 unixODBC unixODBC-devel

特别注意compat-libstdc++-33这个包在CentOS 7的默认仓库里可能没有。你需要从CentOS Vault(针对老版本)或者RHEL的兼容库中手动下载rpm安装。你可以尝试:

# 从网络下载(请确保来源可靠) wget http://mirror.centos.org/centos/7/os/x86_64/Packages/compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm rpm -ivh compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm

如果找不到,有时在Oracle 11g的安装介质解压后的rpm文件夹里,会提供这个包。

此外,还需要pdksh(Public Domain Korn Shell),但CentOS通常用ksh替代,安装上面的ksh包即可。可以使用rpm -q ksh验证。

3. Oracle软件安装介质准备与静默安装配置

由于服务器环境通常没有图形界面,我们采用静默安装(Silent Install),这需要准备响应文件(Response File)。

3.1 获取并解压安装介质

首先,从Oracle官网下载Linux x86-64版本的11gR2安装包:linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip。将其上传到服务器,例如/tmp目录。

以oracle用户身份操作:

su - oracle cd /tmp unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip

解压后会生成一个database文件夹。

3.2 配置Oracle用户环境变量

编辑oracle用户的~/.bash_profile文件,添加以下环境变量。这些变量将贯穿整个Oracle数据库的生命周期。

# Oracle Base export ORACLE_BASE=/u01/app/oracle # Oracle Home (软件安装路径) export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 # Oracle SID (数据库实例名,可自定义,如orcl) export ORACLE_SID=orcl # 字符集,根据业务需要设置,常用AL32UTF8 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 # 将$ORACLE_HOME/bin加入PATH export PATH=$ORACLE_HOME/bin:$PATH # 设置LD_LIBRARY_PATH,确保运行时能找到正确的库文件 export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib # 可选,设置sqlplus等命令行工具的编辑器和默认行大小 export EDITOR=vi export SQLPATH=$ORACLE_HOME/sqlplus/admin

保存后,执行source ~/.bash_profile使环境变量生效。务必仔细检查ORACLE_HOME的路径,后续静默安装响应文件里要与之对应。

3.3 创建静默安装响应文件

静默安装的核心是一个XML格式的响应文件,它回答了安装程序所有需要交互的问题。我们可以在database/response目录下找到模板文件db_install.rsp。复制一份并进行修改。

cp /tmp/database/response/db_install.rsp /home/oracle/db_install.rsp vi /home/oracle/db_install.rsp

你需要修改以下关键参数,其他可以保持默认:

# 指定安装类型。ENTERPRISE_EDITION 是企业版 oracle.install.option=INSTALL_DB_SWONLY # 设置Unix DBA组 UNIX_GROUP_NAME=oinstall # 指定Oracle Home路径,必须与.bash_profile中一致 ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 # 指定Oracle Base路径 ORACLE_BASE=/u01/app/oracle # 指定Inventory目录 oracle.install.db.InstallEdition=EE # 指定Inventory目录 INVENTORY_LOCATION=/u01/app/oraInventory # 选择安装的语言 SELECTED_LANGUAGES=en,zh_CN # 指定数据库版本,这里装企业版 oracle.install.db.InstallEdition=EE # 设置DBA组 oracle.install.db.DBA_GROUP=dba # 设置OPER组 oracle.install.db.OPER_GROUP=oper # 设置升级现有数据库?这里新装选false oracle.install.db.upgrade.option=false # 是否执行预安装检查,true会检查,失败则停止 DECLINE_SECURITY_UPDATES=true # 非常重要!必须设置为true,否则安装会失败。表示跳过安全更新。 SECURITY_UPDATES_VIA_MYORACLESUPPORT=false

踩坑点DECLINE_SECURITY_UPDATES这个参数非常关键。如果不设置为true,安装程序会尝试连接Oracle支持网站检查更新,在无外网或网络受限的环境下,这个过程会超时并导致安装失败。直接声明“拒绝”是最稳妥的。

4. 执行静默安装与可能遇到的错误处理

环境准备好,响应文件配置好,就可以开始安装了。切换到oracle用户,进入安装文件目录。

su - oracle cd /tmp/database ./runInstaller -silent -responseFile /home/oracle/db_install.rsp -ignorePrereq

参数解释

  • -silent: 启用静默模式。
  • -responseFile: 指定响应文件路径。
  • -ignorePrereq:这是一个重要的备选参数。如果安装前的系统预检查(如内核参数、依赖包)有少量非致命性警告,你可以使用此参数强制跳过,继续安装。但对于明显的错误(如缺少核心依赖包),即使跳过也可能会在后续步骤失败。建议先解决所有预检查问题,再使用此参数。

安装过程会在后台进行,输出日志到终端。你可以另开一个终端,用tail -f /u01/app/oraInventory/logs/installActions*.log来跟踪详细的安装日志,这是排查问题的第一手资料。

安装过程大约持续20-40分钟,取决于服务器性能。当看到以下输出时,表示软件安装部分成功了:

... The installation of Oracle Database 11g was successful. Please check '/u01/app/oraInventory/logs/silentInstall.log' for more details.

但是,这还没完!最关键的一步来了。安装日志的最后,或者在你运行安装命令的终端,会输出类似这样的信息:

Successfully Setup Software. As a root user, execute the following script(s): 1. /u01/app/oraInventory/orainstRoot.sh 2. /u01/app/oracle/product/11.2.0/dbhome_1/root.sh

你必须切换到root用户,按照提示的顺序执行这两个脚本!这是很多新手会忽略的致命步骤。

su - root # 执行第一个脚本 /u01/app/oraInventory/orainstRoot.sh # 这个脚本主要作用是创建oraInventory目录的权限和初始化文件。 # 执行第二个脚本 /u01/app/oracle/product/11.2.0/dbhome_1/root.sh

执行root.sh时,可能会提示输入本地bin目录的路径,直接按回车使用默认值即可。这个脚本会执行一些必须以root权限进行的操作,比如将Oracle的可执行文件链接到系统目录、创建/etc/oratab文件等。

4.1 常见安装错误与排查

  1. 图形化依赖错误(即使静默模式):如果系统缺少libXrenderlibXtst等图形库,静默安装也可能报错。确保已安装xorg-x11-xauthxorg-x11-server-utils等包。对于纯命令行服务器,可以安装一个最小的X11库组:yum groupinstall "X Window System",但通常不需要完整桌面。
  2. ins_ctx.mk链接错误:这是一个经典的错误。在链接阶段可能会报错,提示ins_ctx.mk相关的ld命令失败。这通常是因为$ORACLE_HOME/ctx/lib/下的libctx.so链接到了不兼容的libclntsh库。
    • 解决方案:在运行runInstaller之前,设置一个环境变量:
      export CV_ASSUME_DISTID=RHEL7
      或者在安装后,如果已经报错,可以尝试手动修复链接(有一定风险,建议重装前设置变量)。
  3. 内存/交换空间不足:安装程序需要一定内存和交换空间。如果物理内存小于1GB,安装可能失败。确保交换空间(Swap)至少为物理内存的1-1.5倍。可以用free -hswapon -s检查。
  4. /tmp空间不足:安装过程需要解压大量临时文件。确保/tmp有至少1-2GB的可用空间。如果不够,可以设置环境变量TMPTMPDIR指向一个更大的目录。
    export TMP=/bigspace/tmp export TMPDIR=/bigspace/tmp mkdir -p /bigspace/tmp chmod 777 /bigspace/tmp

5. 创建数据库实例:DBCA静默模式

软件安装成功并执行完root脚本后,我们有了Oracle的二进制文件,但还没有数据库实例(即没有数据文件、控制文件、重做日志等)。我们需要使用DBCA(Database Configuration Assistant)来创建。

同样,我们使用静默模式。首先,准备一个DBCA的响应文件模板。可以从$ORACLE_HOME/assistants/dbca/dbca.rsp复制,或者直接使用一个简化的命令。

更简单直接的方法是使用DBCA的命令行参数。以下命令创建一个名为orcl的数据库实例:

su - oracle dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl -sid orcl \ -responseFile NO_VALUE \ -characterSet AL32UTF8 \ -memoryPercentage 40 \ -emConfiguration NONE \ -datafileDestination /u01/app/oracle/oradata \ -redoLogFileSize 100 \ -storageType FS \ -sampleSchema false \ -automaticMemoryManagement false \ -totalMemory 1024

参数详解

  • -templateName: 使用通用模板。
  • -gdbname-sid: 全局数据库名和实例名,通常设置相同。
  • -characterSet: 数据库字符集,AL32UTF8支持多语言。
  • -memoryPercentage: 分配给Oracle SGA+PGA的内存占物理内存的百分比。40%是一个保守的起始值,生产环境需精细调整。
  • -emConfiguration NONE: 不配置Enterprise Manager。在11g中,EM通常比较重,在服务器上可以省略。
  • -datafileDestination: 数据库数据文件存放路径。确保该目录存在且oracle用户有写权限!我们之前创建的/u01/app/oracle下可以新建一个oradata目录。
    mkdir -p /u01/app/oracle/oradata chown oracle:oinstall /u01/app/oracle/oradata
  • -redoLogFileSize: 重做日志文件大小,单位MB。100MB对于测试和中小型系统起步足够。
  • -sampleSchema false: 不安装示例Schema(如HR、OE等),节省空间和时间。
  • -automaticMemoryManagement false-totalMemory: 禁用自动内存管理,手动指定总内存为1024MB。对于初学者,使用自动内存管理(-automaticMemoryManagement true)更省心,但这里为了演示明确指定。

执行这个命令后,DBCA会在后台创建数据库,时间可能较长(10-30分钟)。你可以通过tail -f $ORACLE_BASE/cfgtoollogs/dbca/orcl/orcl.log来跟踪创建日志。

创建成功后,你会看到类似Database creation complete.的输出。现在,数据库实例orcl就已经启动并运行了。

6. 基础配置与连接测试

数据库创建好后,还需要进行一些基础配置才能方便地使用。

6.1 配置监听器(Listener)

监听器是客户端连接数据库的入口。使用NetCA(Network Configuration Assistant)静默模式创建监听器。

netca -silent -responseFile $ORACLE_HOME/assistants/netca/netca.rsp

通常,使用默认的响应文件即可,它会创建一个名为LISTENER的监听器,运行在1521端口。

你可以手动启动、停止、检查监听器状态:

lsnrctl start lsnrctl stop lsnrctl status

lsnrctl status的输出中,你应该能看到orcl实例的服务已经注册到了监听器。

6.2 配置网络服务名(TNS)

为了让客户端(包括本地的sqlplus)能够方便地连接,我们需要配置TNS(Transparent Network Substrate)。编辑$ORACLE_HOME/network/admin/tnsnames.ora文件。

vi $ORACLE_HOME/network/admin/tnsnames.ora

添加以下内容:

ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

这里HOST可以写服务器的主机名或IP地址。如果是本地测试,用localhost即可。

6.3 连接测试与基础操作

现在,使用sqlplus以sysdba身份连接数据库,进行测试和初始设置。

sqlplus / as sysdba

/ as sysdba是操作系统认证,只要当前用户属于dba组,就可以无需密码直接以最高权限登录。

登录后,执行一些基本命令:

-- 查看数据库状态和实例名 SELECT name, open_mode FROM v$database; SELECT instance_name, status FROM v$instance; -- 解锁默认的scott用户并设置密码(可选) ALTER USER scott IDENTIFIED BY tiger ACCOUNT UNLOCK; -- 创建一个新的普通用户 CREATE USER testuser IDENTIFIED BY testpass; GRANT CONNECT, RESOURCE TO testuser;

退出sqlplus(exit),然后用新创建的用户测试TNS连接:

sqlplus testuser/testpass@orcl

如果能够成功登录,说明数据库安装、监听器、网络配置全部成功。

6.4 设置开机自启动

我们需要配置Oracle数据库和监听器在操作系统重启后能自动启动。这通常通过将启动脚本添加到rc.local或使用systemd服务实现(推荐CentOS 7用systemd)。

首先,创建Oracle数据库的systemd服务文件/etc/systemd/system/oracle-db.service

[Unit] Description=Oracle Database 11g After=network.target [Service] Type=forking Environment=ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 Environment=ORACLE_SID=orcl 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 User=oracle Group=oinstall Restart=on-abort [Install] WantedBy=multi-user.target

然后,创建监听器的systemd服务文件/etc/systemd/system/oracle-listener.service

[Unit] Description=Oracle Listener After=oracle-db.service [Service] Type=forking Environment=ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 ExecStart=/u01/app/oracle/product/11.2.0/dbhome_1/bin/lsnrctl start ExecStop=/u01/app/oracle/product/11.2.0/dbhome_1/bin/lsnrctl stop User=oracle Group=oinstall Restart=on-abort [Install] WantedBy=multi-user.target

重新加载systemd配置,并启用服务:

systemctl daemon-reload systemctl enable oracle-db systemctl enable oracle-listener

现在,你可以使用systemctl start/stop/status oracle-dbsystemctl start/stop/status oracle-listener来管理服务了。重启服务器后,数据库和监听器也会自动启动。

7. 安装后的优化与安全加固建议

安装完成并能连接只是第一步。对于一个准备投入使用的数据库,还需要进行一些优化和安全加固。

  1. 调整SGA/PGA内存:安装时我们指定了总内存。更精细的做法是分别设置SGA(系统全局区)和PGA(程序全局区)。连接到数据库:

    ALTER SYSTEM SET sga_target=800M SCOPE=spfile; ALTER SYSTEM SET pga_aggregate_target=200M SCOPE=spfile; -- 重启数据库生效 SHUTDOWN IMMEDIATE; STARTUP;

    大小需要根据服务器总内存和并发用户数来评估。

  2. 修改默认用户密码SYSSYSTEM等核心用户的默认密码是安装时设置的,务必修改。

    ALTER USER sys IDENTIFIED BY 你的强密码; ALTER USER system IDENTIFIED BY 你的强密码;
  3. 启用归档模式(对于生产环境):归档模式能保证数据不丢失,是恢复的基础。但这需要额外的磁盘空间来存放归档日志。

    -- 关闭数据库 SHUTDOWN IMMEDIATE; -- 启动到mount状态 STARTUP MOUNT; -- 启用归档 ALTER DATABASE ARCHIVELOG; -- 打开数据库 ALTER DATABASE OPEN; -- 查看归档状态 ARCHIVE LOG LIST;
  4. 配置定时备份:即使不是生产环境,也建议配置RMAN(Recovery Manager)进行定期的全量或增量备份。编写一个RMAN脚本,然后通过crontab定时执行。

  5. 防火墙设置:如果服务器防火墙(firewalld或iptables)是开启的,需要放行Oracle监听端口(默认1521)。

    firewall-cmd --permanent --add-port=1521/tcp firewall-cmd --reload

整个安装过程从系统准备到最终可用,步骤虽多,但逻辑清晰。核心在于理解每个步骤的目的,而不是机械地复制命令。尤其是在静默安装和DBCA建库阶段,响应文件里的每一个参数都影响着最终结果。建议在测试环境中反复练习几遍,记录下自己的安装日志和遇到的问题,形成自己的“检查清单”,这样在面对真正的生产服务器时,才能做到心中有数,手到擒来。

← 返回列表