数据库链接不上的解决思路
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的。
(部分分析参照了网上某些博主的博客,如有侵权请联系删除)