当前位置: 首页 > news >正文

MYSQL-9.问题排查

问题排查的思路与方向

问题排查思路

  1. 分析问题根据理论知识+经验分析问题,判断问题可能出现的位置或可能引起问题的原因,将目标缩小到一定范围;
  2. 排查问题:基于上一步的结果,从引发问题的“可疑性”角度出发,从高到低依次进行排查,进一步排除一些选项,将目标范围进一步缩小;
  3. 定位问题通过相关的监控数据的辅助,以更“细粒度”的手段,将引发问题的原因定位到精准位置;
  4. 解决问题:判断到问题出现的具体位置以及引发的原因后,采取相关措施对问题加以解决;
  5. 尝试最优解(非必须):将原有的问题解决后,在能力范围内,且环境允许的情况下,应该适当考虑问题的最优解(可以从性能、拓展性、并发等角度出发);

问题排查方向

应用程序本身导致的问题

  1. 程序内部频繁触发GC,造成系统出现长时间停顿,导致客户端堆积大量请求。
  2. JVM参数配置不合理,导致线上运行失控,如堆内存、各内存区域太小等。
  3. Java程序代码存在缺陷,导致线上运行出现Bug,如死锁/内存泄漏、溢出等。
  4. 程序内部资源使用不合理,导致出现问题,如线程/DB连接/网络连接/堆外内存等。

上下游内部系统导致的问题

  1. 上游服务出现并发情况,导致当前程序请求量急剧增加,从而引发问题拖垮系统。
  2. 下游服务出现问题,导致当前程序堆积大量请求拖垮系统,如Redis宕机/DB阻塞等。

程序所部署的机器本身导致的问题

  1. 服务器机房网络出现问题,导致网络出现阻塞、当前程序假死等故障。
  2. 服务器中因其他程序原因、硬件问题、环境因素(如断电)等原因导致系统不可用。
  3. 服务器因遭到入侵导致Java程序受到影响,如木马病毒/矿机、劫持脚本等。

第三方的RPC远程调用导致的问题

  1. 作为被调用者提供给第三方调用,第三方流量突增,导致当前程序负载过重出现问题。
  2. 作为调用者调用第三方,但因第三方出现问题,引发雪崩问题而造成当前程序崩溃。

数据库问题可能发生方面

SQL执行报错

业务代码bug,编写的SQL语句报错;

  1. 一般会抛出异常信息如Error updating database. Cause: java.sql.SQLException: Field 'category_name' doesn't have a default value可根据异常信息百度解决;

慢SQL

偶发的SQL执行缓慢的情况;

  1. 慢查询日志:

    1. 查看慢查询日志:show variables like 'slow_query_log_file';

      在这里插入图片描述

      • 行慢查询SQL的用户:root,登录IP为:localhost[127.0.0.1]。
      • 慢查询执行的具体耗时为:0.014960s,锁等待时间为0s。
      • 本次SQL执行后的结果集为4行数据,累计扫描6行数据。
      • 本次慢查询发生在db_zhuzi这个库中,发生时间为1667466932(2022-11-03 17:15:32)。
      • 最后一行为具体的慢查询SQL语句。
    2. 排查SQL执行缓慢的原因

      1. 根据慢查询日志中的信息,得到具体慢SQL信息,并根据Look_time耗时判断是不是由于并发事物导致的长时间阻塞,如果不是则使用explain执行分析工具,判断索引情况;
      2. 如果在慢查询日志中,存在大量由于并发事物导致的慢查询,则可以通过查看Mysql的锁状态来判断当前Mysql节点的承载并发压力是否过高;

机器故障

部署MySQL的及其故障,如磁盘、内存、CPU100%MySQL自身故障等;

客户端连接异常

  1. 数据库的连接数超出了最大连接数,此时再出现新连接时会出现异常;
    1. 解决办法:排查数据库和客户端连接池的配置是否合理,适当调整参数;
  2. 客户端数据库连接池与Mysql版本不匹配,或超时时间过小,可能导致连接中断;
    1. 解决办法:排查数据库和客户端连接池的配置是否合理,适当调整参数;
  3. Mysql、JAVA程序所部署的机器不在同一网段,导致两者之间可能存在网络通信故障;
    1. 排查方向如下:
      • 检测防火墙与安全组的端口是否开放,或与外网机器是否做了端口映射。
      • 检查部署MySQL的服务器白名单,以及登录的用户IP限制,可能是IP不在白名单范围内。
      • 如果整个系统各节点部署的网段不同,检查各网段之间交换机的连接超时时间是多少。
      • 检查不同网段之间的网络带宽大小,以及具体的带宽使用情况,有时因带宽占满也会出现问题。
      • 如果用了MyCat、MySQL-Proxy这类代理中间件,记得检查中间件的白名单、超时时间配置。
  4. 机器资源不足,如CPU、硬盘占用过高,导致MySQL没有资源分配给新连接;
    1. 在一切正常的情况下,有时候出现连接不上MySQL的情况时,可以去查看部署Mysql服务的机器的硬件使用情况,若出现异常则说明是机器问题;

死锁频发

MySQL会默认开启死锁检测算法,当运行期间出现死锁问题时,会主动介入并解除死锁,具体可参考Mysql锁机制中的死锁介绍,但其指标不治本,死锁现象是由于业务代码不合理造成的,极大可能反复出现;

  1. 定位死锁问题:可通过SHOW ENGINE INNODB STATUS\G;查看InnoDB的运行状态日志,其中包含InnoDB运行期间所有的状态日志,其中死锁日志在LATEST DETECTED DEADLOCK这块区域;

    在这里插入图片描述

    1. 信息中包含了死锁发生的时间
    2. *** (n) TRANSACTION产生死锁的事物和具体sql
    3. *** (2) WAITING FOR THIS LOCK TO BE GRANTED: 指明了发生死锁冲突的地点位于order库中order_salesorder表的uk_tenant_store_order索引上,第二个事务正在等待获取插入意向锁,但是由于第一个事务持有了表级的共享锁,并且也在等待获取插入意向锁;
    4. *** WE ROLL BACK TRANSACTION (2)解决方案是回滚了第二个事物;

CPU100%

  1. 排查思路:

    1. 找到CPU过高的服务器;
    2. 定位具体进程,top
    3. 定位进程中的具体线程,top -Hp [PID]
    4. 找到线程正在执行的代码逻辑;
    5. 从代码层面着手优化;
  2. 具体步骤

    1. 通过top命令查看占用CPU最高的进程(这里假设mysql占用率最高):

      top - 16:02:11 up 623 days, 23:46,  1 user,  load average: 0.24, 0.22, 0.19
      Tasks: 139 total,   1 running, 138 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  1.5 us,  0.1 sy,  0.0 ni, 98.2 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
      MiB Mem :  15469.9 total,    152.1 free,   6837.6 used,   8480.2 buff/cache
      MiB Swap:      0.0 total,      0.0 free,      0.0 used.   8314.0 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                              
      3093986 admin     20   0 6576080   1.4g  18008 S   5.3   9.6   2:50.12 java                                                                 
      3057999 admin     20   0 6335928   1.2g  16864 S   0.7   8.1   4:42.53 java                                                                 13699 root      20   0 1722052 283200   5076 S   0.3   1.8   3126:16 /usr/local/clou                                                      106781 admin     20   0 5079784   1.0g   2612 S   0.3   6.9   3184:01 java                                                                 765635 mysql     20   0 2653408   1.4g  10140 S   0.3   9.0  54062:02 mysqld                                                               
      2836690 admin     20   0  273680   9612   2008 S   0.3   0.1 356:23.41 redis-server                                                         
      3054745 admin     20   0 4696200 815644  16600 S   0.3   5.1   3:24.90 java                                                                 
      3499020 root      10 -10   89768  13020   9316 S   0.3   0.1  66:17.11 AliYunDun                                                            
      3499031 root      10 -10  133384  24060  12164 S   0.3   0.2 126:29.57 AliYunDunMonito                                                      1 root      20   0  111468   6140   3204 S   0.0   0.0   8:14.12 systemd                                                              2 root      20   0       0      0      0 S   0.0   0.0   0:13.04 kthreadd                                                             3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp                                                               4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp                                                           
    2. 之后可以通过top -Hp [PID]命令查询进程中CPU占用率最高的线程;

      top - 16:09:44 up 623 days, 23:54,  2 users,  load average: 0.00, 0.05, 0.11
      Threads:  53 total,   0 running,  53 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  5.1 us,  0.3 sy,  0.0 ni, 94.2 id,  0.0 wa,  0.3 hi,  0.1 si,  0.0 st
      MiB Mem :  15469.9 total,    179.2 free,   6847.7 used,   8443.0 buff/cache
      MiB Swap:      0.0 total,      0.0 free,      0.0 used.   8303.9 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                              
      3096811 mysql     20   0 2653408   1.4g  10140 S   0.7   9.0   0:00.02 mysqld                                                               765637 mysql     20   0 2653408   1.4g  10140 S   0.3   9.0   2:54.55 mysqld                                                               
      3087933 mysql     20   0 2653408   1.4g  10140 S   0.3   9.0   0:01.49 mysqld                                                               
      3096213 mysql     20   0 2653408   1.4g  10140 S   0.3   9.0   0:00.03 mysqld                                                               765635 mysql     20   0 2653408   1.4g  10140 S   0.0   9.0   0:04.38 mysqld                                                               765636 mysql     20   0 2653408   1.4g  10140 S   0.0   9.0   0:00.00 mysqld                                                               765638 mysql     20   0 2653408   1.4g  10140 S   0.0   9.0   3:08.71 mysqld    
      
    3. 查看OS线程ID与MySQL线程ID关系(MySQL5.7及以上),通过查询performance_schema库中的threadsSELECT * FROM threads where THREAD_OS_ID = 3096811;

      在这里插入图片描述

      1. THREAD_ID:Mysql内部线程Id
      2. PROCESSLIST_USER:数据库连接的客户端用户
      3. PROCESSLIST_HOST:数据库连接的客户端地址
      4. PROCESSLIST_DB:访问的库
      5. PROCESSLIST_INFO:当前线程正在执行的sql
      6. THREAD_OS_ID:操作系统的线程ID
    4. 得到当前线程正在执行的sql,则可以从代码层面着手优化;

磁盘100%

  1. 可能导致磁盘IO占用过高的原因
    1. 突然大批量变更库中数据,需要执行大量写入操作,如主从数据同步时就会出现这个问题。
    2. MySQL处理的整体并发过高,磁盘I/O频率跟不上,比如是机械硬盘材质,读写速率过慢。
    3. 内存中的BufferPool缓冲池过小,大量读写操作需要落入磁盘处理,导致磁盘利用率过高。
    4. 频繁创建和销毁临时表,导致内存无法存储临时表数据,因而转到磁盘存储,导致磁盘飙升。
    5. 执行某些SQL时从磁盘加载海量数据,如超2张表的联查,并每张表数据较大,最终导致IO打满。
    6. 日志刷盘频率过高,其实这条是i、ii的附带情况,毕竟日志的刷盘频率,跟整体并发直接挂钩。
  2. 解决办法:
    1. **提升硬件,**若磁盘不是固态硬盘的可将磁盘升级成固态硬盘;
    2. 引入中间件,如引入Redis减小读压力,引入MQ进行流量削峰;
    3. 调大BufferPool缓冲池大小
    4. SQl语句上优化,撰写SQL语句时尽量减少多张大表联查,不要频繁的使用和销毁临时表;

Performance_Schema库监控全局资源

  1. MySQL5.6引入,主要记录:数据库整体的监控信息,比如事务监控信息、最近执行的SQL信息、最近连接的客户端信息、数据库各空间的使用信息等,基于这个库可以在线上构建出一个完善的MySQL监控系统:
    1. Statements/execution stages:MySQL统计的一些消耗资源较高的SQL语句。
    2. Table and Index I/O:MySQL统计的那些表和索引会导致I/O负载过高。
    3. Table Locks:MySQL统计的表中数据的锁资源竞争信息。
    4. Users/Hosts/Accounts:消耗资源最多的客户端、IP机器、用户。
    5. Network I/O:MySQL统计的一些网络相关的资源情况。

相关文章:

MYSQL-9.问题排查

问题排查的思路与方向 问题排查思路 分析问题:根据理论知识经验分析问题,判断问题可能出现的位置或可能引起问题的原因,将目标缩小到一定范围;排查问题:基于上一步的结果,从引发问题的“可疑性”角度出发…...

制造企业数据管理:从数据到价值的转化

在数字化浪潮席卷全球的今天,制造企业面临着前所未有的机遇与挑战。如何从海量的数据中提取有价值的信息,将其转化为企业的核心竞争力,成为了每一个制造企业必须面对的问题。而数据管理,正是实现这一转化的关键所在。制造企业数据…...

单例模式介绍

【一】为什么要单例模式 单例设计模式: 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 当一个类的功能比较单一,只需要一个实例…...

Facebook企业户/在Facebook上做推广有什么好处?

想到出海,必会想到Facebook作为世界上最大的社交网络,Facebook拥有难以想象的用户数量,流量大到没朋友。近年来也是独立站卖家获取流量的有力工具之一。独立站卖家在Facebook上做广告的好处? Facebook,Google 开企业广…...

Go GORM实战(二) | 数据库连接的N种方式

连接数据库 使用GORM连接数据库还是比较简单的,概括起来就是以下三个步骤: 引入gorm.io/gorm和对应数据库的驱动库,如gorm.io/driver/sqlite。 调用对应驱动库的Open()或New()函数返回一个实现了gorm.Dialector接口的实例。 调用gorm.Open…...

Cocos Creator 2D Mask与Layout 使用详解

Cocos Creator是一款强大的2D游戏开发引擎,提供了丰富的功能和工具,使开发者可以轻松创建出高质量的游戏。其中,2D Mask和Layout是Cocos Creator中常用的两个组件,它们可以帮助开发者实现更加复杂和精美的游戏界面设计。本文将详细…...

项目-坦克大战

增加功能 我方坦克在发射的子弹消亡后,才能发射新的子弹。同时实现发多颗子弹 1,在按下J键,我们判断当前hero对象的子弹,是否已经销毁2,如果没有销毁,就不去触发shotEnemyTank3,如果已经销毁&…...

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II

#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 首先,本题不能考虑首先对数组排序,排序会导致数组直接变为一个…...

基于SpringBoot设计模式之开端

文章目录 前言引言开始 前言 为了更好的在项目中,能更加优雅的使用设计模式,比较针对性的解决我们的问题。我将在这个专栏详细的描述23种设计模式,为了与时俱进,我打算通过springboot的形式将23种设计模式全部撸完! 引…...

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …...

简化路径[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个字符串path,表示指向某一文件或目录的Unix风格 绝对路径 (以/开头),请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中,一个点.表示当前目录本身&#x…...

记一次若依项目组装树型结构数据的效率优化

背景 最近公司的项目使用了若依框架做开发,发现部门管理功能的部门如果有3万笔记录时,查询部门信息并组装为父子结构时运行特别缓慢,本地运行需要3分钟才能加载出来,因此接到优化的工作。 代码展示 首先看看表结构是这么定义的…...

秒杀系统之系统优化

3 系统优化 对于一个软件系统,提高性能可以有很多种手段,如提升硬件水平、调优JVM 性能,这里主要关注代码层面的性能优化—— 减少序列化:减少 Java 中的序列化操作可以很好的提升系统性能。序列化大部分是在 RPC 阶段发生&#x…...

【介绍下Python多线程,什么是Python多线程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译:在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…...

瑞芯微RK3588驱动设计之DVP并口摄像头2

dts配置看瑞芯微RK3588驱动配置之DVP并口摄像头1_rockchip 调试dvp设备 直接显示摄像头数据-CSDN博客 这里看看驱动的具体实现,以gc2145为例。 gc2145的驱动源码如下: // SPDX-License-Identifier: GPL-2.0 /** GC2145 CMOS Image Sensor driver*** C…...

安卓手机APP开发__支持64位的架构

安卓手机APP开发__支持64位的架构 目录 概述 读取你的APP 快速的状态检查 你的APP使用了原生的代码吗? 你的APP包含了64位的代码库吗? 确保在这些目录中有原生的代码库. 使用APK分析器查看原生的代码库 通过解压缩APK查看原生的代码库 用安卓工…...

Foxmail使用经验总结

目录 1.概述 2.版本历史 3.使用方法 3.1.安装和设置账户 3.2.收取和阅读邮件 ​​​​​​​3.3.发送邮件 ​​​​​​​3.4.管理联系人 ​​​​​​​3.5.日程安排和任务管理 ​​​​​​​3.6.定制设置和插件 ​​​​​​​3.7.跨平台同步 4.小结 1.概述 Fox…...

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…...

实验三:机器学习1.0

要求: 针对实验1和实验2构建的数据集信息分析 设计实现通过数据简介进行大类分类的程序 代码实现: 训练集数据获取: read_data.py import json import pickledef read_intro():data []trypathr"E:\Procedure\Python\Experiment\f…...

Vue 3 + Vite项目实战:常见问题与解决方案全解析

文章目录 一、项目使用本地图片打包后不显示1、在html中时候,本地运行和打包后线上运行都ok。2、用动态数据,本地运行ok,打包后线上运行不显示3、适用于处理单个链接的资源文件4、用动态数据且本地和线上访问都可显示 二、使用插件vite-plugi…...

飞天使-k8s知识点31-rancher的正确打开方式

文章目录 安装之前优化一下内核参数以及系统内核版本 rancher安装主要是使用以下命令nginx的配置为解决办法 安装之前优化一下内核参数以及系统内核版本 内核版本 4.17 cat > /etc/modules-load.d/iptables.conf <<EOF ip_tables iptable_filter EOF 然后重启服务器…...

Vue.component v2v3注册(局部与全局)组件使用详解

在Vue中&#xff0c;可以通过两种方式注册组件&#xff1a;局部注册和全局注册。 局部注册是在父组件中通过import和components选项注册的组件&#xff0c;仅在当前父组件及其子组件中可用。 // 父组件中import ChildComponent from ./ChildComponent.vue;export default {co…...

HNU-算法设计与分析-作业5

第五次作业【回溯算法】 文章目录 第五次作业【回溯算法】<1> 算法分析题5-3 回溯法重写0-1背包<2> 算法分析题5-5 旅行商问题&#xff08;剪枝&#xff09;<3> 算法实现题5-2 最小长度电路板排列问题<4> 算法实现题5-7 n色方柱问题<5> 算法实现…...

基础之音视频2

01 前言 02 mp 03 mp实例 简易音乐播放器 04 音频 sound-pool 1.作用 播放多个音频&#xff0c;短促音频 2.过程 加载load- 3.示例 模拟手机选铃声 步骤&#xff1a; 创建SoundPool对象&#xff0c;设置相关属性 音频流存入hashmap 播放音频 05 videoview 3gp 体积小 mp4 …...

两小时看完花书(深度学习入门篇)

1.深度学习花书前言 机器学习早期的时候十分依赖于已有的知识库和人为的逻辑规则&#xff0c;需要人们花大量的时间去制定合理的逻辑判定&#xff0c;可以说是有多少人工&#xff0c;就有多少智能。后来逐渐发展出一些简单的机器学习方法例如logistic regression、naive bayes等…...

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边&#xff0c;可以通过油漆桶工具&#xff08;取消 “连续”&#xff09;&#xff0c;就把红色的轮廓线&#xff0c;变成黑色的 同时用吸管工具&#xff0c;吸取绿色和白色&#xff0c;用油漆桶填充颜色 4 加上阴影…...

2024.05.15 [AI开发配环境]个人使用最新版远程服务器配环境大纲:docker、云盘、ssh、conda等

不包括在宿主机安装docker。 docker 找到心仪的镜像&#xff0c;比如从网上pull&#xff1a;https://hub.docker.com/r/pytorch/pytorch/tags?page&page_size&ordering&name2.0.1 docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-devel# 新建容器 docker r…...

opencv 轮廓区域检测

直线检测 void LineDetect(const cv::Mat &binaryImage) {cv::Mat xImage,yImage,binaryImage1,binaryImage2;// 形态学变化&#xff0c;闭操作 先膨胀&#xff0c;再腐蚀 可以填充小洞&#xff0c;填充小的噪点cv::Mat element cv::getStructuringElement(cv::MORPH_RE…...

2024-5-16

今日安排&#xff1a; 完结 nf_tables 模块的基本学习&#xff0c;然后开始审计源码mount 的使用&#xff0c;学习 namespace (昨昨昨昨天残留的任务)&#xff08;&#xff1a;看我能搁到什么时候静不下心学习新知识就做 CTF 题目&#x1f991;&#x1f991;&#x1f991; 今…...