在某个时候 突然 接到 运维 人员反馈, 今天业务相关的数据 都堆积 很多了, 原因是文件入库失败, 后台数据库直接 报如下错
[oracle@ORACLEMAIN ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Sat Jul 23 13:27:09 2016
Copyright (c) 1982, 2009, Oracle. All rights reserved.
ERROR:
ORA-12547: TNS:lost contact
Enter user-name:
ERROR:
ORA-12547: TNS:lost contact
Enter user-name:
ERROR:
ORA-12547: TNS:lost contact
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
原因分析, 后台本地登录数据库 居然要 TNS ?
1/ 产看数据后台进程,发现正常
[oracle@ORACLEMAIN ~]$ ps -ef | grep ora_
oracle 824 1 0 13:29 ? 00:00:00 ora_w000_ora11g
oracle 849 769 0 13:37 pts/1 00:00:00 grep ora_
oracle 3468 1 0 11:33 ? 00:00:00 ora_pmon_ora11g
oracle 3470 1 0 11:33 ? 00:00:02 ora_vktm_ora11g
oracle 3474 1 0 11:33 ? 00:00:00 ora_gen0_ora11g
oracle 3476 1 0 11:33 ? 00:00:00 ora_diag_ora11g
oracle 3478 1 0 11:33 ? 00:00:00 ora_dbrm_ora11g
oracle 3480 1 0 11:33 ? 00:00:00 ora_psp0_ora11g
oracle 3482 1 0 11:33 ? 00:00:01 ora_dia0_ora11g
oracle 3484 1 0 11:33 ? 00:00:02 ora_mman_ora11g
oracle 3486 1 0 11:33 ? 00:00:00 ora_dbw0_ora11g
oracle 3488 1 0 11:33 ? 00:00:00 ora_lgwr_ora11g
oracle 3490 1 0 11:33 ? 00:00:03 ora_ckpt_ora11g
oracle 3492 1 0 11:33 ? 00:00:00 ora_smon_ora11g
oracle 3494 1 0 11:33 ? 00:00:00 ora_reco_ora11g
oracle 3496 1 0 11:33 ? 00:00:01 ora_mmon_ora11g
oracle 3498 1 0 11:33 ? 00:00:01 ora_mmnl_ora11g
oracle 3500 1 0 11:33 ? 00:00:00 ora_d000_ora11g
oracle 3502 1 0 11:33 ? 00:00:00 ora_s000_ora11g
oracle 3542 1 0 11:33 ? 00:00:00 ora_qmnc_ora11g
oracle 3570 1 0 11:34 ? 00:00:00 ora_q000_ora11g
oracle 3572 1 0 11:34 ? 00:00:00 ora_q001_ora11g
oracle 3582 1 0 11:38 ? 00:00:00 ora_smco_ora11g
2 产看数据的 警告文件
<pre name="code" class="html">[oracle@ORACLEMAIN trace]$ grep "ORA-" alert_ora11g.log
[oracle@ORACLEMAIN trace]$
警告文件 没有报 任何错误, 说明数据 运行还是很正常的,
查了 官方资料, 有下面几点 方法
1. 检查 $ORACLE_HOME/bin/oracle 文件的 权限是否 为 6751
[oracle@ORACLEMAIN bin]$ ls -l $ORACLE_HOME/bin/oracle
-rwsr-s--x 1 oracle oinstall 210824714 Dec 14 2014 /opt/app/oracle/product/11.2.0/db_1/bin/oracle
[oracle@ORACLEMAIN bin]$
如果不为 上面结果 那么就需要 把权限 改回来
chmod 6751 oracle
ORACLE_BASE,
ORACLE_HOME,
LD_LIBRARY_PATH,
PATH
[oracle@ORACLEMAIN bin]$ env | grep ORA
HOSTNAME=ORACLEMAIN
ORACLE_SID=ora11g
ORACLE_BASE=/opt/app/oracle
ORACLE_HOME=/opt/app/oracle/product/11.2.0/db_1
[oracle@ORACLEMAIN bin]$
如果没有上述变量,请添加上
环境变量配置是正确的, 应为生产库已经使用了好几年了,所以这个出问题 的可能性应该不大
3 . 检查操作 系统内核参数
根据 oracle 官方文档的 检查
orcle 官方 文档 要求配置如下
shmmni 4096 /proc/sys/kernel/shmmni
file-max 6815744 /proc/sys/fs/file-max
ip_local_port_range Minimum: 9000
Maximum: 65500
/proc/sys/net/ipv4/ip_local_port_range
rmem_default 262144 /proc/sys/net/core/rmem_default
rmem_max 4194304 /proc/sys/net/core/rmem_max
wmem_default 262144 /proc/sys/net/core/wmem_default
wmem_max 1048576 /proc/sys/net/core/wmem_max
aio-max-nr 1048576
Note: This value limits concurrent outstanding requests and should be set to avoid I/O subsystem failures.
/proc/sys/fs/aio-max-nr
</pre>我根据 上述检查后 系统配置 都达到 要求<p></p><p></p><p>然后我们再来看 软/硬 限 参数配置</p><p>官方最低要求是</p><p></p><pre name="code" class="html">Resource Shell Limit Resource Soft Limit Hard Limit
Open file descriptors nofile at least 1024 at least 65536
Number of processes available nproc at least 2047 at least 16384
to a single user
Size of the stack segment stack at least 10240 KB at least 10240 KB, and at most 32768 KB
of the process
通过下面的命令检查 我系统参数的配置
[oracle@ORACLEMAIN ~]$ ulimit -Hn
65536
[oracle@ORACLEMAIN ~]$ ulimit -Sn
1024
[oracle@ORACLEMAIN ~]$ ulimit -Hu
16384
[oracle@ORACLEMAIN ~]$ ulimit -Su
16384
[oracle@ORACLEMAIN ~]$ ulimit -Hs
<span style="color:#ff0000;">1024</span>
[oracle@ORACLEMAIN ~]$ ulimit -Ss
<span style="color:#ff0000;">1024</span>
[oracle@ORACLEMAIN ~]$
问题已经 找到 stack oracle 的最低要求是 10240 而我的是 1024
[root@ORACLEMAIN ~]# tail -l /etc/security/limits.conf
#@student - maxlogins 4
# End of file
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft noproc 2047
oracle hard noproc 16384
<span style="color:#ff0000;">oracle soft stack 10240
oracle hard stack 10240</span>
[root@ORACLEMAIN ~]#
切换 到 oracle 用户 检查参数
<pre name="code" class="html">[root@ORACLEMAIN ~]# su - oracle
[oracle@ORACLEMAIN ~]$ ulimit -s
1024
[oracle@ORACLEMAIN ~]$
发现参数 并没有变,, 这种情况是不应该的, 当修改完后 就应该立马生效的, 所以想到的是 立马重启服务器, 但是 改服务器上 有很多业务, 所以 重启 那是不可能的事情了,所以怀疑是设置 全局变量
检查 /etc/profile 发现这个文件的最后 ulimit -s 1024 靠!!!!, 谁在环境变量做了配置, 害的我花了 将近三个小时
把这一行 去掉 , 再切换 到 oracle用户 产看参数 正常 登录数据库也正常
[root@ORACLEMAIN ~]# su - oracle
[oracle@ORACLEMAIN ~]$ ulimit -s
10240
[oracle@ORACLEMAIN ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Sat Jul 23 15:01:01 2016
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL>
问题解决, 如果 你到这里 , unlimt -s 值还是没有变的话, 建议 在 /etc/profile 的最后 加上 ulimit -s 10240
如果 上述 三个步骤 还没有 解决你的 问题 那么请用 步骤4
4 . relink all (在oracle 用户下 使用这个命令)