暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?

原创 曹展羽 2019-07-25
1091

问题描述

造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?

专家解答

在执行“sqlplus / as sysdba”时可能会报“ORA-12547: TNS:lost contact”的错误,常见原因有如下几点:

1、查看操作系统内核参数是否无误

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16384
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

对于文件/etc/security/limits.conf 中的“oracle hard stack”值至少应该是10240。

2、确认$ORACLE_HOME/bin/oracle 文件权限和属主是否有问题

需要注意的是,在rac 环境下需要查看$ORACLE_HOME/bin/oracle 和$GRID_HOME/bin/oracle 两个文件。在没有安装GI 的环境下,正确权限为:

[oracle@OCPCZY~]$ ll $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 232424392
Feb 2 10:30
/u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[oracle@OCPCZY~]$

在有grid 用户的情况下,oracle 可执行文件正确属主应该是oracle:asmadmin,并且权限必须有s才可以,如下所示:

[root@OCPCZY ~]$ which setasmgidwrap
/u01/app/11.2.0/grid/bin/setasmgidwrap
[root@OCPCZY ~]$ setasmgidwrap -o /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[root@OCPCZY ~]$ ll /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
-rwsr-s--x 1 oracle asmadmin 232399083 Apr 21 2015
/u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[root@OCPCZY ~]# ll /u01/app/11.2.0/grid/bin/oracle
-rwsr-s--x. 1 grid oinstall 203972117 Jan 5 2015 /u01/app/11.2.0/grid/bin/oracle
[root@OCPCZY~]# chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[root@OCPCZY~]# ll /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
-rwsr-s--x 1 oracle asmadmin 232399083 Apr 21 2015
/u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[root@OCPCZY bin]# cd /u01/app/oracle/product/11.2.0/dbhome_1/bin/
[root@OCPCZY bin]# which stat
/usr/bin/stat
[root@OCPCZY bin]# stat oracle
File: `oracle'
Size: 210823844 Blocks: 411776 IO Block: 4096 regular file
Device: 802h/2050d Inode: 1717737 Links: 1
Access: (6751/-rwsr-s--x) Uid: ( 501/oracle) Gid: ( 504/asmadmin)
Access: 2017-03-16 12:33:44.809363974 +0800
Modify: 2014-05-18 17:09:50.508549983 +0800
Change: 2017-03-16 11:05:15.733816820 +0800

文件权限的详细说明如下:

u:User,即文件或目录的拥有者。

g:Group,即文件或目录的所属群组。

o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。

a:All,即全部的用户,包含拥有者,所属群组以及其他用户。

有关权限代号的部分,列表于下:

r:读取权限,数字代号为4。

w:写入权限,数字代号为2。

x:执行或切换权限,数字代号为1。

-:不具任何权限,数字代号为0。

s:当文件被执行时,根据who 参数指定的用户类型设置文件的setuid 或者setgid 权限。

如果权限不对,那么可以执行以下命令进行修复:

chmod 6751 $ORACLE_HOME/bin/oracle

如果权限不对,那么使用strace 跟踪命令也可以看到如下信息:

$strace -f -o /tmp/trace.1.log $ORACLE_HOME/bin/sqlplus / as sysdba

在trace.1.log 文件中可以看到如下的内容:

21810
open("/oracle/PROD/db/tech_st/11.1.0/admin/PROD_erptest/diag/rdbms/prod/PROD/alert/log.xml",
O_WRONLY|O_CREAT|O_APPEND, 0664) = -1 EACCES (Permission denied)
......
21810
open("/oracle/PROD/db/tech_st/11.1.0/admin/PROD_erptest/diag/rdbms/prod/PROD/trace/alert_PROD.
log", O_WRONLY|O_CREAT|O_APPEND, 0664) = -1 EACCES (Permission denied)

3、检查一下环境变量

echo $ORACLE_HOME
echo $ORACLE_SID
echo $LD_LIBRARY_PATH --注意:不同的操作系统此环境变量会不同
echo $PATH

4、检查$ORACLE_HOME/bin/oracle 和$ORACLE_HOME/rdbms/lib/config.o 的文件大小是否为0

[oracle@OCPLHR ~]$ ll $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 232424392 Feb 2 10:30
/u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
[oracle@OCPCZY ~]$ ll $ORACLE_HOME/rdbms/lib/config.o
-rw-r--r-- 1 oracle oinstall 1248 Jan 15 21:45
/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/lib/config.o
[oracle@OCPCZY ~]$

如果大小为0,那么需要先备份config.o 文件,然后重新编译oracle 软件:

% cd $ORACLE_HOME/rdbms/lib
% mv config.o config.o.bad
[oracle@OCPCZY~]$ relink all
writing relink log to: /u01/app/oracle/product/11.2.0/dbhome_1/install/relink.log

需要注意的是,relink 可能会报错,所以需要检查上边生成的日志文件

$ORACLE_HOME/install/relink.log。

5、检查$ORACLE_HOME/network/admin/sqlnet.ora 文件中的内容查看是否设置了限制某些IP 地址登录的内容,此时可以通过查看监听日志的内容来确定。如果设置了限制登录的内容,则可以把tcp.validnode_checking 设为no,或者在tcp.invited_nodes 加入允许访问的IP 或机器名。

6、检查监听日志文件的大小,确保监听日志文件的大小不能超过2G。如果超过2G,那么可以使用如下的方法

解决:

[oracle@test ~]$ cd $ORACLE_HOME/network/log
[oracle@test log]$ cat /dev/null > listener.log

7、检查文件/etc/hosts 文件中是否含有以下内容:

[oracle@OCPCZY ~]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.59.155 OCPCZY

必须确保/etc/hosts 文件中含有127.0.0.1 这行。

8、查看系统是否缺少必要安装包,例如glibc、glibc-devel、libaio、libaio-devel

9、使用操作系统跟踪命令跟踪sqlplus 连接过程,从而观察跟踪文件

Linux 系统的跟踪命令:

strace -o /tmp/output.txt -T -tt -e trace=all sqlplus / as sysdba
strace -t -p 4545

Unix 跟踪sqlplus 进程:

truss -dfaie -o /tmp/sched_trace.out.02271 sqlplus '/as sysdba'


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论