解决Mysql磁盘IO占用过高的问题

 更新时间:2024年04月11日 14:35:43   作者:时栈  
这篇文章主要介绍了解决Mysql磁盘IO占用过高的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

在之前的主从同步过程中(Mysql的多级复制),从数据库Z存在磁盘IO占用过高的问题。

磁盘IO在同步期间占用率达到100%,且数据存在滞后,不能实现实时更新。

从数据库的磁盘为机械硬盘,读写性能相对于固态硬盘要差一点。

一、原因

可能是因为MySQL在日志在每次事务提交时,都会将其写入并刷新到磁盘,造成磁盘IO的高占用。

二、查看配置

通过在MySQL命令行运行以下命令:

show variables like 'sync_binlog';

可以看到:sync_binlog 的值为1。

该值意味着:启用在提交事务之前将二进制日志同步到磁盘。这是最安全的设置,但是会造成磁盘的较高占用。

show variables like 'innodb_flush_log_at_trx_commit';

可以看到:innodb_flush_log_at_trx_commit 的值为1。

该值意味着:日志会在每次事务提交时写入并刷新到磁盘。

三、配置参数含义

sync_binlog:控制MySQL服务器将二进制日志同步到磁盘的频率

  • 默认值:1
  • 最小值:0
  • 最大值:4294967295

sync_binlog=0:禁用 MySQL 服务器将二进制日志同步到磁盘。相反,MySQL服务器依赖于操作系统不时将二进制日志刷新到磁盘,就像它对任何其他文件所做的那样。此设置提供最佳性能,但在发生电源故障或操作系统崩溃时,服务器可能已提交尚未同步到二进制日志的事务。

sync_binlog=1:启用在提交事务之前将二进制日志同步到磁盘。这是最安全的设置,但由于磁盘写入次数增加,可能会对性能产生负面影响。如果发生电源故障或操作系统崩溃,二进制日志中缺少的事务仅处于就绪状态。这允许自动恢复例程回滚事务,从而保证二进制日志中不会丢失任何事务。

sync_binlog=N,其中 N 是 0 或 1 以外的值:收集二进制日志提交组后,二进制日志将同步到磁盘。如果发生电源故障或操作系统崩溃,服务器可能已提交尚未刷新到二进制日志的事务。由于磁盘写入次数增加,此设置可能会对性能产生负面影响。值越高,性能越高,但数据丢失的风险也会增加。

  • innodb_flush_log_at_trx_commit:控制提交操作的严格 ACID 合规性与重新排列并批量完成与提交相关的 I/O 操作时可能实现的更高性能之间的平衡。
  • 默认值为1
  • 有效值为:0、1、2

可以通过更改默认值来获得更好的性能,但随后可能会在崩溃中丢失事务。

  • innodb_flush_log_at_trx_commit=1 :完全符合 ACID 所必需的。日志在每次事务提交时写入并刷新到磁盘。
  • innodb_flush_log_at_trx_commit=0:每秒将日志写入磁盘并刷新一次。尚未刷新其日志的事务可能会在崩溃中丢失。
  • innodb_flush_log_at_trx_commit=2:在每次事务提交后写入日志,并每秒刷新一次到磁盘。尚未刷新其日志的事务可能会在崩溃中丢失。

对于设置 0 和 2,不能 100% 保证每秒一次刷新。

由于 DDL 更改和其他内部活动导致独立于innodb_flush_log_at_trx_commit设置刷新日志,刷新可能会更频繁地发生,有时由于计划问题而降低刷新频率。

如果每秒刷新一次日志,则崩溃时最多可能会丢失一秒钟的事务。

如果刷新日志的频率高于或低于每秒一次的频率,则可能丢失的事务量会相应地变化。

四、通过修改配置解决问题

注意:

这种解决办法是在牺牲数据库安全的前提下,提高磁盘的性能!!!

更改配置可能会带来更高的数据丢失风险!!!

可以通过以下两条命令修改配置。 

set global sync_binlog=你希望的值;
set global innodb_flush_log_at_trx_commit=你希望的值;

更多设置请参考:

MySQL的二进制日志记录选项和变量

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Navicat Premium15连接云服务器中的数据库问题及遇到坑

    Navicat Premium15连接云服务器中的数据库问题及遇到坑

    这篇文章主要介绍了Navicat Premium15连接云服务器中的数据库问题及遇到坑,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • mysql 8.0.18 安装配置方法图文教程(linux)

    mysql 8.0.18 安装配置方法图文教程(linux)

    这篇文章主要介绍了linux下mysql 8.0.18 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • MySQL安装配置以及安装失败解决过程

    MySQL安装配置以及安装失败解决过程

    我们在下载完MYSQL时,安装可能会遇到或大或小的问题,下面这篇文章主要给大家介绍了关于MySQL安装配置以及安装失败解决的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • MySQL中临时表的使用示例

    MySQL中临时表的使用示例

    这篇文章主要介绍了MySQL中的内存临时表的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL数据库的一次死锁实例分析

    MySQL数据库的一次死锁实例分析

    本文主要给大家通过一个实例来具体介绍MySQL死锁问题的相关知识,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
    2016-11-11
  • Ubuntu 14.04下安装MySQL

    Ubuntu 14.04下安装MySQL

    1、更新源列表打开"终端窗口",输入"sudo apt-getupdate"-->回车-->"输入root用户的密码"-->回车,就可以了。如果不运行该命令,直接安装mysql,会出现"有几个软件包无法下载,您可以运行apt-getupdate------"的错误提示,导致无法安装。
    2016-04-04
  • mysql中使用instr进行模糊查询方法介绍

    mysql中使用instr进行模糊查询方法介绍

    这篇文章主要介绍了mysql中使用instr进行模糊查询方法介绍,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • 理解Mysql prepare预处理语句

    理解Mysql prepare预处理语句

    这篇文章主要帮助大家学习理解Mysql prepare预处理语句,对prepare预处理语句感兴趣的小伙伴们可以参考一下
    2016-03-03
  • mysql DBA:mysqladmin常用命令总结

    mysql DBA:mysqladmin常用命令总结

    mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态、进程信息、进程杀死等。本文介绍一下如何使用mysqladmin extended-status(因为没有"歧义",所以可以使用ext代替)了解MySQL的运行状态
    2014-03-03
  • MySQL8新特性之全局参数持久化详解

    MySQL8新特性之全局参数持久化详解

    从8.0开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中,下面这篇文章主要给大家介绍了关于MySQL8新特性之全局参数持久化的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论