热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在InnoDBMySQL中刷新到磁盘之前,脏的数据库页面通常在内存中保留多长时间?

如何解决《在InnoDBMySQL中刷新到磁盘之前,脏的数据库页面通常在内存中保留多长时间?》经验,为你挑选了1个好方法。

我所说的数据库页面是:

https://dev.mysql.com/doc/internals/zh-CN/innodb-page-structure.html

现在,当我们对它发出查询时,这些页面将被加载到内存中,并且仅在此处进行更改并被标记为脏

我不确定这取决于操作系统还是数据库,但是我的问题是这些页面通常在内存中停留多长时间?

可以说,我们有一个用于高负载Web服务器的数据库,它的流量很大,缓冲区大小大约为1gb左右(不确定通常有多少个数据库服务器),现在这1gb中有多少是脏页?

如果没有备用电源而断电,那么对这些脏页的所有更改都会丢失正确吗?(基本上,我想知道是否发生断电,如果没有备用电源,并且发生大量插入和查询,那么内存中脏数据将丢失的估计百分比是多少?)

例如,这些脏页是否有可能在繁忙的服务器上停留超过12或24小时?

编辑:通过脏页面,我的意思是页面在内存中被修改,例如其中的一行被更新或删除



1> Bill Karwin..:

这些页面通常在内存中停留多长时间?

这是可变的。InnoDB有一个后台线程将脏页刷新到磁盘。它会刷新少量的页面,然后在1秒后再次刷新。

因此,如果您在短时间内进行大量更新,则会使许多页面变脏。然后,冲洗线程将逐渐将它们冲洗到磁盘上。这个想法是,这有助于随着时间的推移扩展工作,因此突然的更新高峰不会使您的磁盘不堪重负。

但这意味着“这些页面在内存中脏了多久”可能会有很大不同。我认为在典型情况下,这将在几分钟内完成。

不同版本的MySQL以不同的方式刷新。几年前,主后台线程每1秒刷新固定数量的页面。然后他们提出了自适应冲洗功能,因此如果它检测到您进行了很多更改,它将自动提高冲洗速率。然后,他们提出了一个称为页面清洁器的专用线程。我认为甚至可以将MySQL配置为运行多个页面清理程序线程,但这对于大多数应用程序不是必需的。

您可能也对我对以下这些问题的回答感兴趣:

如何计算页面清洁器线程每秒执行的工作量?

如何解决mysql警告:“ InnoDB:page_cleaner:1000ms的预期循环用了XXXms。设置可能不是最佳的”?

可以说...缓冲区大小大约为1gb左右(不确定数据库服务器通常有多少个)

确实有所不同,取决于应用程序。开箱即用的默认innodb缓冲池大小为128MB,但这对于大多数应用程序来说太小了,除非它是一个测试实例。

在我公司,我们尝试将缓冲池保持在磁盘上至少10%的数据大小。一些应用程序需要更多。我们最常用的大小是24GB,但是最小的大小是1GB,最大的大小是200GB。我们管理着4,000多个生产MySQL实例。

这些1gb中有多少可能是脏页?

从理论上讲,所有这些。MySQL有一个config变量调用innodb_max_dirty_pages_pct,如果您有太多的话,您可能会认为它会阻止任何进一步的脏页。但事实并非如此。即使缓冲池比该变量脏(百分比),您仍然可以修改更多页面。

该变量的实际作用是,如果缓冲池超过了脏页的百分比,则刷新脏页的速率会增加(IIRC,它会使每个周期刷新的页数增加一倍),直到该数目降至该百分比以下再次阈值。

如果没有备用电源而断电,那么对这些脏页的所有更改都会丢失正确吗?

是的,但是您不会丢失更改,因为可以从InnoDB重做日志中重建它们-这两个文件iblogfile_0iblogfile_1您可能已经在数据目录中看到了。提交期间,任何创建脏页的事务都必须记录在重做日志中。

如果您断电(或以其他方式重新启动mysqld进程),InnoDB要做的第一件事是扫描重做日志以检查记录的每个更改是否在崩溃之前被刷新,否则,请加载原始页面并重新应用日志中的更改以再次创建脏页。这就是InnoDB所谓的崩溃恢复。

您可以观看这种情况。当您kill -9使用mysqld进程时,在MySQL Server的测试实例上尾注错误日志。mysqld_safe将重新启动mysqld进程,这将在执行崩溃恢复时向错误日志中注入大量信息。

如果只有少量脏页要恢复,这将非常快,也许只有几秒钟。如果缓冲池很大,并且有很多脏页,则需要更长的时间。在崩溃恢复完成之前,MySQL服务器尚未完全启动,并且无法建立新的客户端连接。在观察崩溃恢复的进度时,这已经引起了许多MySQL DBA的焦虑。无法预测崩溃后需要多长时间。

由于恢复崩溃需要重做日志,因此,如果重做日志已满,MySQL 必须刷新一些脏页。它不会清除脏页,也无法从重做日志中恢复它们。如果发生这种情况,您实际上会看到InnoDB暂停了写操作,直到它可以对最旧的脏页执行“紧急刷新”。对于MySQL来说,这曾经是一个问题,但是随着自适应刷新和页面清理器的改进,它可以更好地跟上更改的步伐。您必须拥有非常多的写入操作,并且重做日志的大小要小,以便在InnoDB进行同步刷新时遇到硬停止。

这是一个有关冲洗的好博客:https : //www.percona.com/blog/2011/04/04/innodb-flushing-theory-and-solutions/

PS:为了对MyISAM进行强制性的抨击,我将指出MyISAM没有重做日志,没有崩溃恢复,并且在写入其数据文件期间依赖于主机OS文件缓冲区。如果主机电源出现故障,而文件缓冲区中有未决的写操作尚未写入磁盘,则您将丢失它们。MyISAM对ACID的耐用性属性没有任何实际支持。


发表您的评论:

重做日志回收时,页面可能会被刷新。也就是说,如果您有2个48MB的重做日志文件(默认大小),并且向其中写入了足够的事务以完全循环通过它并从头开始,则在此期间缓冲池中变脏的任何页面都需要被冲洗。如果重做日志中的相应事务被新事务覆盖,则页面不能在BP中保持脏状态。

据我了解,脏页几乎不可能在不刷新12-24小时的情况下保持在缓冲池中。

我可能在猜测,可能的例外是给定页面在刷新之前一次又一次地更新。因此,它长期以来一直是最近的脏页。同样,我不确定重做日志回收时是否能克服刷新页面的需要。

无论如何,我认为这种可能性很小。

另外,我不确定您所说的取证是什么意思。没有直接方法可以从缓冲池检查页面版本。要从InnoDB获取有关最近更改的信息,您需要检查undo段以查找页面的先前版本,并将它们与重做日志条目相关联。脏页及其以前的版本都可以在缓冲池中或磁盘上。没有命令或API或任何数据结构可以进行任何这种关联。因此,您将手动转储磁盘映像和内存映像,并手动跟随指针。

跟踪数据更改的一种简单得多的方法是检查二进制日志中的更改流。这独立于InnoDB。


推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
ririye2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有