NC57与Oracle 10g安装部署实战:从系统参数到应用启动的完整避坑指南
简介这份文档面向用友NC57的部署实施人员与运维初学者聚焦Oracle 10g数据库与NC57产品的完整安装流程帮助读者在较短时间内理清从数据库准备到系统管理设置的各环节要点。资源包内共1个doc文件压缩后约2.77MB以图文步骤形式记录安装过程便于对照操作与排查问题。内容涵盖Oracle数据库安装、表空间与用户创建、NC57产品安装顺序、NcSysConfig.bat配置、中间件启动、客户端与浏览器设置以及系统管理设置等模块其中表空间脚本与用户授权语句可直接参考使用产品安装部分还按客户化、企业门户、财务会计、供应链、人力资源等模块梳理了安装次序有助于避免因顺序错误导致的部署异常。目前已有345人学习下载适合需要快速上手NC57环境搭建或复盘安装细节的技术人员参考。1. NC57 与 Oracle 10g 的安装为什么老系统部署总在第一步翻车接手一套基于 NC57 的老系统部署任务时很多人第一反应是“装个数据库、跑个安装包能有多难”。真正动手才发现Oracle 10g 这个版本对操作系统、内核参数、依赖库、字符集极其挑剔而 NC57 作为一套依赖中间件和数据库紧耦合的应用安装顺序错一步后面全是玄学报错。我见过太多人卡在监听起不来、实例连不上、NC57 启动报字符集不匹配这三件事上反复重装三四天。这篇笔记面向的是需要在一台干净服务器上把 NC57 和 Oracle 10g 完整跑起来的运维或实施人员。我会按“先立住原理、再给可复现步骤、最后讲坑”的顺序把安装路径、参数含义、失败时看哪个日志都讲清楚。你跟着做能少走至少两轮重装。需要说明的是Oracle 10g 属于较早期版本本文以常见的企业内网 Linux 环境为背景展开具体补丁号以你手头介质为准。2. 装之前先把地基打对系统环境与依赖检查2.1 为什么 Oracle 10g 对系统这么敏感Oracle 10g 的安装程序在启动时会做一轮“先决条件检查”检查项包括内核参数、内存与交换分区、临时目录空间、系统包版本、主机名解析等。它不像新版本那样宽容任何一项不达标安装界面可能直接闪退或者装到一半报“ORA-27125”“ORA-12547”这类让人摸不着头脑的错误。核心原因在于 10g 的实例进程依赖共享内存和信号量而这两者由内核参数kernel.shmmax、kernel.shmall、kernel.sem控制。如果shmmax小于 SGA 目标值实例根本起不来。另一个高频问题是主机名10g 安装时会把主机名写进监听配置和实例参数如果/etc/hosts里没有把主机名解析到本机 IP监听器启动会卡住或报“TNS-12545”。常见做法是先确认系统版本和位数再逐项核对参数。我一般会先跑一遍检查脚本把不达标项一次性改完避免装到一半回头改。2.2 系统参数与依赖包的一次性配置下面这段脚本把内核参数、用户限制、依赖包检查合并在一起适合在 CentOS 或 RHEL 系环境执行。执行前请确认你有 root 权限。#!/bin/bash # 检查并设置 Oracle 10g 所需内核参数 # 注意shmmax 建议设为物理内存的一半或 SGA 目标值以上 echo 当前内存 free -m # 设置共享内存参数 sysctl -w kernel.shmmax4294967296 sysctl -w kernel.shmall1048576 sysctl -w kernel.sem250 32000 100 128 sysctl -w fs.file-max6815744 sysctl -w net.ipv4.ip_local_port_range9000 65500 sysctl -w net.core.rmem_default262144 sysctl -w net.core.rmem_max4194304 sysctl -w net.core.wmem_default262144 sysctl -w net.core.wmem_max1048576 # 持久化写入 cat /etc/sysctl.conf EOF kernel.shmmax4294967296 kernel.shmall1048576 kernel.sem250 32000 100 128 fs.file-max6815744 net.ipv4.ip_local_port_range9000 65500 net.core.rmem_default262144 net.core.rmem_max4194304 net.core.wmem_default262144 net.core.wmem_max1048576 EOF # 设置 oracle 用户限制 cat /etc/security/limits.conf EOF oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 EOF # 检查关键依赖包 for pkg in binutils compat-libstdc-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc glibc-common glibc-devel libaio libaio-devel libgcc libstdc libstdc-devel make sysstat unixODBC unixODBC-devel; do rpm -q $pkg /dev/null 21 || echo 缺失: $pkg done这段脚本的逻辑分三块。第一块设置共享内存和信号量shmmax给到 4G 是为了覆盖大多数中小型 NC57 库的 SGA 需求如果你的物理内存只有 4G建议降到 2G 左右否则系统本身会吃紧。第二块把参数持久化避免重启后失效。第三块检查依赖包缺哪个补哪个其中libaio和compat-libstdc是 10g 安装程序最容易漏掉的两个。参数说明kernel.sem四个值分别是“信号量集合最大值、系统级信号量最大值、单次操作信号量最大值、信号量集合数”10g 官方建议值就是250 32000 100 128照抄即可。ip_local_port_range影响监听器和客户端连接可用的端口范围给宽一点没坏处。2.3 用户、目录与主机名解析Oracle 不允许用 root 直接安装必须建独立用户和组。目录规划上我习惯把软件目录和数据目录分开方便后续备份和迁移。# 创建用户组和用户 groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle # 创建目录并授权 mkdir -p /u01/app/oracle/product/10.2.0/db_1 mkdir -p /u01/app/oracle/oradata chown -R oracle:oinstall /u01 chmod -R 775 /u01 # 配置 oracle 用户环境变量 su - oracle cat ~/.bash_profile EOF export ORACLE_BASE/u01/app/oracle export ORACLE_HOME\$ORACLE_BASE/product/10.2.0/db_1 export ORACLE_SIDnc57db export PATH\$ORACLE_HOME/bin:\$PATH export LD_LIBRARY_PATH\$ORACLE_HOME/lib:/lib:/usr/lib export NLS_LANGAMERICAN_AMERICA.AL32UTF8 EOF source ~/.bash_profile这里ORACLE_SID我设成nc57db你可以按项目规范改但一旦定了后面建库、监听、NC57 连接串都要一致。NLS_LANG设成AL32UTF8是为了和 NC57 常用的 UTF-8 字符集对齐如果这里设错后面 NC57 连上库也会出现中文乱码。主机名解析这一步经常被跳过。执行hostname拿到主机名然后确认/etc/hosts里有对应记录hostname # 假设输出 nc57-app grep nc57-app /etc/hosts || echo 127.0.0.1 nc57-app /etc/hosts没有这条记录监听器配置时用主机名会解析失败表现为lsnrctl start卡住或报 TNS 错误。3. 静默安装 Oracle 10g响应文件与建库命令3.1 为什么推荐静默安装而不是图形界面图形界面安装依赖 X11 转发在内网服务器上要么没装桌面环境要么转发卡顿装到一半断连就得重来。静默安装用响应文件把所有制项提前写好一条命令跑完可重复、可记录、可审计。对于 NC57 这种需要反复部署的场景静默方式明显更稳。静默安装分两步先跑数据库软件安装再跑建库脚本。两步都用响应文件驱动。3.2 数据库软件安装的响应文件与执行把安装介质解压到某个目录比如/soft/database然后在里面找到response/db_install.rsp复制一份修改。关键项如下# 复制并编辑响应文件 cd /soft/database/response cp db_install.rsp db_install_custom.rsp vi db_install_custom.rsp需要改的项oracle.install.optionINSTALL_DB_SWONLY UNIX_GROUP_NAMEoinstall INVENTORY_LOCATION/u01/app/oracle/oraInventory ORACLE_HOME/u01/app/oracle/product/10.2.0/db_1 ORACLE_BASE/u01/app/oracle oracle.install.db.InstallEditionEE oracle.install.db.isCustomInstallfalse oracle.install.db.DBA_GROUPdba oracle.install.db.OPER_GROUPdbaINSTALL_DB_SWONLY表示只装软件不建库建库我们单独做这样出问题好定位。InstallEdition选 EE 是企业版如果你的介质是标准版就改成 SE。执行安装cd /soft/database ./runInstaller -silent -responseFile /soft/database/response/db_install_custom.rsp -ignorePrereq-ignorePrereq是跳过先决条件检查只有在 2.2 节参数都确认过的情况下才建议加否则可能装出一个跑不起来的实例。安装过程中会提示你用 root 执行两个脚本按提示执行/u01/app/oracle/oraInventory/orainstRoot.sh /u01/app/oracle/product/10.2.0/db_1/root.sh执行完回安装窗口按回车继续。看到Successfully Setup Software就说明软件层装好了。3.3 用 DBCA 静默建库与监听配置建库用dbca的静默模式。先准备一个建库响应文件关键参数包括库名、字符集、内存分配、数据文件路径。# 生成建库响应文件模板 dbca -silent -generateScripts -templateName General_Purpose.dbc -gdbName nc57db -sysPassword oracle123 -systemPassword oracle123 -responseFile /tmp/dbca.rsp然后编辑/tmp/dbca.rsp重点确认gdbNamenc57db sidnc57db characterSetAL32UTF8 nationalCharacterSetAL16UTF16 totalMemory2048 datafileDestination/u01/app/oracle/oradatatotalMemory单位是 MB按你服务器内存给NC57 库一般 2G 到 4G 够用。characterSet必须是AL32UTF8和前面NLS_LANG对齐。执行建库dbca -silent -responseFile /tmp/dbca.rsp建库完成后配置监听。10g 的监听配置文件在$ORACLE_HOME/network/admin/listener.ora常见内容LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST nc57-app)(PORT 1521)) ) ) SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME nc57db) (ORACLE_HOME /u01/app/oracle/product/10.2.0/db_1) ) )启动监听并验证lsnrctl start lsnrctl status # 用 sqlplus 验证实例可连 sqlplus system/oracle123nc57db as sysdbalsnrctl status里能看到nc57db状态为 READY就说明数据库层通了。4. NC57 应用侧安装连接串、字符集与启动顺序4.1 NC57 与 Oracle 的对接点在哪NC57 作为应用层和 Oracle 的对接集中在三处JDBC 连接串、字符集、事务隔离级别。连接串里如果 SID 写错或监听端口不对应用启动直接报连接拒绝。字符集不一致则表现为登录后中文变问号。事务隔离级别如果和数据库默认值冲突批量操作时可能出现锁等待。安装 NC57 前先确认它的中间件版本和 JDK 版本要求。常见做法是查安装介质里的说明文件按它给的 JDK 版本准备环境不要用系统自带的 JDK 硬套。4.2 配置数据源与启动应用假设 NC57 部署在/opt/nc57配置文件在/opt/nc57/conf/datasource.properties典型内容jdbc.driveroracle.jdbc.driver.OracleDriver jdbc.urljdbc:oracle:thin:nc57-app:1521:nc57db jdbc.usernamenc57user jdbc.passwordnc57pass jdbc.initialSize5 jdbc.maxActive50 jdbc.validationQuerySELECT 1 FROM DUALjdbc.url里主机:端口:SID三段必须和监听配置完全一致。validationQuery用SELECT 1 FROM DUAL是 Oracle 的标准探活语句别写成 MySQL 的写法。启动前先在数据库里建好应用用户并授权-- 用 sysdba 登录后执行 CREATE USER nc57user IDENTIFIED BY nc57pass; GRANT CONNECT, RESOURCE TO nc57user; GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER TO nc57user; ALTER USER nc57user DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;然后启动 NC57cd /opt/nc57/bin ./startup.sh tail -f /opt/nc57/logs/catalina.out日志里看到数据源初始化成功、没有ORA-开头的错误就说明应用层连上了。4.3 启动顺序与依赖关系正确的启动顺序是先起监听再起数据库实例最后起 NC57。如果服务器重启这个顺序不能乱。我一般会写一个启动脚本固化顺序#!/bin/bash # 按顺序启动 Oracle 监听、实例、NC57 su - oracle -c lsnrctl start su - oracle -c sqlplus / as sysdba EOF startup exit EOF sleep 10 su - nc57 -c /opt/nc57/bin/startup.shsleep 10是给实例留出完全打开的时间实例没完全起来就启应用连接池会报一堆超时。这个等待时间按你服务器性能调机械盘环境建议给到 20 秒。5. 安装过程中最容易踩的五个坑5.1 坑一监听启动报 TNS-12545现象lsnrctl start卡住十几秒后报TNS-12545: Connect failed because target host or object does not exist。原因listener.ora里HOST写的是主机名但/etc/hosts没有把该主机名解析到本机 IP或者解析到了错误的地址。解决执行hostname确认主机名在/etc/hosts里加一行本机IP 主机名重启监听。如果有多网卡确认解析到的是你希望监听绑定的那个 IP。5.2 坑二建库时报 ORA-27125现象dbca建库到创建实例阶段报ORA-27125: unable to create shared memory segment。原因kernel.shmmax小于 SGA 目标值或者kernel.shmall不够。10g 对共享内存的检查比新版本严格。解决把shmmax调到 SGA 目标值的 1.5 倍以上shmall按页大小换算后给足。改完sysctl -p生效重新建库。如果物理内存本身不够就调低totalMemory参数。5.3 坑三NC57 连上库但中文乱码现象NC57 能启动登录也正常但页面里的中文显示成问号或方块。原因数据库字符集、NLS_LANG、JDBC 连接参数三者不一致。常见情况是库建成了ZHS16GBK而NLS_LANG设的是AL32UTF8。解决查库字符集SELECT * FROM nls_database_parameters WHERE parameterNLS_CHARACTERSET;把NLS_LANG和 JDBC 连接串里的字符集参数改成一致。如果库已经建成 GBK 且数据不多重建库改成AL32UTF8更彻底。5.4 坑四root.sh 执行报权限错误现象安装软件后执行root.sh报Failed to create /etc/oraInst.loc或类似权限错误。原因oraInventory目录属主不对或者之前装过 Oracle 残留了旧的 inventory 文件。解决确认/u01/app/oracle/oraInventory属主是oracle:oinstall删除残留的/etc/oraInst.loc和/etc/oratab后重新执行。如果之前装过其他版本 Oracle建议先清理干净再装 10g。5.5 坑五应用启动报连接池耗尽现象NC57 启动后运行一段时间报Connection pool exhausted或大量ORA-00020: maximum number of processes exceeded。原因jdbc.maxActive设得过大或者应用有连接泄漏加上 Oracle 的processes参数默认值偏小。解决先查SHOW PARAMETER processes;按需调大并重启实例。同时检查应用代码里是否有未关闭的连接。maxActive不要超过processes的 70%留出余量给后台进程。6. 装完之后怎么验证三条命令加一个习惯安装完成不等于交付完成。我一般用三条命令做最终验证再养成一个看日志的习惯。第一条验证监听和实例状态lsnrctl status | grep -E nc57db|READY sqlplus -s system/oracle123nc57db EOF SELECT status FROM v\$instance; SELECT name, open_mode FROM v\$database; EOFv$instance返回 OPENv$database返回 READ WRITE说明数据库层完全就绪。第二条验证字符集一致性SELECT parameter, value FROM nls_database_parameters WHERE parameter IN (NLS_CHARACTERSET,NLS_NCHAR_CHARACTERSET);对照NLS_LANG和 JDBC 连接串三者字符集必须能互相转换且不丢字符。第三条验证 NC57 应用层连通性curl -s -o /dev/null -w %{http_code} http://localhost:8080/nc57/health返回 200 说明应用层健康检查通过。如果没有健康检查接口就看catalina.out里最近 100 行有没有ERROR或ORA-。一个习惯每次重启服务器后按第 4.3 节的顺序手动走一遍确认监听、实例、应用依次起来。我见过太多人图省事把三个服务设成同时自启结果实例还没打开应用就抢连接日志里一堆超时排查半天才发现是启动顺序问题。这个顺序习惯坚持下来能省掉大量“重启后应用起不来”的后悔药。希望帮到你。本文还有配套的精品资源点击获取