TNS-12547: TNS:lost contact 错误解决

本文记录了在Enterprise Linux AS release 4上安装Oracle 10g R2后遇到的Listener启动失败问题及解决过程。主要错误为TNS-12547:TNS:lostcontact等,通过修改/etc/hosts文件并清空listener.log日志文件解决了问题。
新安装的Enterprise Linux Enterprise Linux AS release 4,在安装Oracle 10gR2之后,Listener不能启动.
报错信息如下:
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 104: Connection reset by peer

[oracle@test ~]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 19-JUL-2007 06:46:03
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.benbo.com)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.benbo.com)(PORT=1521)))
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 104: Connection reset by peer
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@test ~]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 19-JUL-2007 06:45:48
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.benbo.com)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@test ~]$ ping test.benbo.com
PING test.benbo.com (192.168.109.200) 56(84) bytes of data.
64 bytes from test.benbo.com (192.168.109.200): icmp_seq=0 ttl=64 time=3.56 ms
64 bytes from test.benbo.com (192.168.109.200): icmp_seq=1 ttl=64 time=0.112 ms
64 bytes from test.benbo.com (192.168.109.200): icmp_seq=2 ttl=64 time=0.055 ms
--- test.benbo.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.055/1.245/3.569/1.643 ms, pipe 2
[oracle@test ~]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
192.168.109.200 test.benbo.com test
发现/etc/hosts中并没有127.0.0.1 localhost.
 
所以,不要盲目的把 127.0.0.1 localhost  删除掉
 
修改/etc/hosts,修改后如下
[oracle@test ~]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost
192.168.109.200 test.hehe.com test
重新启动listner,OK.
[oracle@test ~]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.3.0 - Production on 19-JUL-2007 06:48:04
Copyright (c) 1991, 2006, Oracle. All rights reserved.
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.3.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.benbo.com)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=test.benbo.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.3.0 - Production
Start Date 19-JUL-2007 06:48:06
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.benbo.com)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@test ~]$
在网上搜索一下,另一种TNS-12547: TNS:lost contact的情况,具体错误如下:
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe
原因:listener.log文件超过2G
解决方法:清空日志文件
[oracle@test ~]$ cd $ORACLE_HOME/network/log
[oracle@test log]$ cat /dev/null > listener.log
<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、付费专栏及课程。

余额充值