iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >GTID中MySQL启动时间慢是什么原因
  • 879
分享到

GTID中MySQL启动时间慢是什么原因

2024-04-02 19:04:59 879人浏览 泡泡鱼
摘要

本篇内容介绍了“GTID中Mysql启动时间慢是什么原因”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们

本篇内容介绍了“GTID中Mysql启动时间慢是什么原因”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

我们如何找到问题

我们正在研究在启用GTID模式的低端,基于磁盘的mysql 5.7.21部署中缓慢的Mysql启动时间。该系统是主从对的一部分,并且处于适度的写入负载下。在计划维护期间重新启动时,我们注意到数据库服务器需要5-10分钟才能启动并开始接受连接。这种延迟没有意义,所以我们开始调查。

调试慢速MySQL启动时间

我们使用流行的Percona工具pt-ioprofile来查看数据库正在做什么。pt-ioprofile是Percona 用于调试MySQL问题的流行工具包中非常重要的实用程序,您可以在其文档中看到完整的功能列表。pt-ioprofile工具使用strace和lsof来监视进程的I / O并打印出一个文件和I / O活动表。

所以,我们启动MySQL,等待mysqld进程生成,并启动pt-ioprofile以查看问题可能是:

# PT - ioprofile  - 个人资料- 过程 的mysqld  - 运行- 时间 200
周二 年10月 9  15:42:24  UTC  2018
跟踪 进程 ID  18677
total       pread        read      pwrite       write       fsync   fdatasync        open       close    getdents       lseek       fcntl  filename
...
216.550641    0.000000   216.550565    0.000000    0.000000    0.000000    0.000000    0.000015    0.000040    0.000000    0.000021    0.000000  / mysql_data / binlogs / mysql - bin。000014
...

你的MySQL重启的原因是什么?

在多次运行时,我们观察到以下情况:

  • mysqld进程大部分时间都在阅读最新的二进制日志文件。即使服务器已经正常停止并且不需要崩溃恢复等,情况也是如此。

  • 服务器也花了相当多的时间加载InnoDB数据文件,但与读取最新的二进制日志文件所花费的时间相比,这个时间要小得多。

  • 如果服务器立即重新启动,则后续重启会更快。

  • 由于数据库关闭会刷新二进制日志并在启动时创建一个新日志,因此我们进行了另一项实验 - 在关闭服务器之前,我们刷新了二进制日志。后续服务器启动再次快速。

这些观察清楚地指出MySQL正在花费大量时间阅读最新的二进制日志文件。如果文件很小,就像在关机之前刷新日志文件那样,启动速度很快。

了解Binlog GTID恢复

事实证明,为了填充gtid_executed和gtid_purged的值,MySQL服务器必须解析二进制日志文件。

以下是基于FALSE或TRUE读数的MySQL 5.7 文档方法建议的摘要:

binlog_gtid_simple_recovery = FALSE时:

要计算gtid_executed:

  • 从最新的迭代二进制日志文件,停止在具有Previous_gtids_log_event条目的第一个文件。

  • 从此二进制日志文件中使用Previous_gtids_log_eventGtid_log_events中的所有GTID ,并在内部存储此GTID集。它被称为gtids_in_binlog。

  • 价值gtid_executed被计算为工会gtids_in_binlog并在该GTIDs mysql.gtid_executed表

如果存在大量没有GTID的二进制日志文件(例如,在gtid_mode = OFF 时创建),则此过程可能非常耗时。

同样,要计算gtid_purged:

  • 迭代从最旧到最新的二进制日志文件,停止在包含非空的Previous_gtids_log_event(至少有一个GTID)或至少有一个Gtid_log_event的第一个二进制日志中。

  • 从此文件中读取Previous_gtids_log_event。计算内部变量gtids_in_binlog_not_purged,因为此gTID集从gtids_in_binlog中减去

  • 价值gtid_purged设置为gtid_executed,减去gtids_in_binlog_not_purged

因此,这构成了我们理解旧版本中工作原理的基础。但是,当binlog_gtid_simple_recovery为TRUE 时,可以进行某些优化。我们感兴趣的是这种情况:

binlog_gtid_simple_recovery = TRUE时:

(注意,这是MySQL 5.7.7及更高版本中的默认设置)

  • 只读最旧和最新的二进制日志文件。

  • 从最早的二进制日志文件中找到的Previous_gtids_log_eventGtid_log_event计算gtid_purged

  • 从最新的二进制日志文件中找到的Previous_gtids_log_eventGtid_log_event计算gtid_executed

  • 因此,在服务器重新启动或清除二进制日志期间,读取两个二进制日志文件

因此,对于MySQL 5.7.7及更高版本,在系统启动期间始终读取最新和旧的二进制日志文件,以正确初始化GTID系统变量。读取最旧的二进制日志文件并不昂贵,因为MySQL正在寻找的事件,Previous_gtids_log_event,始终是二进制日志文件中的第一个事件。

但是,为了正确计算gtid_executed,服务器必须读取整个最新的二进制日志文件并收集该文件中的所有事件。因此,系统启动时间与最新二进制日志文件的大小成正比。

请注意,当binlog_gtid_simple_recovery为FALSE 时,情况会更糟。由于它不再是最近版本中的默认选项,因此并不是一个值得关注的问题。

如何解决您的慢启动时间

了解了我们遇到的问题的原因,我们决定的解决方案相当明显 - 减少二进制日志文件的大小。二进制日志文件的默认大小为1GB。在启动期间解析此大小的文件需要花费时间,因此将max_binlog_size的值减小到较低值是有意义的。

如果不能减小二进制日志文件的大小,那么在维护关闭mysqld进程之前刷新二进制日志文件有助于减少binlog GTID恢复时间。

“GTID中MySQL启动时间慢是什么原因”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: GTID中MySQL启动时间慢是什么原因

本文链接: https://www.lsjlt.com/news/60923.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么查询当前用户所有的表
    要查询当前用户拥有的所有表,可以使用以下 sql 命令:select * from user_tables; 如何查询当前用户拥有的所有表 要查询当前用户拥有的所有表,可以使...
    99+
    2024-05-15
    oracle
  • oracle怎么备份表中数据
    oracle 表数据备份的方法包括:导出数据 (exp):将表数据导出到外部文件。导入数据 (imp):将导出文件中的数据导入表中。用户管理的备份 (umr):允许用户控制备份和恢复过程...
    99+
    2024-05-15
    oracle
  • oracle怎么做到数据实时备份
    oracle 实时备份通过持续保持数据库和事务日志的副本来实现数据保护,提供快速恢复。实现机制主要包括归档重做日志和 asm 卷管理系统。它最小化数据丢失、加快恢复时间、消除手动备份任务...
    99+
    2024-05-15
    oracle 数据丢失
  • oracle怎么查询所有的表空间
    要查询 oracle 中的所有表空间,可以使用 sql 语句 "select tablespace_name from dba_tablespaces",其中 dba_tabl...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限设置
    答案:要创建 oracle 新用户,请执行以下步骤:以具有 create user 权限的用户身份登录;在 sql*plus 窗口中输入 create user identified ...
    99+
    2024-05-15
    oracle
  • oracle怎么建立新用户
    在 oracle 数据库中创建用户的方法:使用 sql*plus 连接数据库;使用 create user 语法创建新用户;根据用户需要授予权限;注销并重新登录以使更改生效。 如何在 ...
    99+
    2024-05-15
    oracle
  • oracle怎么创建新用户并赋予权限密码
    本教程详细介绍了如何使用 oracle 创建一个新用户并授予其权限:创建新用户并设置密码。授予对特定表的读写权限。授予创建序列的权限。根据需要授予其他权限。 如何使用 Oracle 创...
    99+
    2024-05-15
    oracle
  • oracle怎么查询时间段内的数据记录表
    在 oracle 数据库中查询指定时间段内的数据记录表,可以使用 between 操作符,用于比较日期或时间的范围。语法:select * from table_name wh...
    99+
    2024-05-15
    oracle
  • oracle怎么查看表的分区
    问题:如何查看 oracle 表的分区?步骤:查询数据字典视图 all_tab_partitions,指定表名。结果显示分区名称、上边界值和下边界值。 如何查看 Oracle 表的分区...
    99+
    2024-05-15
    oracle
  • oracle怎么导入dump文件
    要导入 dump 文件,请先停止 oracle 服务,然后使用 impdp 命令。步骤包括:停止 oracle 数据库服务。导航到 oracle 数据泵工具目录。使用 impdp 命令导...
    99+
    2024-05-15
    oracle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作