在Oracle中,造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
Tags: ORA-12547ORA-125537Oracle故障处理磁盘组
在Oracle中,造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
在执行“sqlplus / as sysdba”时可能会报“ORA-12547: TNS:lost contact”的错误,常见原因有如下几点:
1、查看操作系统内核参数是否无误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@lhrdb ~]# ulimit -a 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。
1 2 3 4 5 6 7 8 | [root@lhrdb ~]# more /etc/security/limits.conf .... oracle soft nofile 1024 oracle hard nofile 65536 oracle soft nproc 16384 oracle hard nproc 16384 oracle soft stack 10240 oracle hard stack 32768 |
2、确认$ORACLE_HOME/bin/oracle文件权限和属主是否有问题(大多数人碰到的都是这个原因)
需要注意的是,在rac环境下需要查看$ORACLE_HOME/bin/oracle和$GRID_HOME/bin/oracle两个文件。
在没有安装GI的环境下,正确权限为:
1 2 3 | [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@OCPLHR ~]$ |
在有grid用户的情况下,oracle可执行文件正确属主应该是oracle:asmadmin,并且权限必须有s才可以,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@orclalhr ~]$ which setasmgidwrap /u01/app/11.2.0/grid/bin/setasmgidwrap [root@orclalhr ~]$ setasmgidwrap -o /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle [root@orclalhr ~]$ 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@orclalhr ~]# 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@orclalhr ~]# chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle [root@orclalhr ~]# 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@orclalhr bin]# cd /u01/app/oracle/product/11.2.0/dbhome_1/bin/ [root@orclalhr bin]# which stat /usr/bin/stat [root@orclalhr 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权限。
如果权限不对,那么使用strace跟踪命令也可以看到如下信息:
1 | $strace -f -o /tmp/trace.1.log $ORACLE_HOME/bin/sqlplus / as sysdba |
在trace.1.log文件中可以看到如下的内容:
1 2 3 4 | 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) |
如果权限不对,那么可以执行以下命令进行修复:
1 2 3 | chmod 6751 $ORACLE_HOME/bin/oracle -- 或(在rac环境中需要使用如下命令对Oracle用户和grid用户下的oracle文件都进行修复) setasmgidwrap -o $ORACLE_HOME/bin/oracle |
值得注意的是,如果该文件的属组不对,那么在有磁盘组的环境中会报错“ORA-15040: diskgroup is incomplete”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | RMAN> restore standby controlfile from '/dbtemp/lhrxxtdb/standby_ivv0na1c_1_1.ctl'; Starting restore at 22-MAY-20 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=3511 device type=DISK channel ORA_DISK_1: restoring control file RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of restore command at 05/22/2020 01:39:25 ORA-19870: error while restoring backup piece /dbtemp/lhrxxtdb/standby_ivv0na1c_1_1.ctl ORA-19504: failed to create file "+DATAS1/cictrsdg/controlfile/lhrxxtdb01.ctl" ORA-17502: ksfdcre:3 Failed to create file +DATAS1/cictrsdg/controlfile/lhrxxtdb01.ctl ORA-15001: diskgroup "DATAS1" does not exist or is not mounted ORA-15040: diskgroup is incomplete ORA-15040: diskgroup is incomplete ORA-15040: diskgroup is incomplete |
有时候,也会报错“ORA-12537: TNS:connection closed”,我们修复权限问题后,建议重启一下数据库,再进行校验。
3、检查一下环境变量
1 2 3 4 | echo $ORACLE_HOME echo $ORACLE_SID echo $LD_LIBRARY_PATH -- 注意:不同的操作系统此环境变量会不同 echo $PATH |
4、检查$ORACLE_HOME/bin/oracle
和$ORACLE_HOME/rdbms/lib/config.o
的文件大小是否为0(这种情况也比较常见)
这种情况多半是安装没有成功导致的。
1 2 3 4 5 | [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@OCPLHR ~]$ 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@OCPLHR ~]$ |
如果大小为0,那么需要先备份config.o文件,然后重新编译oracle软件:
1 2 3 4 | % cd $ORACLE_HOME/rdbms/lib % mv config.o config.o.bad [oracle@OCPLHR ~]$ 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,那么可以使用如下的方法解决:
1 2 | [oracle@test ~]$ cd $ORACLE_HOME/network/log [oracle@test log]$ cat /dev/null > listener.log |
7、检查文件/etc/hosts文件中是否含有以下内容:
1 2 3 4 5 6 | [oracle@OCPLHR ~]$ 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 OCPLHR |
必须确保/etc/hosts文件中含有127.0.0.1这行。
8、查看系统是否缺少必要安装包,例如glibc、glibc-devel、libaio、libaio-devel
9、使用操作系统跟踪命令跟踪sqlplus连接过程,从而观察跟踪文件
Linux系统的跟踪命令:
1 2 | strace -o /tmp/output.txt -T -tt -e trace=all sqlplus / as sysdba strace -t -p 4545 |
Unix跟踪sqlplus进程:
1 | truss -dfaie -o /tmp/sched_trace.out.02271 sqlplus '/as sysdba' |