TNS-12547: TNS:lost contact

本文记录了一次解决Oracle数据库连接中出现的TNS-12547错误的经历,尝试了修改listener.ora文件的inbound_connect_timeout参数但未生效,最终通过重启oracle服务器解决了问题。

报错如下:

Fatal NI connect error 12547, connecting to:

 (LOCAL=NO)


  VERSION INFORMATION:
TNS for Linux: Version 11.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production
  Time: 18-MAR-2016 15:18:39
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12547
    
TNS-12547: TNS:lost contact
    ns secondary err code: 12560
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
opiodr aborting process unknown ospid (5635) as a result of ORA-609


在listener.ora里面添加 inbound_connect_timeout=0无效


然后重启lsnrctl服务也无效,最后重启oracle服务器,问题解决了。
<think>我们正在处理ORA-12547: TNS:lost contact错误。根据引用[1]和引用[2],该错误通常与权限问题有关。引用[1]提到在日志中出现了TNS-12546: TNS:permission denied,这进一步表明是权限问题。引用[2]则展示了环境变量的设置,但问题可能仍然存在。 结合之前我们处理过的“权限不够”问题(即/app/oracle/bin/oracle权限问题),以及当前错误,我们应重点检查以下方面: 1. Oracle可执行文件的权限(特别是oracle二进制文件) 2. 监听器相关文件的权限 3. 环境变量设置(ORACLE_HOME, PATH等) 4. 防火墙或SELinux设置 具体步骤: 步骤1:检查Oracle二进制文件权限 我们已经知道,如果$ORACLE_HOME/bin/oracle文件的权限不正确,会导致权限问题。请确保: - 文件权限为6751(-rwsr-s--x) - 文件所有者为oracle:oinstall 执行命令: ```bash ls -l $ORACLE_HOME/bin/oracle chmod 6751 $ORACLE_HOME/bin/oracle chown oracle:oinstall $ORACLE_HOME/bin/oracle ``` 步骤2:检查监听器文件权限 同样,监听器相关的可执行文件也需要正确的权限。检查$ORACLE_HOME/bin/tnslsnr的权限: ```bash ls -l $ORACLE_HOME/bin/tnslsnr chmod 6751 $ORACLE_HOME/bin/tnslsnr chown oracle:oinstall $ORACLE_HOME/bin/tnslsnr ``` 步骤3:检查环境变量 确保在连接数据库时,环境变量设置正确。特别是ORACLE_HOME和PATH。可以像引用[2]中那样设置环境变量,并执行source使其生效。 步骤4:检查SELinux状态 如果SELinux处于enforcing模式,可能会阻止连接。可以临时禁用SELinux来测试: ```bash setenforce 0 ``` 如果问题解决,则需要永久禁用SELinux或调整SELinux策略。 步骤5:检查防火墙 确保防火墙允许数据库监听端口(默认1521)的通信。 步骤6:检查监听器日志 查看监听器日志($ORACLE_HOME/network/log/listener.log)以获取更多错误信息。 步骤7:重新启动监听器 ```bash lsnrctl stop lsnrctl start ``` 步骤8:检查/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 在某些情况下,如果该值设置为1,可能会导致TNS问题。可以尝试将其设置为0: ```bash echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts ``` 步骤9:检查/etc/hosts文件 确保/etc/hosts文件中正确配置了主机名和IP地址的映射。 步骤10:检查数据库实例状态 确保数据库实例已经启动。 如果以上步骤仍然不能解决问题,可能需要进一步检查网络配置或重新安装Oracle客户端。 注意:在修改权限后,需要重启数据库实例和监听器。 引用[1]中提到的问题原因可能是权限被拒绝,因此我们应重点检查权限设置。 生成的相关问题: 1. 如何正确设置Oracle监听器的权限? 2. 如何永久禁用SELinux? 3. 如何配置Oracle网络环境以避免TNS错误? 4. ORA-12547错误的其他可能原因有哪些?</think>### ORA-12547: TNS:lost contact 错误深度排查与解决方案 #### 一、核心错误原因分析 1. **权限问题**(最常见) - Oracle二进制文件(`$ORACLE_HOME/bin/oracle`)权限不足(参考[^1]) - 监听器进程权限异常 - 操作系统用户组配置错误 2. **环境配置问题** - `ORACLE_HOME`路径设置错误(参考[^2]) - `LD_LIBRARY_PATH`未包含Oracle库路径 - 环境变量未生效(未执行`.bash_profile`) 3. **网络与安全限制** - SELinux/LSM安全模块拦截 - 防火墙阻断1521端口通信 - `/etc/hosts`解析错误 #### 二、分步解决方案 ```mermaid graph TD A[ORA-12547错误] --> B{排查方向} B --> C[文件权限] B --> D[环境变量] B --> E[网络配置] C --> F[检查oracle二进制权限] D --> G[验证ORACLE_HOME] E --> H[测试端口连通性] ``` ##### 1. 权限修复(关键步骤) ```bash # 检查文件权限 ls -l $ORACLE_HOME/bin/oracle # 修复权限(oracle用户执行) chmod 6751 $ORACLE_HOME/bin/oracle chown oracle:oinstall $ORACLE_HOME/bin/oracle # 检查监听器权限 ls -l $ORACLE_HOME/bin/tnslsnr chmod 6751 $ORACLE_HOME/bin/tnslsnr ``` ##### 2. 环境配置验证 ```bash # 检查环境变量(oracle用户执行) echo $ORACLE_HOME echo $PATH echo $LD_LIBRARY_PATH # 重新加载配置 source ~/.bash_profile # 验证环境 sqlplus / as sysdba <<EOF SELECT * FROM v\$version; EXIT; EOF ``` ##### 3. 网络与安全配置 ```bash # 关闭SELinux(临时) setenforce 0 # 检查防火墙 firewall-cmd --list-ports | grep 1521 firewall-cmd --add-port=1521/tcp --permanent # 验证主机解析 ping -c 3 $(hostname) cat /etc/hosts ``` #### 三、高级排查方案 1. **监听器日志分析** ```bash tail -100 $ORACLE_HOME/network/log/listener.log ``` - 关注 `TNS-12546` 错误(权限拒绝) 2. **Strace 系统调用跟踪** ```bash strace -f -o /tmp/oracle_trace.log $ORACLE_HOME/bin/oracle ``` - 检查 `EPERM` (Operation not permitted) 错误 3. **文件系统挂载检查** ```bash mount | grep noexec ``` - 若包含 `noexec` 选项,修改 `/etc/fstab` 后重启 #### 四、预防措施 1. **创建权限修复脚本** ```bash #!/bin/bash chmod 6751 $ORACLE_HOME/bin/oracle chmod 6751 $ORACLE_HOME/bin/tnslsnr restorecon -Rv $ORACLE_HOME/bin ``` 2. **环境自检函数** ```bash oracle_env_check() { [ -x "${ORACLE_HOME}/bin/oracle" ] || echo "权限错误" [ -n "${LD_LIBRARY_PATH}" ] || echo "库路径未设置" sqlplus -L /nolog <<< "exit" | grep -q ORA-12547 && echo "连接异常" } ``` > **关键注意**:麒麟系统需额外检查 `kylin-sec` 安全模块,使用: > ```bash > systemctl stop kylin-sec > systemctl disable kylin-sec > ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值