ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Oracle 19c Solaris x86 客户端 home 部署与连接实战

Oracle 19c Solaris x86 客户端 home 部署与连接实战 简介Oracle Database 19c 客户端安装包面向需要在 Oracle Solaris x86 32 位环境中连接、开发与管理数据库的运维与开发人员解决该平台下客户端组件缺失、环境配置繁琐的问题。压缩包共 14671 个文件约 807.92MB以 htm 帮助文档、jar 与 so 动态库、sql 脚本、xml 配置、pl/plb 脚本及各类可执行工具为主涵盖 env.ora 环境配置、runInstaller 安装入口、root.sh 后置脚本、sqldeveloper 开发工具、oracore 核心库、ldap 目录服务、olap 分析组件、utl 工具库与 inventory 安装清单等模块并附带 libclntsh、libocci 等客户端动态链接库。已有 239 人学习下载。读者可据此完成 Solaris 32 位平台客户端部署获得从环境变量定制、图形化 SQL/PLSQL 开发到系统级权限调整与目录服务集成的完整能力适合中高级数据库从业者按需取用。1. 从 SOLARIS.X32-195000-client-home.zip 说起19c 客户端在 Solaris x86 上到底装的是什么手里拿到一个SOLARIS.X32-195000-client-home.zip第一反应往往是这玩意儿是给 Solaris x86 32 位平台用的 Oracle Database 19c 客户端 home 包解压出来应该是一个完整的client_home目录树而不是安装介质。它解决的核心问题很具体——你有一台跑 Solaris x86 的机器需要连远端 19c 数据库但不想在本地装完整数据库服务端也不想依赖系统自带的旧版 sqlplus。适合谁一类是维护遗留 Solaris 小机、又要把新库接进来的 DBA另一类是 EBS、ERP 这类老系统周边需要在本机放一个能跑 sqlplus、exp/imp、sqlldr 的轻量客户端。热词里 oracle 19c 安装过程、oracle监听服务无法启动、oracle入门 都指向同一个痛点客户端 home 装完连不上问题多半不在包本身而在环境变量和网络配置。这一章先把「这个 zip 是什么、不是什么」讲清楚后面再动手。2. 解压前先想清楚19c 客户端 home 的目录结构与依赖关系2.1 为什么是 client-home 而不是完整安装介质Oracle 19c 的交付形态分几种完整数据库安装介质两个 zipdatabase 和 grid、客户端安装介质client.zip、以及这种已经展开好的 client-home 目录包。SOLARIS.X32-195000-client-home.zip属于最后一类195000 对应 19c 的版本号段X32 表示 Solaris x86 32 位。它的价值在于省掉 runInstaller 的图形化流程——很多 Solaris 环境根本没有 X11跑 OUI 是折磨。直接解压得到一个client_home里面bin/放 sqlplus、sqlldr、exp、imp、tnspingnetwork/admin/放 tnsnames.ora 和 sqlnet.oralib/放 OCI 相关 sordbms/下是消息文件和部分 admin 脚本。常见做法是把它放到/opt/oracle/product/19c/client_1这类路径和已有的 ORACLE_HOME 区分开。需要提醒的是32 位客户端只能被 32 位进程加载。如果你的应用是 64 位编译的OCI 链接会直接报架构不匹配。这是选型阶段最容易忽略的一点先确认调用方是 32 位还是 64 位再决定用 X32 还是对应的 64 位包。2.2 解压与目录落位的具体命令假设 zip 已经上传到/tmp目标路径是/opt/oracle/product/19c/client_1用 oracle 用户操作# 以 oracle 用户执行避免后续权限问题 mkdir -p /opt/oracle/product/19c cd /opt/oracle/product/19c # 解压注意 unzip 对长路径和符号链接的处理 unzip -q /tmp/SOLARIS.X32-195000-client-home.zip -d /opt/oracle/product/19c/ # 确认解压后的顶层目录名不同打包方式可能多一层 ls -ld /opt/oracle/product/19c/* # 假设解压出 client_home重命名成 client_1 便于统一管理 mv /opt/oracle/product/19c/client_home /opt/oracle/product/19c/client_1 # 检查关键可执行文件是否存在 ls -l /opt/oracle/product/19c/client_1/bin/sqlplus ls -l /opt/oracle/product/19c/client_1/bin/tnsping逻辑说明unzip -q静默解压避免刷屏-d指定目标目录防止解压到当前目录污染。解压后先ls确认顶层结构因为有些包会多套一层client_home/有些直接就是bin/、lib/。重命名是为了让 ORACLE_HOME 路径稳定后续脚本不用改。最后检查 sqlplus 和 tnsping 是否存在这两个文件缺失基本说明包不完整或解压中断。参数说明-q不是必须但生产环境建议加如果 zip 里有符号链接Solaris 自带 unzip 可能处理不好可以用unzip -o覆盖或者用jar xf替代。解压后建议chown -R oracle:oinstall整个目录避免权限导致的「sqlplus 能跑但连不上」这类玄学问题。2.3 环境变量怎么设才不打架客户端 home 装好后环境变量是第二个坑。核心是 ORACLE_HOME、PATH、LD_LIBRARY_PATH、TNS_ADMIN 四个。常见做法是写一个独立的环境脚本比如/opt/oracle/product/19c/client_1/bin/oraenv_client.sh# 客户端环境变量独立于服务端 export ORACLE_HOME/opt/oracle/product/19c/client_1 export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/usr/lib export TNS_ADMIN$ORACLE_HOME/network/admin export NLS_LANGAMERICAN_AMERICA.AL32UTF8逻辑说明PATH 把客户端 bin 放最前保证which sqlplus指向新 homeLD_LIBRARY_PATH 必须包含$ORACLE_HOME/lib否则 sqlplus 启动时报找不到libclntsh.soTNS_ADMIN 显式指向客户端的 network/admin避免和系统里其他 Oracle home 的 tnsnames.ora 混用NLS_LANG 设成 UTF8防止中文乱码。参数说明LD_LIBRARY_PATH 里加/usr/lib是为了兜底 Solaris 系统库如果机器上已有其他 Oracle home千万不要把它们的 lib 混进来32 位和 64 位混载会直接 core dump。TNS_ADMIN 如果指向了服务端的 admin 目录可能出现「tnsping 通但 sqlplus 连不上」的怪现象因为 sqlnet.ora 里的参数不兼容。3. 让客户端真正连上库tnsnames.ora、监听与连通性排查3.1 tnsnames.ora 的最小可用配置客户端 home 解压后network/admin/下通常只有 sample 文件。要连库得自己写 tnsnames.ora。最小配置长这样# tnsnames.ora放在 $TNS_ADMIN 下 ORCL19C (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 10.0.0.25)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl19c) ) )逻辑说明ORCL19C是本地别名sqlplus 里直接用sqlplus user/passORCL19CHOST 填数据库服务器 IP 或可解析的主机名PORT 默认 1521如果服务端改过要对应SERVICE_NAME 是服务端lsnrctl status里看到的服务名不是 SID。19c 多租户环境下连 PDB 要用 PDB 的 service name连 CDB 用 CDB 的。参数说明SERVERDEDICATED 表示专用服务器模式共享服务器模式填 SHARED但客户端一般不用改。如果服务端用的是 SID 而不是 service name把 SERVICE_NAME 换成 SID orcl。写完后用tnsping ORCL19C验证返回 OK 说明网络和监听层面通了返回 TNS-12541 说明监听没起或端口不对TNS-12514 说明服务名写错。3.2 监听服务无法启动时的排查顺序热词里 oracle监听服务无法启动 是高频问题在 Solaris 客户端场景下监听通常不在客户端这台机器上而是服务端的。但客户端本地也可能起监听用于其他用途。排查顺序建议固定第一步看监听进程在不在ps -ef | grep tnslsnr。不在就尝试lsnrctl start看报错。第二步看监听日志$ORACLE_HOME/network/log/listener.log最后几十行通常直接给出原因比如端口被占、权限不足、listener.ora 语法错。第三步看端口占用netstat -an | grep 1521。如果被别的进程占了要么改端口要么停掉占用进程。第四步看 listener.ora 里的 HOST 是否写成了主机名而主机名解析不了。Solaris 上常见做法是把 HOST 改成 IP或者确认/etc/hosts里有对应记录。第五步权限问题监听日志目录如果 oracle 用户不可写启动会失败但报错很隐晦。ls -ld $ORACLE_HOME/network/log确认属主。3.3 用 sqlplus 做端到端验证环境变量和 tnsnames 都就绪后用 sqlplus 做一次完整验证# 加载客户端环境 . /opt/oracle/product/19c/client_1/bin/oraenv_client.sh # 先 tnsping确认网络层 tnsping ORCL19C # 再用 sqlplus 连-L 表示只登录一次不重试 sqlplus -L scott/tigerORCL19C EOF select banner from v$version; select sysdate from dual; exit EOF逻辑说明tnsping只验证监听可达和服务名注册不验证账号密码sqlplus -L避免密码错时反复提示heredoc 里跑两条 SQL一条看版本确认连的是 19c一条看 sysdate 确认会话正常。如果 tnsping 通但 sqlplus 报 ORA-12514说明服务名在监听里没注册报 ORA-01017 说明账号密码错报 ORA-28000 说明账号被锁。参数说明-L在脚本里很有用交互式登录可以不加。如果要用 sysdba 登录客户端一般没有 sysdba 权限需要服务端操作。select sysdate from dual是 Oracle 里最经典的连通性测试dual 是系统提供的一行一列表热词里 oracle中的truncsysdate 也是基于 dual 做日期截断属于同一类基础操作。4. 避坑与排查Solaris x86 客户端最容易翻车的 5 个点4.1 现象sqlplus 启动报 ld.so.1: sqlplus: fatal: libclntsh.so: open failed原因LD_LIBRARY_PATH 没包含$ORACLE_HOME/lib或者包含了但路径写错。Solaris 的运行时链接器对路径很敏感少一个字符就找不到。解决echo $LD_LIBRARY_PATH确认重新 source 环境脚本。如果确认路径对但仍报错用ldd $ORACLE_HOME/bin/sqlplus看依赖解析到哪缺哪个补哪个。注意 32 位客户端只能加载 32 位 so如果 lib 目录里混入了 64 位库也会报这个错。4.2 现象tnsping 通sqlplus 连报 ORA-12514 TNS:listener does not currently know of service原因tnsnames.ora 里的 SERVICE_NAME 和服务端实际注册的服务名不一致。19c 多租户下CDB 和 PDB 的 service name 不同连 PDB 必须用 PDB 的。解决在服务端跑lsnrctl status看Service xxx has 1 instance(s)那几行把 service name 抄准。如果服务端用动态注册确认local_listener参数配了否则 PDB 可能没注册到监听。4.3 现象解压后 sqlplus 能跑但 exp/imp 报找不到消息文件原因$ORACLE_HOME/rdbms/mesg/下的.msb文件缺失或者 NLS_LANG 设成了客户端不支持的字符集。解决确认rdbms/mesg/目录存在且非空NLS_LANG 建议先用AMERICAN_AMERICA.AL32UTF8不要设成中文相关值。如果确实需要中文确认客户端 home 里带了对应的nls/data/文件。4.4 现象同一台机器上已有其他 Oracle home切换后 sqlplus 行为异常原因PATH 和 LD_LIBRARY_PATH 里混入了旧 home 的路径或者oraenv脚本读的是/var/opt/oracle/oratab里的旧记录。解决不要用系统级 oraenv直接用自己写的环境脚本显式覆盖所有变量。which sqlplus和echo $ORACLE_HOME双重确认。LD_LIBRARY_PATH 里只保留当前 home 的 lib旧 home 的路径全部去掉。4.5 现象sqlplus 连上后执行查询报 ORA-01804 或字符集乱码原因NLS_LANG 和服务端字符集不匹配或者客户端 home 缺少对应的字符集定义文件。解决先查服务端select value from nls_database_parameters where parameterNLS_CHARACTERSET客户端 NLS_LANG 的字符集部分设成一致或兼容值。如果服务端是 ZHS16GBK客户端设AMERICAN_AMERICA.ZHS16GBK通常能正常显示中文。乱码问题在 Solaris 终端下还和LANG、LC_ALL有关必要时把终端 locale 也统一。5. 进阶用法把 19c 客户端 home 用成可迁移的轻量工具链5.1 用 sqlcl 替代 sqlplus 做脚本化查询热词里 oracle 19 sqlcl 如何用 指向一个实际需求sqlplus 的脚本能力有限输出格式难控制。19c 客户端 home 里通常不带 sqlcl但可以单独放一个 sqlcl 目录用 Java 调用。Solaris 上如果装了 JDKsqlcl 能直接跑# sqlcl 独立目录不依赖 ORACLE_HOME export SQLCL_HOME/opt/oracle/sqlcl export PATH$SQLCL_HOME/bin:$PATH export JAVA_HOME/usr/jdk/instances/jdk1.8.0 # 用 sqlcl 执行查询并输出 CSV sql -S scott/tigerORCL19C EOF set sqlformat csv select empno, ename, sal from emp where deptno 10; exit EOF逻辑说明-S静默模式适合脚本set sqlformat csv让输出直接是 CSV省去手工格式化sqlcl 走 JDBC 瘦驱动不依赖 OCI所以不受 32/64 位限制。参数说明JAVA_HOME 要指向可用的 JDKsqlcl 对 JDK 版本有要求太老的 JDK 可能跑不起来。这种方式适合把查询结果喂给下游脚本比 sqlplus 的set colsep干净得多。5.2 用 exp/imp 做小表迁移的注意点客户端 home 里的 exp/imp 是传统工具19c 里 exp 已不推荐但还能用。小表迁移时# 导出单表 exp scott/tigerORCL19C file/tmp/emp.dmp tablesemp log/tmp/emp_exp.log # 导入到另一套库 imp scott/tigerORCL19C file/tmp/emp.dmp tablesemp fromuserscott touserscott log/tmp/emp_imp.log逻辑说明tablesemp指定单表log记录过程便于排查fromuser/touser用于跨 schema 导入。参数说明exp 的buffer参数在 Solaris 小机上可以适当调大减少 IO 次数如果表里有 LOB 字段exp/imp 可能很慢建议改用数据泵但数据泵需要服务端目录对象权限客户端 home 里没有 expdp/impdp 的服务端组件只能连到服务端跑。5.3 验证客户端 home 是否可迁移的检查清单把客户端 home 从一台 Solaris x86 迁到另一台能不能直接用取决于几个条件。下面这张表是我一般会逐项确认的检查项命令通过标准架构匹配file $ORACLE_HOME/bin/sqlplus显示 32-bit x86依赖库完整ldd $ORACLE_HOME/bin/sqlplus无 not found消息文件ls $ORACLE_HOME/rdbms/mesg/*.msb非空网络配置tnsping 别名返回 OK字符集echo $NLS_LANG与服务端兼容权限ls -ld $ORACLE_HOMEoracle 用户可读写逻辑说明这张表覆盖了迁移后最容易出问题的六个维度。file确认二进制架构ldd确认运行时依赖消息文件缺失会导致 exp/imp 报错tnsping 确认网络NLS_LANG 确认字符集权限确认可写。任何一项不过先解决再往下走。参数说明file在 Solaris 上可能显示ELF 32-bit LSB executable看到 32-bit 就对了。ldd输出里如果有 (file not found)说明缺库需要从原机器拷贝对应 so 到$ORACLE_HOME/lib。迁移后第一次跑 sqlplus 建议用-V看版本确认没有加载到旧 home 的库。5.4 一个我常犯的错误早些年我图省事直接把客户端 home 的network/admin软链到服务端的 admin 目录想着 tnsnames 改一处就行。结果服务端的 sqlnet.ora 里有SQLNET.AUTHENTICATION_SERVICES(NTS)这类 Windows 相关配置客户端加载后行为诡异tnsping 通但 sqlplus 间歇性失败。后来改成客户端独立 admin 目录只把 tnsnames.ora 用脚本同步问题再没出现过。这个习惯我一直保留客户端和服务端的 network 配置物理隔离宁可多写一个同步脚本也不共享目录。希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进