简介:企业级ERP安装本质上是Java技术栈在服务器上的环境落地。字符集、JDK位数与JAVA_HOME、数据库会话/游标参数、中间件端口和连接池配置,都会直接影响应用能否稳定启动。配置不匹配时,常见表现是启动失败、中文乱码、连接池耗尽或端口冲突;把这些基础项提前对齐,可以显著降低重复安装和现场排查成本。对实施顾问、运维和二次开发人员而言,从裸机到可登录、可建账、可跑通业务流程,需要一套可复现的规划与验证方法。用友NC65安装正需要围绕Oracle建库、JDK与中间件准备、数据源配置和首次启动日志观察形成清单化流程。
1. NC65安装这件事:为什么同一套包在两台机器上结果不一样
用友NC65的安装,表面看是点几下“下一步”,实际是把一套 Java 技术栈的企业级 ERP 从零落到服务器上:数据库要有对的字符集和足够大的会话数,中间件要有匹配的 JDK,应用侧要有正确的数据源和端口。它解决的是“一套环境从裸机到能登录、能建账、能跑通一条业务流程”的问题,适合实施顾问、运维和做二次开发的工程师。真正让人翻车的地方从来不是向导本身,而是装之前的版本对齐和装之后的第一次启动——同一份安装包,换台机器结果不一样,多半是环境没定盘。下面按我实际做过的顺序,从规划、数据库、应用侧一路写到排查,尽量让第二个人照着能复现。
2. 装前定盘:服务器规划与依赖版本的对齐清单
安装这件事,七成工作在打开安装向导之前。我见过太多现场是包一解压就点安装,装到一半报连不上库,再回头改字符集、改端口,最后把已装的部分删掉重来。装前定盘要做三件事:把机器角色拆清楚,把版本对清楚,把系统参数和目录规划清楚。这三件事做完,后面的向导只是填空题。
2.1 三台机器的角色划分与端口占用
NC65 常见的最小可用拓扑是“数据库 + 应用”两台,规模稍大再加一台文件服务器存放附件和报表模板。不要图省事把数据库和应用塞在一台机器上做生产环境,内存争抢会让启动阶段特别难受。下表是我一般会先填好的规划表,装机前跟甲方或运维确认一遍再动手:
| 角色 | 建议配置 | 磁盘规划 | 主要端口 | 说明 |
|---|---|---|---|---|
| 数据库服务器 | 8 核 16G 起 | 数据盘单独挂载,建议 500G 起 | 1521 | Oracle 实例,NC 专用表空间 |
| 应用服务器 | 8 核 16G 起 | 系统盘 100G + 数据盘 200G | 8080、8009、1099 等 | 中间件与 NC 应用同机 |
| 文件服务器(可选) | 4 核 8G | 按附件量估算 | 共享端口 | 存放附件、模板、日志归档 |
| 管理终端 | 普通 PC | — | — | 装客户端或直接用浏览器 |
端口这一列要提前跟网络同事对一遍。8080 是最容易被占用的,很多机器上已经跑了别的 Web 服务;数据库 1521 如果同网段有多个实例,也要确认没有冲突。我的习惯是在规划表里把“端口是否已放行、是否被占用”单独列一列,装之前用ss -lntp扫一遍,比装到一半再查省事得多。
提示:测试环境图快可以直接关防火墙,生产环境走端口放行流程,别把测试习惯带到交付现场。
2.2 JDK、数据库、中间件的版本匹配表
NC65 是 Java 应用,版本错配是启动失败的头号原因。安装包一般会附带一份环境说明,以它为准;在没有说明的情况下,我一般按下表的常见组合去准备,装之前先在测试机验证一遍再上生产:
| 组件 | 常见选择 | 关键注意事项 |
|---|---|---|
| 操作系统 | 主流 Linux 发行版 64 位 | 确认 glibc 版本满足中间件要求 |
| JDK | 1.7 或 1.8 的 64 位版本 | 必须与中间件、NC 安装包位数一致,别混装 32 位 |
| 数据库 | Oracle 11gR2 或 12c | 字符集必须是 AL32UTF8,实例参数要按 NC 调 |
| 中间件 | 安装包自带中间件或 WebLogic | 用哪个就以哪个的 JDK 要求为准,不要两套 JDK 并存 |
| 数据库客户端 | 与数据库大版本一致的 instantclient | 应用服务器上要能tnsping通 |
这张表里最容易忽略的是“位数一致”和“两套 JDK 并存”。机器上原来装过一个 JDK,环境变量指向它,新装的 JDK 只是解压没改JAVA_HOME,结果中间件启动时用的是旧版本,报的错却指向应用本身,排查方向一开始就跑偏。我的做法是安装前把java -version和echo $JAVA_HOME的输出记进安装记录,装完再对一次。
2.3 系统参数与磁盘目录规划
系统参数不改,装完可能跑得起来但跑不久。文件句柄数、进程数、内存映射这些参数,在并发一上来就会暴露问题。下面这组检查命令我一般在新机器上先跑一遍,把结果贴进记录里:
# 查看当前文件句柄与进程数限制 ulimit -n ulimit -u # 查看内核参数中与内存映射、连接队列相关的值 sysctl net.core.somaxconn sysctl vm.max_map_count # 查看端口占用情况,重点看 8080、1521、8009 ss -lntp | grep -E '8080|1521|8009' # 查看时间同步状态,集群环境下时间不一致会引发登录票据问题 timedatectl status逻辑说明:ulimit -n决定单进程能打开多少文件,应用服务器上跑大量连接时不够会报“Too many open files”;vm.max_map_count在中间件加载大量类时可能触发内存映射不足;somaxconn关系到并发连接排队。参数怎么改要落到/etc/security/limits.conf和/etc/sysctl.conf,改完重新登录或sysctl -p生效。注意别直接照搬网上的“万能参数”,按机器内存和并发量估算,改完记录原值,出问题能回退。
目录规划同样要提前定。我一般把应用装在/opt/nc65,数据库装在/u01/app/oracle,附件和日志单独挂盘。日志目录要留足空间,NC 启动和运行期日志增长比想象中快,日志盘写满导致应用假死是常见的“黑匣子”现场。规划表里把每个目录的挂载点、预留空间、属主写清楚,后面装数据库和应用时直接照填,不用临时拍脑袋。
3. Oracle侧准备:建库、表空间与NC专用用户的落地脚本
数据库这一层是 NC65 安装里最容易被低估的部分。很多人建完库、给个 DBA 权限就往下走,装完能登录,跑两天开始报连接池耗尽、游标超限。NC 对数据库的会话数、游标数、字符集都有比较明确的要求,装之前把这些参数落到位,比装完再调省太多事。
3.1 实例参数为什么不能全用默认值
NC 应用启动时会建立大量数据库连接,中间件连接池加上各模块自己的连接,生产环境几百个会话是常态。Oracle 默认的processes只有 150 左右,连接一多就报“ORA-00020: maximum number of processes exceeded”,应用侧表现是登录转圈、部分模块打不开。open_cursors默认 300,NC 里复杂查询和报表会一次性打开很多游标,超了就是“ORA-01000: maximum open cursors exceeded”。
我一般会在建库后、装应用前执行下面这组调整,具体数值按并发规模放大:
-- 会话与游标相关,按并发规模调整,生产环境建议 processes 不低于 500 ALTER SYSTEM SET processes = 800 SCOPE = SPFILE; ALTER SYSTEM SET sessions = 1000 SCOPE = SPFILE; ALTER SYSTEM SET open_cursors = 3000 SCOPE = SPFILE; ALTER SYSTEM SET session_cached_cursors = 200 SCOPE = SPFILE; -- 内存参数按机器内存分配,SGA 与 PGA 合计不要超过物理内存的七成 ALTER SYSTEM SET sga_target = 8G SCOPE = SPFILE; ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE = SPFILE;逻辑说明:SCOPE = SPFILE表示写入参数文件,重启实例后生效,所以执行完要重启数据库再继续装应用。processes和sessions要留余量,因为除了 NC 连接池,还有备份、监控、运维工具会连进来。open_cursors给到 3000 是我在中等规模现场常用的值,规模再大就继续往上加,同时观察v$open_cursor的使用情况。内存参数不要一次给满,给操作系统和其他进程留出空间,否则机器会开始换页,表现是整机变慢而不是数据库报错。
注意:改
processes前先确认当前连接数,低峰期操作,改完重启实例。生产环境重启前确认没有正在跑的批处理任务。
3.2 建表空间与用户的SQL与参数说明
NC 的数据按业务量增长很快,表空间一定要开自动扩展,并且给一个合理的上限,避免单个数据文件撑爆磁盘。我一般建两个数据表空间加一个临时表空间,业务数据和索引分开,方便后面做备份和迁移:
-- 业务数据表空间,初始 2G,每次扩展 512M,上限按磁盘容量给 CREATE TABLESPACE NC_DATA01 DATAFILE '/u01/app/oracle/oradata/nc/nc_data01.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M MAXSIZE 30G; -- 索引表空间,与数据分开,便于单独维护 CREATE TABLESPACE NC_INDEX01 DATAFILE '/u01/app/oracle/oradata/nc/nc_index01.dbf' SIZE 1G AUTOEXTEND ON NEXT 256M MAXSIZE 20G; -- 临时表空间,复杂查询和排序会用到 CREATE TEMPORARY TABLESPACE NC_TEMP TEMPFILE '/u01/app/oracle/oradata/nc/nc_temp01.dbf' SIZE 1G AUTOEXTEND ON NEXT 256M MAXSIZE 10G; -- NC 专用用户,默认表空间指向业务表空间 CREATE USER nc65 IDENTIFIED BY "替换成强密码" DEFAULT TABLESPACE NC_DATA01 TEMPORARY TABLESPACE NC_TEMP; -- 安装期临时授予较高权限,装完按最小权限原则回收 GRANT CONNECT, RESOURCE, DBA TO nc65;逻辑说明:AUTOEXTEND ON和MAXSIZE要成对出现,只开自动扩展不给上限,磁盘写满时数据库会直接挂;给了上限则会在接近上限时先报错,给运维留出处理时间。用户密码用双引号包起来,避免特殊字符被 SQL 解析掉。DBA权限是安装期临时用的,NC 装完、补丁打完,我一般会收回DBA,改授具体的对象权限,这一步容易被省略,但交付时安全基线检查会看。
建完用nc65用户登录一次,确认能连上、能建表,再往下走。这一步不做,装应用时报连接错误,还得回头判断是网络、监听还是权限问题,多绕一圈。
3.3 字符集与NLS_LANG的坑
字符集这件事,建库时定错,后面改起来代价很大。NC65 要求数据库字符集为AL32UTF8,建库时选错成ZHS16GBK,装完表现是中文乱码、报表导出乱码,改字符集要导数据重建库。建库前用下面这条确认,装应用前再确认一次:
-- 查看数据库字符集,必须是 AL32UTF8 SELECT parameter, value FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');除了库本身,客户端环境变量NLS_LANG也要对齐。应用服务器上如果装了 Oracle 客户端,NLS_LANG设成与库一致的AMERICAN_AMERICA.AL32UTF8,设成 GBK 会导致应用取到的中文变成问号。这个变量在~/.bash_profile或启动脚本里设置,改完重新登录生效。我的习惯是把它和 JDK 环境变量写在一起,装完应用先验一次中文录入和查询,别等到业务上线才发现。
4. 应用侧安装:从JDK到NC安装向导的完整走法
数据库就绪后,应用侧按“装 JDK、配中间件、跑 NC 安装向导、配数据源、首次启动”的顺序推进。每一步都有可观察的中间状态,别一口气装完再看结果,出问题时不知道是哪一步埋的雷。
4.1 JDK与中间件的静默安装
JDK 我一般用解压版,不用包管理器装,避免版本被系统更新覆盖。解压到固定目录,写环境变量,验证版本:
# 解压 JDK 到统一目录,版本以安装包附带说明为准 tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/ ln -s /usr/local/jdk1.8.0_XXX /usr/local/java # 写入环境变量,NLS_LANG 与数据库字符集对齐 cat >> /etc/profile <<'EOF' export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$PATH export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 EOF # 使配置生效并验证 source /etc/profile java -version echo $JAVA_HOME逻辑说明:用软链接指向具体版本目录,后面升级 JDK 只改软链接,不用动环境变量。NLS_LANG放在系统级配置里,保证所有登录会话一致。java -version输出要确认是 64 位、大版本与中间件要求一致。如果机器上已有其他 JDK,PATH顺序决定实际调用哪个,which java再看一眼真实路径,别被旧版本截胡。
中间件按安装包说明装,用自带的就按自带的方式初始化,用 WebLogic 就按 WebLogic 的域创建流程走。这一步的关键是“JDK 指向要对”,中间件启动脚本里通常会读JAVA_HOME,装完先用中间件自带的方式起一次空服务,确认能访问控制台,再装 NC 应用。
4.2 NC安装向导的每一步该填什么
NC 安装向导里的选项不算多,但每一项填错都要重来。我把常见步骤和填写要点整理成表,装的时候对着填:
| 步骤 | 填写项 | 常见取值 | 说明 |
|---|---|---|---|
| 安装类型 | 完整安装 / 自定义 | 首次装选完整 | 只装应用不装库时选自定义 |
| 安装路径 | 应用目录 | /opt/nc65 | 路径不要带空格和中文 |
| JDK 路径 | JAVA_HOME | /usr/local/java | 与系统环境变量保持一致 |
| 数据库类型 | 数据库种类 | Oracle | 按实际数据库选 |
| 连接信息 | 主机、端口、服务名 | IP、1521、ORCL | 服务名不是 SID,别填错 |
| 数据库用户 | 用户名、密码 | nc65 / 强密码 | 用 3.2 建好的专用用户 |
| 应用端口 | HTTP 端口 | 8080 | 提前确认未被占用 |
| 管理员密码 | 超级管理员初始密码 | 强密码 | 装完立即改,别用默认 |
向导跑完后不要急着启动,先检查安装目录结构是否完整、日志里有没有报错。安装过程本身会写日志,路径一般在安装目录的日志子目录下,装完花两分钟扫一遍关键字,比启动失败再回来翻强得多。
4.3 数据源配置与首次启动的日志观察
向导装完,数据源信息一般已经写进配置,但实际连不连得通要启动才知道。启动脚本通常在应用目录的bin下,启动后不要只看“启动完成”几个字,要跟日志:
# 启动 NC 应用,具体脚本名以安装目录为准 cd /opt/nc65/bin ./startup.sh # 另开一个窗口跟踪启动日志,观察是否有连接、类加载、端口相关报错 tail -f /opt/nc65/logs/server.log # 确认端口已监听 ss -lntp | grep 8080逻辑说明:startup.sh启动的是中间件里的应用,启动时间从几十秒到几分钟不等,取决于机器性能和模块数量。日志里重点看三类信息:数据源初始化是否成功、有没有ClassNotFoundException或NoClassDefFoundError、端口绑定是否报Address already in use。ss -lntp确认端口监听后再用浏览器访问,避免应用还没起完就去刷页面,误判成启动失败。第一次启动建议在前台或紧跟着tail,别启动完就走开,出问题时日志已经被滚动覆盖了。
5. 避坑与排查:装完起不来的五类现场
安装阶段的报错大多有明确指向,难的是“看起来启动了但用不了”。下面五类是我在现场遇到频率最高的,按现象、原因、解决记录,装的时候可以对着排查。
5.1 应用启动到一半卡住,日志报连接池耗尽
现象:启动脚本执行后长时间停在某个模块,日志里出现获取连接超时、连接池耗尽的字样,数据库端用v$session看连接数接近上限。
原因:数据库processes和sessions给得不够,或者连接池最大连接数配置超过数据库能承受的量。NC 模块多,每个模块都可能建自己的连接。
解决:先把数据库processes、sessions按并发规模调大并重启实例,再把应用侧连接池的最大连接数调到一个合理值,两者之间留出余量。调完清一次应用缓存再启动,观察连接数增长是否平稳。
5.2 页面能打开,但登录报数据库连接错误
现象:浏览器能访问登录页,输入账号密码后提示数据库连接失败或服务不可用,应用日志里能看到连接被拒绝。
原因:安装向导里填的服务名与数据库实际服务名不一致,或者应用服务器上的tnsnames、连接串写错。也有可能是数据库监听只绑了本地地址。
解决:在应用服务器上用数据库客户端工具按向导里填的主机、端口、服务名单独连一次,能连上再回来看应用配置。连不上就查监听状态和网络放行,别在应用侧反复改配置。
5.3 中文录入和查询出现乱码
现象:界面能登录,录入中文保存后查询变成问号或乱码,报表导出同样异常。
原因:数据库字符集不是AL32UTF8,或者应用服务器NLS_LANG与库不一致,也可能是客户端工具字符集设置不同。
解决:先查库字符集,建库时选错只能重建库导数据;库没问题就统一应用服务器和客户端的NLS_LANG,改完重启应用,用一条中文数据做录入、查询、导出三段验证。
5.4 启动报端口被占用或访问返回 404
现象:启动日志里出现端口绑定失败,或者端口能监听但访问根路径返回 404。
原因:8080 被其他服务占用;或者应用上下文路径不是根路径,访问地址要带应用名;也可能是应用没完全启动,只是中间件起来了。
解决:用ss -lntp找到占用端口的进程,能停则停,不能停就改 NC 的应用端口并同步改访问地址。404 先确认完整访问路径,再看日志里应用部署是否成功,别把“中间件起来了”当成“应用起来了”。
5.5 装完能跑,过几天提示授权或补丁问题
现象:刚装完使用正常,过一段时间登录提示授权到期,或者某些功能模块不可用。
原因:安装包自带的是临时授权,正式授权需要单独导入;补丁没按顺序打,模块版本不一致。
解决:装完第一时间确认授权文件是否已导入、有效期到什么时候,把授权更新纳入交付清单。补丁严格按说明顺序打,打之前备份数据库和应用目录,打完逐个模块验一遍,别一次打完再统一测,出问题定位不到是哪个补丁引入的。
6. 收尾技巧:让这套安装能被第二个人复现
装完一套能跑的环境只是及格,能让第二个人照着复现才算交付。我现在的习惯是安装过程中同步写一份记录,装完再用一次“冷复现”验证:换一台干净机器,只拿这份记录和安装包,看能不能不问你任何问题装出来。记录模板大致是下面这些项,装的时候边装边填,别等装完再回忆:
| 记录项 | 填写内容 |
|---|---|
| 机器角色与 IP | 数据库、应用、文件服务器分别对应哪台 |
| 操作系统与内核版本 | 记录uname -a输出 |
| JDK 版本与路径 | java -version与JAVA_HOME |
| 数据库版本与字符集 | 实例名、服务名、字符集查询结果 |
| 关键实例参数 | processes、sessions、open_cursors 等原值与新值 |
| 表空间与用户 | 名称、数据文件路径、初始大小与上限 |
| 应用安装路径与端口 | 实际使用值,不是计划值 |
| 授权与补丁 | 授权到期时间、补丁编号与顺序 |
| 启动与停止命令 | 实际执行的脚本路径 |
除了记录,我还会在装完、验证通过后给应用服务器和数据库各做一次快照或全量备份,把“后悔药”提前备好。后面打补丁、调参数出问题,能快速回到已知可用状态,比在现场一点点回滚配置快得多。快照前确认数据库处于一致状态,应用已停止或已做归档,别在运行中直接快照。
血泪经验是:安装记录里一定要写“实际值”而不是“计划值”。计划端口 8080,实际因为冲突改成了 8081,记录里还写 8080,下一个人照着装必然踩同一个坑。我现在每改一次配置就顺手更新记录,装完再通读一遍,把前后不一致的地方改掉。这套东西不复杂,难的是坚持记。希望帮到你。
本文还有配套的精品资源,点击获取