首页 > 数据库 >MySQL启停耗时久是什么原因

MySQL启停耗时久是什么原因

时间:2024-02-29 10:22:47浏览次数:25  
标签:load OFF dump buffer 耗时 启停 innodb MySQL pool

一、问题背景

 

基础环境:

  • 主机类型:x3850 X6

  • 操作系统:DB:Red Hat Enterprise Linux 9.1 7.8

  • 存储:IBM存储,500GB

  • 内存:64 G

  • CPU型号:E7-4830 v3 @ 2.10GHz

  • CPU核数:32CORE

  • 数据库环境:8.0.27

 

问题现象:

测试环境数据库启停耗时较长。

 

说明:

测试环境有一套MySQL数据库给开发同事使用,某天开发小哥让协助启停一下数据库,发现MySQL启停的时候非常慢。

这场面见得还真不多,带着疑问,一探究竟。

二、一探究竟

MySQL启停加载热数据的相关参数:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 mysql> show variables like 'innodb_buffer_pool_dump%'; +-------------------------------------+-------+ |  Variable_name                       | Value | +-------------------------------------+-------+ |innodb_buffer_pool_dump_at_shutdown | ON    | | innodb_buffer_pool_dump_now         | OFF   | |innodb_buffer_pool_dump_pct         | 25    | +-------------------------------------+-------+ rows in set (0.00 sec)    mysql> show variables like 'innodb_buffer_pool_load%'; +------------------------------------+-------+ | Variable_name                      | +------------------------------------+-------+ | innodb_buffer_pool_load_abort      | OFF   | |innodb_buffer_pool_load_at_startup | ON    | | innodb_buffer_pool_load_now        | OFF   | +------------------------------------+-------+ rows in set (0.01 sec)       解释: innodb_buffer_pool_dump_at_shutdown = 1  #在关闭时把热数据dump到本地磁盘。 innodb_buffer_pool_dump_now = 1  #采用手工方式把热数据dump到本地磁盘。 innodb_buffer_pool_dump_pct  #指定每个缓冲池最近使用的页面读取和转储的百分比。范围是1到100。默认值是25。例如,如果有4个缓冲池,每个缓冲池有100个page,并且innodb_buffer_pool_dump_pct设置为25,则dump每个缓冲池中最近使用的25个page。 innodb_buffer_pool_load_abort  #是否要中止缓冲池加载操作,默认是关闭的 innodb_buffer_pool_load_at_startup = 1  #在启动时把热数据加载到内存。 innodb_buffer_pool_load_now = 1  #采用手工方式把热数据加载到内存。

  

MySQL关闭时,会把内存中的热数据保存在磁盘里ib_buffer_pool文件中,此文件位于redo日志存放的路径innodb_log_group_home_dir数据目录下。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mysql> show variables like '%buffer_pool%'; +-------------------------------------+----------------+ | Variable_name                       | Value          | +-------------------------------------+----------------+ | innodb_buffer_pool_chunk_size       | 134217728      | | innodb_buffer_pool_dump_at_shutdown | ON             | | innodb_buffer_pool_dump_now         | OFF            | | innodb_buffer_pool_dump_pct         | 25             | | innodb_buffer_pool_filename         | ib_buffer_pool |  #此文件 | innodb_buffer_pool_in_core_file     | ON             | | innodb_buffer_pool_instances        | 1              | | innodb_buffer_pool_load_abort       | OFF            | | innodb_buffer_pool_load_at_startup  | ON             | | innodb_buffer_pool_load_now         | OFF            | | innodb_buffer_pool_size             | 134217728      | +-------------------------------------+----------------+

 

图片

MySQL启动时,会自动加载热数据到Buffer_Pool缓冲池里。

1 2 3 4 5 6 7 8 查看加载时间 mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status'; +--------------------------------+--------------------------------------------------+ | Variable_name                  | Value                                            | +--------------------------------+--------------------------------------------------+ | Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 230227 15:32:13 | +--------------------------------+--------------------------------------------------+ 1 row in set (0.00 sec)

 

改成手动加载热数据

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 手动进行加载: mysql> show variables like 'innodb_buffer_pool_dump%'; +-------------------------------------+-------+ | Variable_name                       | Value | +-------------------------------------+-------+ | innodb_buffer_pool_dump_at_shutdown | ON    | | innodb_buffer_pool_dump_now         | OFF   | | innodb_buffer_pool_dump_pct         | 25    | +-------------------------------------+-------+ rows in set (0.01 sec)   mysql> show variables like 'innodb_buffer_pool_load%'; +------------------------------------+-------+ | Variable_name                      | Value | +------------------------------------+-------+ | innodb_buffer_pool_load_abort      | OFF   | | innodb_buffer_pool_load_at_startup | OFF   | | innodb_buffer_pool_load_now        | OFF   | +------------------------------------+-------+ rows in set (0.01 sec)   查看执行状态:没有进行加载 mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status'; +--------------------------------+------------------------------------+ | Variable_name                  | Value                              | +--------------------------------+------------------------------------+ | Innodb_buffer_pool_load_status | Loading of buffer pool not started | +--------------------------------+------------------------------------+ 1 row in set (0.00 sec)

  

手动进行加载:

 

1 2 3 4 5 6 7 8 9 10 mysql> set global innodb_buffer_pool_load_now=1; Query OK, 0 rows affected (0.00 sec)   mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status'; +--------------------------------+--------------------------------------------------+ | Variable_name                  | Value                                            | +--------------------------------+--------------------------------------------------+ | Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 230227 15:59:58 | +--------------------------------+--------------------------------------------------+ 1 row in set (0.00 sec)

  

这样,始终保持热数据在内存中。

MySQL服务正常关闭,热数据会dump到内存。机器宕机或者kill mysql进程,热数据不会dump。

标签:load,OFF,dump,buffer,耗时,启停,innodb,MySQL,pool
From: https://www.cnblogs.com/ataoxz/p/18042826

相关文章

  • CentOS 7 - 安装MySQL 5.7
    本文涉及的产品云数据库RDSSQLServer,独享型2核4GB推荐场景:SQLServer性能诊断案例分析立即试用云数据库RDSMySQLServerless,0.5-2RCU50GB推荐场景:学生管理系统数据库设计搭建个人博客立即试用 简介: CentOS7的默认yum仓......
  • 如何在WSL 2 (Ubuntu) 中安装MySQL8.0
    前言​ 在CSDN上找了一圈如何在WSL2上的Ubuntu下载Mysql8.0,并于Windows主机上的Navicat进行连接的教程,找了七八篇,跟着走了一遍,结果全部失败!全部失败!​ 于是我果断的选择谷歌搜索,找到一篇一次成功的文章,这里是原文.这里仅做转载,感谢作者大佬!​ 在这里贴出自己的版本号......
  • mysql各版本的区别介绍
    摘要:mysql各版本的区别介绍,MySQLCommunityServer是开源免费的,这也是我们通常用的MySQL的版本。essentials”是指精简版,不包含embeddedserverandbenchmarksuite,有自动安装程序和配置向导,没有MySQL文档。“noinstall”是指非安装的压缩包的。现在官方已经不提供windows已......
  • mysql 复制表结构
    业务系统数据大增时,经常会使用到分表,我们对于日志表按月来分,若原有日志表:trxn_detail_log_201806,现在像创建以后每个月的表,可以使用以下语句复制表数据。CREATETABLE表名LIKESELECT*FROM模板表名;CREATETABLEtrxn_detail_log_201807LIKESELECT*FROMtrxn_detai......
  • centos7环境用docker-compose部署mysql5.7集群,redis7.2.4,springboot项目
    文件目录结构关于每个配置项及docker-compose的安装,大家可以自己查mysql配置文件master---my.cnf[mysqld]server_id=1gtid-mode=ONenforce-gtid-consistency=1binlog-ignore-db=mysqllog-bin=mysql-binbinlog_cache_size=......
  • MySQL如何查看添加修改表以及字段注释信息
    MySQL数据库中,如何查看表和字段的注释信息,以及如何添加,修改表和字段的注释信息呢?这里简单总结归纳一下。仅供参考。添加表的注释信息方法1:创建表的时候添加表的注释信息create table  if not exists employee(     employee_id int not null comment '员工号'......
  • MySQL:Data too long for column '成果简介' at row 1
    MySQL导入数据时只导入了结构而没有导入数据检查发现报错:Datatoolongforcolumn'成果简介'atrow1 解决方法——将过长的文件类型更改为text即可  ......
  • 【MySQL】【锁的前置知识】数据库的锁有哪些?怎么看?锁的是什么?什么情况下会加什么锁?什
    1 前言数据库中的锁,是一个很大的问题,从哪看起呢?该怎么看呢?所以在看锁之前,了解一些相关的前置知识,然后再去细看不同的场景下会加什么样的锁方便你快速理解。官网,当然我们这里看的引擎是InnoDB哈,那我们从以下几个问题看起:(1)数据库中的锁有哪些(怎么知道呢,网上的文章五花八门的......
  • Python脚本给数据库插入数据报错: raise errorclass(errno, errval) pymysql.err.Integ
    一、问题描述在SQL客户端插入数据时执行SQL语句INSERTINTOuser_xxx(id,uid,total,balance,wallet_type,ctime,utime)VALUES(0,'336448391',271,89000098,'coin',1708588247,1709007766);可以成功执行没报错;使用python脚本执行SQL语句INSERTINTOuser_xxx......
  • 【MySQL-技术】MySQL数据库自动添加创建时间、更新时间(超详细版)
    参考文档:https://blog.csdn.net/A1924/article/details/117074646 一、MySQL5.7及以上版本(也适用于MySQL8.0+)方法下列给出了三种不同时期修改表的SQL,便于各位看官快捷开发(CV大法)1、新建表自动获取创建时间:timestampnotnulldefaultCURRENT_TIMESTAMP自动获取更新时间:times......