银河麒麟V10 SP3系统安装Oracle 11g全流程与疑难问题解决

1. 项目概述与背景

最近在给一个老客户的内部系统做迁移,他们的服务器环境比较特殊,用的是国产的银河麒麟操作系统,具体版本是V10 SP3 for x86_64。这套系统上跑着一个核心的业务应用,后端数据库是Oracle 11g。客户的目标很明确:要把整个环境,包括操作系统和应用,从旧的硬件平移到新的国产服务器上。这意味着,我得在全新的麒麟SP3 x86系统上,从头搭建一套Oracle 11g数据库环境。

这活儿听起来像是常规的数据库安装,但真正动起手来才发现,在麒麟系统上装Oracle,跟我们在熟悉的CentOS或者RHEL上操作,完全是两码事。麒麟系统虽然底层也是Linux内核,但它在软件包管理、依赖库、甚至一些系统参数的默认配置上,都有自己的一套“脾气”。网上能找到的教程,大多是基于RedHat系的,直接照搬过来,十有八九会卡在某个依赖报错或者参数校验上。我花了差不多两天时间,把各种坑都踩了一遍,才最终把数据库稳稳当当地跑起来。今天就把这个完整的安装过程、遇到的典型问题以及解决办法,系统地梳理出来。如果你也面临在银河麒麟V10 SP3(x86)上部署Oracle 11g的需求,这篇记录应该能帮你省下不少折腾的时间。

2. 安装前的深度准备工作

在麒麟系统上安装Oracle,准备工作的重要性要占到整个过程的50%以上。仓促开始安装,几乎必然会在中途遇到各种依赖缺失和参数错误。我们必须把系统环境调整到Oracle安装程序期望的状态。

2.1 系统与硬件资源核查

首先,我们需要确认系统环境是否满足Oracle 11g(11.2.0.4版本)的最低要求。通过SSH连接到目标麒麟服务器,执行以下命令进行核查:

  1. 操作系统版本确认

    cat /etc/os-release

    确认输出中包含“Kylin Linux Advanced Server release V10 (SP3)”和“x86_64”字样。这是基础。

  2. 内存与交换空间检查

    # 检查物理内存(推荐至少2GB) grep MemTotal /proc/meminfo # 检查交换空间(推荐大小,见下文计算) grep SwapTotal /proc/meminfo free -h

    Oracle对交换空间有明确的计算公式:

    • 当物理内存(RAM)在1GB到2GB之间时,交换空间应为RAM的1.5倍。
    • 当RAM在2GB到16GB之间时,交换空间等于RAM大小。
    • 当RAM大于16GB时,交换空间固定为16GB。 例如,我的服务器有8GB内存,那么交换空间至少需要8GB。使用swapon -sfree -h查看现有交换分区大小。如果不足,需要添加。
  3. 磁盘空间检查

    df -h /tmp df -h /home # 假设Oracle安装在此 df -h

    /tmp目录至少需要1GB空间。Oracle软件安装目录(如/u01/app/oracle)建议预留15-20GB。数据文件存储目录根据业务量预留,初期至少50GB。

2.2 依赖软件包安装:麒麟系统的特殊之处

这是与RedHat系系统差异最大的地方。麒麟V10的软件源默认不包含Oracle所需的所有依赖包,尤其是一些较老的32位(i686)兼容库。我们需要手动配置额外的源并安装。

  1. 配置EPEL和RPM Fusion源(可选但推荐): 麒麟的默认源可能不全。可以尝试添加兼容的EPEL源。注意,要选择与系统版本匹配的源。

    # 示例:下载适用于CentOS 8的EPEL release包(麒麟V10基于此) wget https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm sudo rpm -ivh epel-release-latest-8.noarch.rpm

    注意:并非所有EPEL包都能完美兼容,安装依赖时如果遇到冲突,可能需要跳过EPEL,转而手动寻找单个rpm包。

  2. 安装核心依赖包组: 使用yum命令安装以下包组和关键包。@符号表示安装包组。

    sudo yum groupinstall -y "Development Tools" sudo 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++-33libaio-develksh这几个包在麒麟默认源中可能没有,或者版本不对。如果yum找不到,你需要:

    • 去诸如 rpmfind.net 这样的网站,根据你的系统架构(x86_64)和大致版本(对应CentOS 8),手动下载对应的rpm包。
    • 使用rpm -ivh命令本地安装。安装时注意依赖顺序,可能需要先安装compat-libstdc++-33再安装其他。
  3. 安装32位兼容库(必须): Oracle安装程序(特别是图形界面)和某些库是32位的,即使在64位系统上也需要安装对应的32位库。

    sudo yum install -y glibc.i686 libgcc.i686 libstdc++.i686 libaio.i686

    同样,如果yum源没有,需要手动寻找下载glibc-2.xx.i686.rpm等包进行安装。

2.3 创建Oracle用户与组并配置环境

Oracle不建议使用root用户直接安装和运行数据库。我们需要创建专用的操作系统用户和组。

  1. 创建用户和组

    sudo groupadd -g 54321 oinstall sudo groupadd -g 54322 dba sudo groupadd -g 54323 oper sudo useradd -u 54321 -g oinstall -G dba,oper oracle sudo passwd oracle # 为oracle用户设置密码
  2. 创建目录并授权

    sudo mkdir -p /u01/app/oracle sudo mkdir -p /u01/app/oraInventory sudo chown -R oracle:oinstall /u01/app sudo chmod -R 775 /u01/app
  3. 配置oracle用户的环境变量: 切换到oracle用户:su - oracle编辑其家目录下的.bash_profile文件:

    vi ~/.bash_profile

    在文件末尾添加以下内容:

    # Oracle Settings export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SID=orcl # 你的数据库实例名,可自定义 export PATH=$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 # 设置字符集,非常重要!

    保存后,执行source ~/.bash_profile使配置生效。这里有个坑LD_LIBRARY_PATH必须包含/usr/lib,否则安装或运行时会找不到一些系统库。

2.4 修改系统内核参数与资源限制

Oracle数据库对系统内核参数有特定要求,需要修改/etc/sysctl.conf文件。

  1. 编辑sysctl.conf

    sudo vi /etc/sysctl.conf

    在文件末尾添加或修改以下参数。数值可根据服务器配置调整,但以下是一个适用于中等规模系统的起点:

    # Oracle 11g Recommended Kernel Parameters fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 2097152 # 共享内存总页数。单位是页(通常4KB)。值 = 总物理内存(字节) / 页大小(4096) kernel.shmmax = 4294967295 # 最大单个共享内存段大小,32位系统最大为4GB-1字节 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

    参数计算示例:我的服务器有8GB内存(8589934592字节),页大小4KB(4096字节)。kernel.shmall = 8589934592 / 4096 = 2097152kernel.shmmax通常设置为物理内存的一半或更多,这里设为4GB-1(4294967295)。

  2. 使内核参数生效

    sudo sysctl -p
  3. 修改用户资源限制: 编辑/etc/security/limits.conf文件:

    sudo vi /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

    同时,检查/etc/pam.d/login文件,确保包含session required pam_limits.so这一行。

  4. 禁用透明大页和NUMA(重要!): 对于Oracle数据库,尤其是11g,通常建议禁用透明大页(Transparent HugePages)以避免性能问题。

    # 检查当前状态 cat /sys/kernel/mm/transparent_hugepage/enabled # 输出为 [always] madvise never,如果是always,则需要禁用。 # 编辑GRUB配置 sudo vi /etc/default/grub # 在 GRUB_CMDLINE_LINUX 行末尾添加 `transparent_hugepage=never numa=off` # 例如:GRUB_CMDLINE_LINUX="... transparent_hugepage=never numa=off" # 更新GRUB配置 sudo grub2-mkconfig -o /boot/grub2/grub.cfg # 重启后生效

    注意:此操作需要重启服务器。务必在业务允许的时间窗口进行。

3. Oracle 11g软件安装与配置详解

当所有前置条件满足后,我们就可以开始安装Oracle软件了。这里我选择使用图形界面(GUI)安装,因为它对新手更友好,也便于检查每一步的选项。

3.1 获取安装文件与解压

从Oracle官网下载适用于Linux x86-64的Oracle Database 11g Release 2 (11.2.0.4)安装包,通常有两个文件:linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip

  1. 上传与解压: 将两个zip文件上传到服务器的一个临时目录,例如/tmp使用oracle用户操作

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

    解压后会生成一个database目录。

  2. 处理中文环境问题(可选但建议): 如果服务器是纯英文环境,安装界面会是英文。如果想用中文界面,需要设置语言环境。但有时中文环境可能导致安装界面乱码。一个稳妥的做法是临时设置为英文环境进行安装:

    export LANG=en_US.UTF-8

3.2 启动图形化安装界面

由于我们是通过SSH远程连接,需要启用X11转发来显示图形界面。

  1. 在本地客户端(如Windows上的MobaXterm、Xshell,或macOS/Linux终端)确保X11转发已开启
  2. SSH连接时使用-X-Y参数(例如:ssh -X oracle@服务器IP)。
  3. 在服务器端,切换到oracle用户,进入解压目录,运行安装程序
    cd /tmp/database ./runInstaller
    如果遇到“无法打开显示器”的错误
    • 确认本地已安装X Server(如Windows的VcXsrv,macOS的XQuartz)。
    • 以oracle用户执行xhost +(有时需要在本地执行)。
    • 确保DISPLAY环境变量已正确设置:echo $DISPLAY应输出类似localhost:10.0的内容。

3.3 图形界面安装步骤与关键选择

安装程序启动后,按照向导一步步进行。以下是关键步骤的决策点:

  1. 配置安全更新:取消勾选“我希望通过My Oracle Support接收安全更新”,跳过电子邮件和密码填写。点击“下一步”,会有一个警告,选择“是”。

  2. 安装选项:选择“创建和配置数据库”。(如果仅安装软件,后续再建库,可选“仅安装数据库软件”)。

  3. 系统类:选择“服务器类”。桌面类功能有限,不适用于生产环境。

  4. 网格安装选项:选择“单实例数据库安装”。RAC(实时应用集群)需要额外的网络和存储配置。

  5. 安装类型:选择“典型安装”。高级安装可以更精细地控制,但典型安装已包含大部分必要配置。

    • Oracle基目录:会自动填入ORACLE_BASE环境变量的值(/u01/app/oracle)。
    • 软件位置:会自动填入ORACLE_HOME/u01/app/oracle/product/11.2.0/dbhome_1)。
    • 数据库文件位置:使用默认的$ORACLE_BASE/oradata即可。
    • 数据库版本:选择“企业版”。
    • 字符集至关重要!务必选择“AL32UTF8”(Unicode UTF-8字符集),以支持中文和多国语言。默认的“ZHS16GBK”在全球化场景下限制较多。
    • 全局数据库名:可填写orcl.yourdomain.com或简单的orcl
    • 管理口令:为SYS、SYSTEM等管理员账户设置一个强密码。务必牢记此密码
  6. 先决条件检查:这是最容易卡住的一步。安装程序会自动检查所有依赖和参数。

    • 如果所有检查都通过(标记为绿色),直接点击“下一步”。
    • 如果出现警告(黄色)或失败(红色)
      • “物理内存”或“交换空间”不足:根据前面章节的计算,扩容物理内存或交换分区。
      • “包 ‘compat-libstdc++-33’ 未找到”等依赖缺失:这正是我们之前强调手动安装的原因。如果检查失败,记下缺失的包名,手动安装后,回到此界面点击“重新检查”。
      • “内核参数 ‘semmsl’ 设置不正确”:说明/etc/sysctl.conf中的kernel.sem值未生效或不对。检查文件并执行sysctl -p,然后重新检查。
      • “用户 ‘oracle’ 的 ‘nofile’ 软限制小于 1024”:检查/etc/security/limits.conf/etc/pam.d/login配置,并确保oracle用户已重新登录(su - oracle)。
  7. 概要:回顾所有安装设置,确认无误后点击“完成”,开始安装。

  8. 安装过程:此时安装程序会拷贝文件、链接库、编译代码。这个过程可能需要20分钟到1小时,取决于服务器性能。请耐心等待

  9. 执行配置脚本:软件安装完成后,会弹出一个对话框,提示需要以root权限执行两个脚本。

    • 打开一个新的终端,以root用户登录服务器。
    • 按顺序执行提示路径下的脚本,通常是:
      sudo /u01/app/oraInventory/orainstRoot.sh sudo /u01/app/oracle/product/11.2.0/dbhome_1/root.sh
    • 执行root.sh时,会询问“本地 bin 目录的位置”,直接按回车使用默认值/usr/local/bin即可。
    • 脚本执行成功后,回到安装界面点击“确定”。
  10. 数据库配置助手(DBCA):随后安装程序会自动调用DBCA创建数据库。你会看到创建进度条。此过程也会持续一段时间。

  11. 完成:当出现“数据库创建完成”的提示,并显示数据库的全局名称、服务器参数文件位置、企业管理器(EM)Database Express URL(通常是https://<主机名>:1158/em)时,表示安装和建库全部成功。记下这些信息,特别是EM URL。

4. 安装后配置与基础验证

安装完成并不意味着万事大吉,还需要进行一些必要的配置和验证,确保数据库可用、可管理。

4.1 配置监听器与本地网络服务

Oracle通过监听器(Listener)接收客户端连接。安装后通常已自动配置好一个监听器(LISTENER),但我们需要确认其状态并配置本地网络服务名(TNS)。

  1. 检查监听器状态

    su - oracle lsnrctl status

    如果看到“STATUS of the LISTENER”为“READY”,并且下面列出了服务(如orcl),说明监听器正常。

  2. 启动/停止监听器(如果需要):

    lsnrctl start lsnrctl stop
  3. 配置本地网络服务名(TNSNAME): 为了在本地方便地连接数据库,需要配置$ORACLE_HOME/network/admin/tnsnames.ora文件。

    cd $ORACLE_HOME/network/admin vi tnsnames.ora

    添加以下内容(根据你的实际主机名和SID修改):

    ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = your_server_hostname_or_ip)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) # 或者 (SID = orcl),通常用SERVICE_NAME ) )

    保存后,就可以使用sqlplus sys/密码@orcl as sysdba的方式连接了。

4.2 验证数据库连接与基本操作

  1. 使用SQL*Plus连接

    sqlplus / as sysdba

    这是操作系统认证方式,无需密码,直接以sysdba身份登录。如果成功,会显示“Connected to: Oracle Database 11g Enterprise Edition ...”。

  2. 执行基本SQL查询

    SELECT name, open_mode, log_mode FROM v$database; SELECT * FROM v$version;

    第一条语句查看数据库名和状态,第二条查看数据库版本信息。

  3. 创建测试用户和表

    CREATE USER testuser IDENTIFIED BY Test123456; GRANT CONNECT, RESOURCE TO testuser; ALTER USER testuser QUOTA UNLIMITED ON USERS; CONNECT testuser/Test123456; CREATE TABLE test_table (id NUMBER, name VARCHAR2(50)); INSERT INTO test_table VALUES (1, '麒麟系统Oracle测试'); COMMIT; SELECT * FROM test_table;

    这一系列操作验证了数据库基本的用户管理、对象创建和DML操作功能是否正常。

4.3 配置开机自启动

默认情况下,Oracle实例和监听器不会随系统自动启动。我们需要配置一个服务脚本。

  1. 创建dbora服务脚本(适用于Systemd系统,如麒麟V10):

    sudo vi /etc/systemd/system/dbora.service

    写入以下内容(根据你的实际路径修改ORACLE_HOMEORACLE):

    [Unit] Description=Oracle Database Service After=network.target [Service] Type=forking Environment="ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1" Environment="ORACLE_SID=orcl" User=oracle Group=oinstall 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 Restart=on-abort TimeoutSec=300 [Install] WantedBy=multi-user.target
  2. 启用并启动服务

    sudo systemctl daemon-reload sudo systemctl enable dbora.service sudo systemctl start dbora.service sudo systemctl status dbora.service
  3. 配置监听器自启动: 编辑oracle用户的.bash_profile,在最后添加一行,让其在登录时自动启动监听器(这是一种简单方法,更规范的做法是再创建一个监听器的systemd服务):

    # 在 ~/.bash_profile 末尾添加 if [ -f $ORACLE_HOME/bin/tnslsnr ]; then $ORACLE_HOME/bin/lsnrctl start > /dev/null 2>&1 & fi

    或者,也可以创建一个单独的systemd服务文件oracle-listener.service

5. 疑难问题排查与经验总结

在整个安装和配置过程中,我遇到了不少典型问题。这里把它们集中起来,并提供排查思路。

5.1 图形界面(GUI)无法启动

  • 问题现象:执行./runInstaller后提示 “无法打开显示器” 或 “Can‘t open display”。
  • 排查步骤
    1. 确认本地X Server:Windows用户确保VcXsrv或Xming已运行,并设置了正确的显示编号(如0.0)。
    2. 检查SSH连接参数:连接时务必使用ssh -X user@hostssh -Y user@host
    3. 检查DISPLAY变量:在服务器上执行echo $DISPLAY。正常应为localhost:10.0或类似。如果为空,手动设置:export DISPLAY=你的本地IP:0.0(例如export DISPLAY=192.168.1.100:0.0),并确保本地防火墙允许了X11连接。
    4. 使用xhost授权:在本地X Server的命令窗口执行xhost +(注意安全风险,仅测试用)。

5.2 先决条件检查失败

这是最常见的问题区域。

  • 依赖包缺失

    • 现象:检查列表中出现大量红色的 “未找到” 错误。
    • 解决:不要完全依赖yum。按照本文2.2节的方法,手动从rpmfind等网站下载对应的.i686.x86_64的rpm包,用rpm -ivh --nodeps --force命令强制安装(注意依赖关系,可能需按顺序安装多个包)。compat-libstdc++-33libaio-develpdksh(或ksh)是重灾区。
  • 内核参数不生效

    • 现象:修改了/etc/sysctl.conf但检查仍然报错。
    • 解决
      1. 执行sudo sysctl -p重新加载。
      2. 检查参数名是否正确,特别是kernel.sem的四个值用空格分隔。
      3. 对于shmallshmmax,确保计算的值是整数,没有小数点。
  • 用户资源限制未生效

    • 现象nofilenproc限制检查失败。
    • 解决
      1. 确认/etc/security/limits.conf中oracle用户的设置无误。
      2. 检查/etc/pam.d/login/etc/pam.d/sshd(对于SSH登录)是否包含session required pam_limits.so
      3. 最关键的一步:oracle用户必须重新登录su - oracle)才能使limits生效。仅仅source .bash_profile是不够的。

5.3 OUI(Oracle Universal Installer)运行缓慢或卡死

  • 可能原因:主机名解析问题。OUI可能会尝试解析主机名,如果/etc/hosts配置不正确,会导致延迟。
  • 解决:编辑/etc/hosts文件,确保包含一行将主机名映射到127.0.0.1或本机实际IP。
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 your_hostname ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 your_hostname # 或者使用服务器实际IP 192.168.1.100 your_hostname
    修改后,重启网络或直接重启服务器。

5.4 数据库创建(DBCA)失败

  • 现象:在安装最后阶段,DBCA进度条卡住或报错退出。
  • 常见错误与解决
    • ORA-27125: unable to create shared memory segment:共享内存问题。检查/dev/shm挂载点大小(df -h /dev/shm),它应大于memory_targetsga_target参数设置。可以临时增大:sudo mount -o remount,size=8G /dev/shm
    • 字符集相关问题:如果在建库后期报字符集错误,很可能是在安装时选错了字符集。最稳妥的方案是重装,并在“典型安装”的字符集选项处明确选择“AL32UTF8”。试图后期修改字符集非常复杂且风险高。
    • 空间不足:检查/tmp和 Oracle数据文件目标目录的剩余空间。

5.5 安装后的连接问题

  • 监听器无法启动或连接超时

    1. 检查监听器配置文件$ORACLE_HOME/network/admin/listener.ora。默认配置通常可用。
    2. 检查防火墙是否放行了1521端口:sudo firewall-cmd --list-ports(麒麟可能使用firewalld)。添加规则:sudo firewall-cmd --permanent --add-port=1521/tcp && sudo firewall-cmd --reload
    3. 使用tnsping工具测试:tnsping orcl(前提是配置了tnsnames.ora)。
  • sqlplus: command not found: 环境变量ORACLE_HOMEPATH未正确设置。确保已按照2.3节正确编辑了oracle用户的.bash_profile并执行了source

5.6 性能与稳定性调优初步建议

安装只是第一步,要让Oracle在麒麟系统上稳定高效运行,后续还需要持续观察和调优。

  1. 监控内存使用:关注memory_targetsga_target的设置是否合理。初期可以设置为物理内存的40-60%。通过sqlplus连接后执行show parameter target查看。
  2. 日志轮转:定期检查$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace目录下的告警日志(alert_<sid>.log),关注其中的错误(ORA-)和警告信息。
  3. 备份策略:即使是在测试环境,也要尽早规划并实施RMAN备份策略。这是DBA的底线。
  4. 系统层面:持续监控服务器的CPU、内存、I/O和网络状况。麒麟系统自带的监控工具或topvmstatiostat是好朋友。

整个安装过程,最耗费时间的往往不是点击“下一步”,而是前期依赖包的准备和系统参数的调试。尤其是在麒麟这样一个相对“非主流”的Linux发行版上,更需要耐心和细致的排查。我的建议是,严格按照检查清单操作,遇到报错不要慌,仔细阅读错误信息,十有八九都能在本文提到的几个方面找到原因。成功安装并看到“Database creation complete”的那一刻,你会觉得所有的折腾都是值得的。这套环境稳定运行了几个月,承载的业务应用也没有出现兼容性问题,证明了在麒麟SP3 x86系统上部署Oracle 11g是完全可行的技术路线。