数据库链接不上的解决思路

数据库链接不上的解决思路
1、服务器使用用户登录排查用户的账号密码、权限等问题
2、查看是否网络问题,查看tns name,service name
3、df -h 查看空间是否满了
4、asm空间是否满了
5、查看sqlnet.ora日志
6、Java连接Oracle的配置文件    排查连接参数
7、ojdbc驱动jar包检查与替换    排查驱动jar包问题和协议不匹配的问题

具体例子:

ORA-01034:ORACLE not available
ORA-27102:out of memory
Linux-x86_64 Error:12:Cannot allocate memory


ORA-28040: No matching authentication protocol
Linux-x86_64 Error:12:XXXXXX


当涉及Linux-x86_64 Error,很大可能是关于Linux系统的配置文件的问题
Linux下有个内核参数overcommit_memory,是内存分配策略,程序在启动的时候会先去申请内存,尽管不一定都会用的到那么多。

overcommit_memory此参数决定是否接受超大内存请求的条件。这个参数有三个可能的值:

0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。
遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。
1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
2 — 内存拒绝等于或者大于总可用 swap 大小以及overcommit_ratio指定的物理RAM比例的内存请求。
如果您希望减小内存过度使用的风险,这个设置就是最好的。

#CommitLimit 表示系统可申请的总内存
#Committed_AS为当前已经申请的内存


CommitLimit=75743028 KB和Committed_AS=74870856 KB两个值很接近,且overcommit_memory=2。
而我们那么多的内存为什么申请不到呢?答案就是被别的程序申请占用了,尽管这些内存没有实际用到,却也无法再让另外的程序进行申请。如果申请时发现无法申请到足够的内存就会报此错误。

我们顺便再理解下什么是Overcommit和OOM:

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。
这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,
不是内核线程),以便释放内存。当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),
该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,
而且oom_score_adj可以被设置(-1000最低,1000最高)。


解决方法
很简单,将vm.overcommit_memory设为1即可。

有三种方式修改内核参数,但要有root权限:

编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
sysctl vm.overcommit_memory=1
echo 1 > /proc/sys/vm/overcommit_memory,然后sysctl –p永久生效


--------------------------
Oracle 12C下查询此报错
oralce:/oracle/db/app/12.1.0/db/network/admin> oerr ora 28040
 28040, 0000, "No matching authentication protocol"
 // *Cause:  There was no acceptable authentication protocol for
 //          either client or server.
 // *Action: The administrator should set the values of the
 //          SQLNET.ALLOWED_LOGON_VERSION_SERVER and
 //          SQLNET.ALLOWED_LOGON_VERSION_CLIENT parameters, on both the
 //          client and on the server, to values that match the minimum
 //          version software supported in the system.
 //          This error is also raised when the client is authenticating to
 //          a user account which was created without a verifier suitable for
 //          the client software version. In this situation, that account's
 //          password must be reset, in order for the required verifier to
 //          be generated and allow authentication to proceed successfully.

Oracle 11g下查询报错
oracle@oralce:/oracle/app/oracle/product/11.2.0/db/network/admin$ oerr ora 28040
 28040, 0000, "No matching authentication protocol"
 // *Cause:  No acceptible authentication protocol for both client and server
 // *Action: Administrator should set SQLNET_ALLOWED_LOGON_VERSION parameter
 //          on both client and servers to values that matches the minimum
 //          version supported in the system.


在11G中的参数是SQLNET_ALLOWED_LOGON_VERSION;
而在12C中的参数是SQLNET.ALLOWED_LOGON_VERSION_SERVER和SQLNET.ALLOWED_LOGON_VERSION_CLIENT

解决方式:

11g下:

 vi sqlnet.ora
 SQLNET.ALLOWED_LOGON_VERSION=8
 

12c下:
 vi sqlnet.ora
 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

然后重启监听
lsnrctl reload

如果是RAC,那么就需要在2个节点都设置sqlnet.ora文件。

根本原因:
1、Oracle的 ojdbc 6竟然还有不同的版本,而且支持的协议还不一样!

oracle官网上看到ojdbc6只有一个jar包,不分版本!这个ojdbc6-11.1.0.7.0.jar可以支持Oracle 11g,但是支持不了Oracle 12C,从文件大小也可以看出,ojdbc6-11.1.0.7.0.jar应该是老版本,根据版本向下兼容的原则,ojdbc6应该是兼容ojdbc6-11.1.0.7.0.jar的。

(部分分析参照了网上某些博主的博客,如有侵权请联系删除)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值