数据库连接异常问题排查

琉璃11个月前技术文章211

问题描述

客户反馈应用端连接数据库异常,报错截图如下:“已超过了锁请求超时时段”。

image.png

问题排查

1、测试端口联通性

从应用侧服务器上分别测试数据库服务端口联通性,检测服务正常监听

image.png


image.png

2、数据库服务器重启

同客户沟通优先恢复业务,反馈先对数据库服务器重启  image.png

重启后连接数据库仍然异常

3、查询活跃/阻塞会话

根据报错提示查询活跃及阻塞会话,看下是否有事物没有提交。查询无阻塞会话

查询活跃会话:

SELECT s.name, DES.program_name, r.session_id, r.status, qt.text, qt.dbid
 , qt.objectid, r.cpu_time, r.total_elapsed_time, r.reads, r.writes
 , r.logical_reads, r.scheduler_id
FROM sys.dm_exec_requests r
 CROSS APPLY sys.dm_exec_sql_text(sql_handle) qt
 JOIN master.dbo.sysdatabases s ON r.database_id = s.dbid
 JOIN sys.dm_exec_sessions DES ON r.session_id = DES.session_id
ORDER BY r.scheduler_id, r.status, r.session_id;


查询阻塞会话,用activity monitor,查看会话信息,是否有未提交事务

SELECT
 Blocking.session_id as BlockingSessionId, 
 Sess.login_name AS BlockingUser, 
 BlockingSQL.text AS BlockingSQL,
 Waits.wait_type WhyBlocked,
 Waits.wait_duration_ms,
 Blocked.session_id AS BlockedSessionId,
 USER_NAME(Blocked.user_id) AS BlockedUser,
 BlockedSQL.text AS BlockedSQL,
 DB_NAME(Blocked.database_id) AS DatabaseName
FROM sys.dm_exec_connections AS Blocking 
 INNER JOIN sys.dm_exec_requests AS Blocked ON Blocking.session_id = Blocked.blocking_session_id
 INNER JOIN sys.dm_os_waiting_tasks AS Waits ON Blocked.session_id = Waits.session_id
 RIGHT OUTER JOIN sys.dm_exec_sessions Sess ON Blocking.session_id = sess.session_id
 CROSS APPLY sys.dm_exec_sql_text(Blocking.most_recent_sql_handle) AS BlockingSQL
 CROSS APPLY sys.dm_exec_sql_text(Blocked.sql_handle) AS BlockedSQL
ORDER BY BlockingSessionId, BlockedSessionId

查看没有活跃会话(由于已经重启了数据库服务器,建议在重启数据库服务器前执行SQL查询)

4、核实云安全中心告警

云安全中心在2023-02-21 20:18时刻服务器 Prod-Samsonite-Baison-APP01-Linux( 192.168.40.103) 的可疑蠕虫脚本行为告警,创建隐藏目录。该行为已被云安全中心拦截成功。执行命令 mkdir /tmp/.baisonagent ,同业务方核实是否是正常业务操作。登录到服务器上,检查目录没有创建成功

image.png

image.png

5、查看系统日志

在 Linux 系统中,日志文件记录了系统中包括内核、服务和其它应用程序等在内的运行信息。 查询/var/log/messages日志信息,日志文件大小为0

journalctl -xe -l 查询到有实时日志输出

journalctl -xe -l

查看应用服务器版本为 CentOS 7.9

在 CentOS 7中,日志是使用rsyslogd守护进程进行管理的,该进程是之前版本的系统中syslogd的升级版,对原有的日志系统进行了功能的扩展,提供了诸如过滤器,日志加密保护,各种配置选项,输入输出模块,支持通过 TCP 或者 UDP 协议进行传输等。

rsyslog的配置文件为 /etc/rsyslog.conf , 日志文件都位于 /var/log/ 目录中, 系统默认有设置对messages日志做切割。

登录到 192.168.40.103  服务器上 查看 /etc/rsyslog.conf 文件内容 ,对比同系统的另外一台服务器中 /etc/rsyslog.conf内容 ,对比发现没有输出messages日志的上注释掉了参数

$ModLoad imjournal 、$IMJournalStateFile imjournal.state

备注说明:

$ModLoad imjournal   # imjournal为模块名,支持对系统日志的访问。

$IMJournalStateFile imjournal.state  #将日志存储在文件中

image.png

将相关参数注释取消后重启服务日志正常记录,messages系统日志没有打印是因为修改了 /etc/rsyslog.conf 部分参数

image.png

image.png

systemctl restart rsyslog.service

image.png

日志内容实时输出


image.png




查看192.168.40.104 服务器上/etc/rsyslog.conf 文件修改时间为 2022-10-13 15:15

image.png

查看192.168.40.105服务器上/etc/rsyslog.conf 文件修改时间为 2022-10-13 13:54

image.png

核实三台服务器均有操作注释参数 $ModLoad imjournal 、$IMJournalStateFile imjournal.state

6、查看堡垒机历史执行记录

查询  /etc/rsyslog.conf  修改当天(2022-10-13)的审计会话信息, 在三台服务器上有执行安装k8s_install.sh脚本操作

image.png


image.png

总结建议

1、复现数据库死锁问题时,先不执行重启服务器操作,登录数据库查询活跃/阻塞会话,查看是否存在阻塞

2、应用程序侧输出打印日志信息,协助问题定位

3、开启messages日志记录,并且做好超过文件大小定期自动清理,k8s组件日志调整级别,输出重要日志,避免日志量过大导致磁盘可用空间不足

4、问题复现时候配合抓包分析

参考文章: https://cloud.tencent.com/developer/article/1498726?from=15425&areaSource=102001.2&traceId=uuskDOX-Gw0dwf89zFTIg

https://cloud.tencent.com/developer/article/1498726?from=15425&areaSource=102001.2&traceId=vOoxRkw9cM19l9fXDI8zA


相关文章

Hbase压缩算法

HBase包含两类压缩机制:DataBlockEncode前缀压缩和文件级别的压缩Compress。对于DataBlockEncode前缀压缩,提供了三种算法:PREFIX\DIFF\FAST_DIF...

Kafka监控

1.监控健康状态为了了解 Kafka 的运作状态和性能状况需要对 Kafka 进行监控和诊断,通过Kafka提供的监控工具和插件可以诊断出 Kafka 的异常、错误、瓶颈和故障等问题并及时采取对应的措...

副本集的管理(二)

五、用户管理MongoDB默认是不开启用户认证模式的,但是为了数据库的安全和管理,我们需要开启用户认证。数据库用户角色:read、readWrite; 数据库管理角色:dbAdmin、dbOwner...

Ambari开启kerberos+安全方案

Ambari开启kerberos+安全方案

安装Kerberosserver节点安装kerberos相关软件yum install -y krb5-server krb5-workstation krb5-libsclient节点安装yum i...

MongoDB的In-Memory存储引擎

   在企业版 3.2.6版本开始,MongoDB开始有In-Memory存储引擎,除了一些元数据和诊断数据外,In-Memory存储引擎不会存储任何数据到磁盘,包括配置数据、索引、用户凭证等。   ...

Helm 控制函数

Helm 控制结构(在模板语言中称为 "actions")提供给你和模板作者控制模板迭代流的能力。 Helm 的模板语言提供了以下控制结构:if/else,用来创建条件语句with,用来指定范围ran...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。