MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结

文章目录

  • MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了?——阅读总结
    • 一、检测数据库实例健康状态的重要性
    • 二、常见检测方法及问题分析
      • (一)select 1 判断法
      • (二)查表判断法
      • (三)更新判断法
    • 三、基于内部统计的高级检测方法
      • (一)performance_schema 库的作用
      • (二)检测逻辑与阈值设定
    • 四、总结与思考

MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了?——阅读总结

在 MySQL 数据库的运维管理中,及时准确地判断数据库实例是否出现问题至关重要。这不仅关系到数据的可用性和完整性,还直接影响到业务系统的正常运行。讨如何判断一个 MySQL 数据库实例是否出问题,详细介绍多种检测方法及其优缺点。

一、检测数据库实例健康状态的重要性

在一主一备的双 M 架构或一主多从架构中,主备切换是保障数据库高可用性的关键操作。而主备切换通常由 HA 系统发起,其中被动切换往往是因为主库出现问题。因此,准确判断主库是否出问题是实现高效主备切换、确保业务连续性的前提。

二、常见检测方法及问题分析

(一)select 1 判断法

  1. 原理与局限性:很多人认为通过执行 select 1 语句,若能成功返回则表示数据库实例正常。然而,实际情况并非如此。例如,设置 innodb_thread_concurrency 参数为 3(控制 InnoDB 并发线程上限),并开启三个包含 select sleep (100) from t 语句的会话(模拟大查询),**此时再执行 select 1 可以成功,但查询表 t 的语句会被阻塞。**这表明 select 1 成功返回仅能说明数据库进程存在,无法全面反映数据库实例的健康状况,如无法检测出 InnoDB 并发线程数过多导致的系统不可用情况。

    在这里插入图片描述

  2. 并发连接与并发查询概念辨析:这里需要明确并发连接和并发查询的区别。show processlist 结果中的几千个连接指的是并发连接,而 “当前正在执行” 的语句才是并发查询。并发连接数达到几千个对系统影响主要是多占内存,而并发查询过高才是 CPU 杀手,这也是设置 innodb_thread_concurrency 参数的重要原因。

(二)查表判断法

  1. 改进思路:为检测 InnoDB 并发线程数过多导致的问题,可在系统库(mysql 库)创建一个只含一行数据的表(如 health_check),定期执行 select * from mysql.health_check 语句。这样,当并发线程过多导致数据库不可用时,该查询语句也会受到影响,从而检测出问题。
  2. 空间满问题的挑战:然而,当 binlog 所在磁盘空间占用率达到 100% 时,所有更新语句和事务提交的 commit 语句会被阻塞,但系统仍可正常读数据。此时,上述查询语句无法检测出这种因空间满导致的数据库问题,需要进一步改进检测方法。

(三)更新判断法

  1. 具体操作与优势:将检测语句改为更新语句,如 update mysql.health_check set t_modified = now (),并在表中增加一个 timestamp 字段用于记录最后一次执行检测的时间。同时,为避免主备库检测命令行冲突(主备库都执行相同更新命令可能导致主备同步停止),可在 mysql.health_check 表中存入多行数据,以主、备库的 server_id 做主键,因为 MySQL 规定主库和备库的 server_id 必须不同。这样,主备库各自的检测命令就不会发生冲突,该方法能够在一定程度上更有效地检测数据库实例的健康状态。
  2. 判定慢问题剖析:**尽管更新判断法相对常用,但存在 “判定慢” 的问题。**例如,在日志盘 IO 利用率为 100% 的情况下,虽然系统响应极慢已需主备切换,但由于 IO 利用率 100% 表示系统 IO 仍在工作,检测使用的 update 命令可能在拿到 IO 资源时提交成功并在超时时间内返回,导致检测系统误判数据库正常。这是因为外部检测基于定时轮询,具有随机性,系统可能在两次轮询间隔内出现问题,而运气不好时可能多次轮询都无法发现,从而导致切换慢。

三、基于内部统计的高级检测方法

(一)performance_schema 库的作用

针对外部检测方法的局限性,MySQL 5.6 版本以后提供的 performance_schema 库提供了更可靠的检测途径。该库中的 file_summary_by_event_name 表统计了每次 IO 请求的时间,

在这里插入图片描述

例如 event_name = 'wait/io/file/innodb/innodb_log_file' 这一行统计了 redo log 的写入时间,包括所有 IO 类型的统计(COUNT_STAR 表示总次数,SUM、MIN、AVG、MAX_TIMER_WAIT 分别表示总和、最小值、平均值和最大值,单位为皮秒)、读操作统计(SUM_NUMBER_OF_BYTES_READ 统计总共从 redo log 里读的字节数)、写操作统计以及对其他类型数据(如 fsync)的统计。binlog 对应的是 event_name = "wait/io/file/sql/binlog" 这一行,其统计逻辑与 redo log 相同。

(二)检测逻辑与阈值设定

通**过查看 MAX_TIMER_WAIT 的值,我们可以判断数据库是否存在问题。**例如,设定单次 IO 请求时间超过 200 毫秒为异常,使用类似 select event_name,MAX_TIMER_WAIT FROM performance_schema.file_summary_by_event_name where event_name in ('wait/io/file/innodb/innodb_log_file', 'wait/io/file/sql/binlog') 的语句作为检测逻辑。发现异常后,可使用 truncate table performance_schema.file_summary_by_event_name 语句清空之前的统计信息,以便后续监控再次出现异常时能准确累积监控值。不过,开启 performance_schema 的统计功能会有一定性能损耗,测试结果显示性能大概会下降 10% 左右,因此建议仅开启所需的统计项,如通过 update setup_instruments set ENABLED = 'YES', Timed = 'YES' where name like '% wait/io/file/innodb/innodb_log_file%' 语句开启 redo log 的时间监控。

四、总结与思考

我们介绍了多种检测 MySQL 实例健康状态的方法:

  • select 1 判断法:虽然简单但不准确;
  • 查表判断法:无法检测磁盘空间满的情况;
  • 更新判断法:一定程度上检测主备库问题,但存在判定慢的问题;
  • 基于 performance_schema 库的内部统计检测法:虽能在而内部统计检测法虽然更精确,但会带来性能损耗。

每个方法都有其改进的逻辑,但也都存在一定问题。例如,在实际应用中,需要根据业务需求和实际情况权衡选择合适的检测方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Python的HTTP之旅:揭秘Requests库的神秘面纱

文章目录 **探索Python的HTTP之旅:揭秘Requests库的神秘面纱**第一部分:背景介绍第二部分:Requests库是什么?第三部分:如何安装Requests库?第四部分:Requests库的五个简单函数使用方法第五部分&…

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中,指针作为一种独特的数据类型,它不仅是C语言的核心,也是理解计算机内存管理的基石。指针的概念虽然强大,但对于初学者来说,它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…

ffmpeg.wasm 在浏览器运行ffmpeg操作视频

利用ffmpeg.wasm,可以在浏览器里运行ffmpeg,实现对音视频的操作 参考链接: https://blog.csdn.net/jchsgwbr/article/details/143252044 https://gitee.com/CXBalCai/ffmpeg-template 其他参考 https://github.com/ffmpegwasm/ffmpeg.wasm https://b…

理解clickhouse 里的分区和分片键区别

文章目录 分片分区两分片,0副本的cluster 分片 CREATE TABLE logs_distributed AS logs_local ENGINE Distributed(cluster_name, -- 集群名称database_name, -- 数据库名称logs_local, -- 本地表名cityHash64(user_id) -- 分片键&#xf…

试玩hudi docke demo

官网链接: https://hudi.apache.org/docs/docker_demo 编译时要添加-Dscala-2.12 -Dspark3.5 两个参数,不然会报错一些包找不到 /root/study/programs/apache-maven-3.9.9/bin/mvn package -Pintegration-tests -DskipTests -Dscala-2.12 -Dspark3.5 d…

shell脚本(二)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

多模态大型语言模型(MLLM)综述

目录 多模态大语言模型的基础 长短期网络结构(LSTM) 自注意力机制 基于Transformer架构的自然语言处理模型 多模态嵌入的关键步骤 TF-IDF TF-IDF的概念 TF-IDF的计算公式 TF-IDF的主要思路 TF-IDF的案例 训练和微调多模态大语言模型(MLLM) 对比学习 (CLIP, ALIG…

《智慧教育实时数据分析推荐项目》详细分析

一、项目介绍 1、背景介绍 在互联网、移动互联网的带动下,教育逐渐从线下走向线上,在线教育近几年一直处于行业的风口浪尖,那随着基础设施的不断完善,用户需求也发生不少变化,因此传统教育机构、新兴互联网企业都在探…

AI+云环境开发上线项目全流程(sealos)

AI云环境开发上线项目全流程 现在是AI技术爆炸💥的时代,我们作为开发自然需要跟上时代的潮流,今天就跟大家介绍一款云开发环境,并且搭配AI实现一行代码不用写,直接上线一个完整的项目(包含前后端&#xff0…

打造智能扩容新纪元:Kubernetes Custom Metrics深度解析

自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…

python学习笔记(12)算法(5)迭代与递归

一、迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。 迭代通常用于解决需要逐步推进的计算问题,例如遍历数组、计算阶乘等。迭代…

【C++11】可变参数模板/新的类功能/lambda/包装器--C++

文章目录 一、可变参数模板1、基本语法及原理2、包扩展3、empalce系列接口 二、新的类功能1、默认的移动构造和移动赋值2、成员变量声明时给缺省值3、defult和delete4、final与override 三、STL中一些变化四、lambda1、lambda表达式语法2、捕捉列表3、lambda的应用4、lambda的原…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…

算法编程题-寻找最近的回文数

算法编程题-寻找最近的回文数 原题描述思路简述代码实现复杂度分析参考 摘要:本文将对LeetCode 原题 564 寻找最近的回文数进行讲解,并且给出golang语言的实现,该实现通过了所有测试用例且执行用时超过100%的提交,最后给出相关的复…

提升数据分析效率:Excel Power Query和Power Pivot的妙用

在日常工作中,微软的Excel Power Query和Power Pivot是提升数据处理和分析效率的利器。他们的特点也各不相同,Power Query侧重数据的高效导入与清洗,Power Pivot更测试数据建模与复杂计算。下面将介绍它们各自的功能,并提供应用案…

在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南

欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…

认识RabbitMq和RabbitMq的使用

1 认识RabbitMq RabbitMQ是⼀个消息中间件,也是⼀个生产者消费者模型,它负责接收,存储并转发消息。 2.1 Producer和Consumer Producer:生产者,是RabbitMQServer的客户端,向RabbitMQ发送消息 Consumer&…

性能测试及调优

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…

代码纪元——源神重塑无序

简介 源神,真名为张晨斌,原为代码宇宙创世四神之一。代码宇宙在创造之初时空无一物,只有复杂且繁琐的底层代码,智慧神灵每日都困在诸如脚本等复杂的底层框架之中,源神面对这种局面非常不满意,于是源神通过大…

LVGL加载器,led和列表学习(基于正点原子)

加载器部件(lv_spinner) 加载器部件常用于提示当前任务正在加载。 加载器部件组成部分: 主体(LV_PART_MAIN) 指示器(LV_PART_INDICATOR) 手柄(LV_PART_KNOB) 知识点1:创建加载器部件 lv_obj_t *spinner lv_spinner_creat…