数据库实例HANG住了,具体是什么原因

数据库实例HANG住了,具体是什么原因,第1张

可以看一下系统中是否有多个pmon进程,如果有几个pmon进程,就说明有几个实例。命令如下: ps -ef|grep ora_pmon 解释:pmon进程,进程监视器(Process Monitor)oracle中用于恢复失败的数据库用户的强制性进程,它先获取失败用户的标识,释放该用户占有的所有数据库资源。一般一个oracle实例只能有一个pmon进程,可能通过查看pmon进程的多少来判断有几个实例。

某天晚上,数据库 hang 住,现象是:

无奈之下通过强制 kill 掉进程,重启数据库恢复。

这里暂且不说 hang 住的原因,仅分析数据库 hang 住,但是 MHA 未触发切换。

先说下结论,MHA 默认使用长连接对数据库做 ping 健康 检测(执行 select 1 as Value ),4次无法连接 MySQL 则触发切换。 前面数据库 hang 住只是新的连接无法建立,但是老连接却没有影响,且 MHA 的 健康 检测语句很简单,只在 server 层进行了检测,不涉及到 InnoDB 层,所以 MHA 认为 MySQL 是 健康 的,并没有作出任何决策。

MHA 从 0.53 版本开始支持 ping_type 参数设置如何检查 master 的可用性。支持3个 value :

通过将 ping_type 修改设置为 connect ,MHA 每次进程状态检测,需要新建连接,新链接无法成功建立,就触发了切换。

三种检测机制代码:

MHA 配置文件

模拟服务器CPU满负载,数据库无法建立新连接 编写一个简单的c程序,如下:

编译:

执行:

另外再跑两个 mysqlslap 压测程序:

有兴趣的同学可自行测试一下

调用链路:

MHA 监控进程启动后,会持续监控主节点的状态,主要的 健康 检测函数是 wait_until_unreachable()。

在这个函数中会有一个死循环,持续地进行 健康 检测

1.首先,测试连接,连接正确返回0,否则返回1。

2.测试连接成功后,则进行 健康 状态检测(前面说的3种方式);如果连续4次连接失败,则在第4次的时候会使用第二脚本进行检测(如果定义了的话),如果检测通过,则认为 master 挂掉

关键函数 wait_until_unreachable()代码:

HANG 百度翻译叫做悬挂,DBA行话叫做 “卡” 数据库卡住了!

那么HANG MANAGER 就是卡住的管理工具!

卡住了有以下两种情况

一 死锁(cycle)。对于这种hang, 除非循环被打破,问题会永远存在。

二 某个堵塞者(blocker) 进程在持有了某些资源后堵住了其他进程。当然,根据堵塞的情况,我们可以把blocker分为直接堵塞进程(immediate blocker)和根堵塞进程(root blocker)。而root blocker 在通常情况下会处于两种状态。

2.1 根堵塞进程处于空闲状态,对于这种情况,终止这个进程能够解决问题。

2.2 根堵塞进程正在等待某些和数据库无关的资源(例如:等待I/O),对于这种情况,终止这个进程也许能解决问题。但是,从数据库的角度来讲,这已经超出了数据库的范畴。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9994712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存