用友NC65安装部署全流程:环境规划、Oracle配置与启动排查 简介企业级ERP安装本质上是Java技术栈在服务器上的环境落地。字符集、JDK位数与JAVA_HOME、数据库会话/游标参数、中间件端口和连接池配置都会直接影响应用能否稳定启动。配置不匹配时常见表现是启动失败、中文乱码、连接池耗尽或端口冲突把这些基础项提前对齐可以显著降低重复安装和现场排查成本。对实施顾问、运维和二次开发人员而言从裸机到可登录、可建账、可跑通业务流程需要一套可复现的规划与验证方法。用友NC65安装正需要围绕Oracle建库、JDK与中间件准备、数据源配置和首次启动日志观察形成清单化流程。1. NC65安装这件事为什么同一套包在两台机器上结果不一样用友NC65的安装表面看是点几下“下一步”实际是把一套 Java 技术栈的企业级 ERP 从零落到服务器上数据库要有对的字符集和足够大的会话数中间件要有匹配的 JDK应用侧要有正确的数据源和端口。它解决的是“一套环境从裸机到能登录、能建账、能跑通一条业务流程”的问题适合实施顾问、运维和做二次开发的工程师。真正让人翻车的地方从来不是向导本身而是装之前的版本对齐和装之后的第一次启动——同一份安装包换台机器结果不一样多半是环境没定盘。下面按我实际做过的顺序从规划、数据库、应用侧一路写到排查尽量让第二个人照着能复现。2. 装前定盘服务器规划与依赖版本的对齐清单安装这件事七成工作在打开安装向导之前。我见过太多现场是包一解压就点安装装到一半报连不上库再回头改字符集、改端口最后把已装的部分删掉重来。装前定盘要做三件事把机器角色拆清楚把版本对清楚把系统参数和目录规划清楚。这三件事做完后面的向导只是填空题。2.1 三台机器的角色划分与端口占用NC65 常见的最小可用拓扑是“数据库 应用”两台规模稍大再加一台文件服务器存放附件和报表模板。不要图省事把数据库和应用塞在一台机器上做生产环境内存争抢会让启动阶段特别难受。下表是我一般会先填好的规划表装机前跟甲方或运维确认一遍再动手角色建议配置磁盘规划主要端口说明数据库服务器8 核 16G 起数据盘单独挂载建议 500G 起1521Oracle 实例NC 专用表空间应用服务器8 核 16G 起系统盘 100G 数据盘 200G8080、8009、1099 等中间件与 NC 应用同机文件服务器可选4 核 8G按附件量估算共享端口存放附件、模板、日志归档管理终端普通 PC——装客户端或直接用浏览器端口这一列要提前跟网络同事对一遍。8080 是最容易被占用的很多机器上已经跑了别的 Web 服务数据库 1521 如果同网段有多个实例也要确认没有冲突。我的习惯是在规划表里把“端口是否已放行、是否被占用”单独列一列装之前用ss -lntp扫一遍比装到一半再查省事得多。提示测试环境图快可以直接关防火墙生产环境走端口放行流程别把测试习惯带到交付现场。2.2 JDK、数据库、中间件的版本匹配表NC65 是 Java 应用版本错配是启动失败的头号原因。安装包一般会附带一份环境说明以它为准在没有说明的情况下我一般按下表的常见组合去准备装之前先在测试机验证一遍再上生产组件常见选择关键注意事项操作系统主流 Linux 发行版 64 位确认 glibc 版本满足中间件要求JDK1.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默认 300NC 里复杂查询和报表会一次性打开很多游标超了就是“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_LANGAMERICAN_AMERICA.AL32UTF8 EOF # 使配置生效并验证 source /etc/profile java -version echo $JAVA_HOME逻辑说明用软链接指向具体版本目录后面升级 JDK 只改软链接不用动环境变量。NLS_LANG放在系统级配置里保证所有登录会话一致。java -version输出要确认是 64 位、大版本与中间件要求一致。如果机器上已有其他 JDKPATH顺序决定实际调用哪个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下一个人照着装必然踩同一个坑。我现在每改一次配置就顺手更新记录装完再通读一遍把前后不一致的地方改掉。这套东西不复杂难的是坚持记。希望帮到你。本文还有配套的精品资源点击获取