CentOS 上 Informix 连接失败的排查与修复
一 快速定位流程
- 检查实例是否存活:以 informix 用户执行 onstat -g srvr,看到 “Up” 状态再继续;若异常,先恢复实例。
- 网络连通性:在客户端执行 ping <DB主机IP>;服务端放通回环与本机访问 nc -l <端口> 或 ss -lntp | grep <端口> 验证监听。
- 端口可达:客户端执行 nc -vz <DB主机IP> <端口> 或 telnet <DB主机IP> <端口>;不通优先排查防火墙/安全组。
- 本机监听与端口:服务端确认 ss -lntp | grep <端口> 或 netstat -tulpen | grep <端口> 存在并指向正确实例。
- 客户端最小连通测试:使用 dbaccess - - - onsoctcp <server_name> 验证协议与解析是否正常。
- 日志定位:查看 $INFORMIXDIR/log/online.log 与 $INFORMIXDIR/etc/sqlhosts 对应条目,优先从报错行与时间戳入手。
二 常见原因与对应修复
- 服务未启动或异常:执行 onstat -g srvr 确认;必要时按实例初始化脚本或管理员手册拉起,再复测连接。
- 防火墙/安全组阻断:在 firewalld 放行对应端口(示例:firewall-cmd --permanent --add-port=1526/tcp && firewall-cmd --reload);云环境同步放通安全组入站规则。
- 端口与服务映射错误:在 /etc/services 确保存在如 sqlexec 1525/tcp、sqlturbo 1526/tcp 的条目,避免解析失败。
- 客户端解析错误:在 /etc/hosts 为数据库主机添加 IP 主机名 映射,避免 DNS 不稳定导致连接失败。
- 客户端配置错误:$INFORMIXDIR/etc/sqlhosts 中 DBSERVERNAME 的协议、主机、端口需与实际一致(如 mydb onsoctcp 192.168.1.10 1526)。
- 环境变量缺失:以 informix 用户设置 INFORMIXDIR、ONCONFIG、INFORMIXSERVER、PATH,并 source 使其生效。
- SELinux 拦截:临时 setenforce 0 验证;若解决,改为 SELINUX=permissive 或配置相应策略放行。
- JDBC/ODBC 连接串错误:JDBC 示例 jdbc:informix-sqli://host:1526/db:INFORMIXSERVER=myserver;user=xxx;password=xxx;确认驱动版本与实例兼容。
三 配置文件与网络要点
- sqlhosts 示例(协议与端口需与实例一致):
- 共享内存:mydb onipcshm localhost mydb
- TCP:mydb onsoctcp 192.168.1.10 1526
- 环境变量示例(写入 ~/.bash_profile 或实例环境脚本):
- export INFORMIXDIR=/opt/IBM/informix
- export ONCONFIG=onconfig.myserver
- export INFORMIXSERVER=myserver
- export PATH=$INFORMIXDIR/bin:$PATH
- 监听与端口:确保实例配置的 NETTYPE 与 sqlhosts 协议匹配,且 /etc/services 有对应端口映射;变更后重启实例或使配置生效。
四 高频错误码与处理
- -908:通信错误,常见于主机名解析、端口不通、协议不匹配;核对 sqlhosts、/etc/hosts、/etc/services 与防火墙。
- -209:不兼容的数据格式;对老版本库执行 DBUPDATE 升级结构。
- -210:路径过长;缩短目录/表空间路径长度。
- -206:表不存在;检查 schema.table 拼写与权限。
- -243/-244:锁冲突;优化 SQL、缩短事务、必要时调整隔离级别或终止阻塞会话(如 onmode -z )。
五 一键自检命令清单
- 服务端:
- 实例状态:onstat -g srvr
- 监听端口:ss -lntp | grep <端口>
- 在线日志:tail -n 200 $INFORMIXDIR/log/online.log
- 客户端:
- 连通性:nc -vz <DB主机IP> <端口>
- 最小连通:dbaccess - - - onsoctcp <server_name>
- JDBC 串:jdbc:informix-sqli://host:1526/db:INFORMIXSERVER=myserver
- 防火墙:
- 放通端口:firewall-cmd --permanent --add-port=1526/tcp && firewall-cmd --reload
- SELinux:
- 临时放行:setenforce 0(验证后改为 permissive 或配置策略)