MySQL之优化服务器设置(二)

优化服务器设置

InnoDB事务日志(包含:Redo log 重做日志和Undo log回滚日志)

了解清楚"把日志缓冲写到日中文件"和"把日志刷新到持久化存储"之间的不同是很重要的。在大部分操作系统中,把缓冲写到日志只是简单地把数据从InnoDB的内存缓冲转移到了操作系统的缓存,也是在内存里,并没有真的把数据写到持久化存储。因此,如果MySQL崩溃了或者电源断电了,设置0和2通常会导致最多一秒的丢失,因为数据可能只存在于操作系统的缓存。我们说"通常",因为不论如何InnoDB会每秒尝试刷新日志文件到磁盘,但是在一些场景下也可能丢失超过1秒的事务,例如当刷新被推迟了。
与此相反,把日志刷新到持久化存储意味着InnoDB请求操作系统把数据刷出缓存,并且确认写到磁盘了。这是一个阻塞IO的调用,直到数据被完全写回才会完成。因为写数据到磁盘比较满,当innodb_flush_log_at_trx_commit被设置为1时,可能明显地降低InnoDB每秒可以提交的事务数。今天的高速驱动器可能每秒只能执行一两百个磁盘事务,受限于磁盘旋转速度和寻道时间。有时硬盘控制器或者操作系统假装做了刷新,其实只是把数据放到了另一个缓存,例如磁盘自己的缓存。这更快但是很危险,因为u如果驱动器断电,数据依然可能丢失。者甚至比设置innodb_flush_log_at_trx_commit为不为1的值更糟糕,因为这可能导致数据损坏,不仅仅时丢失事务。
设置innodb_flush_log_at_trx为不为1的值可能导致丢失事务。然而,如果不在意持久性(ACID中的D),那么设置为其他的值也是有用的。也许你只是想拥有InnoDB的其他一些功能,例如聚簇索引、防止数据损坏,以及行锁。但仅仅因为性能原因用InnoDB替换MyISAM的情况也并不少见。
高性能事务处理需要的最佳配置是把innodb_flush_log_at_trx_commit设置为1且把日志i文件放到一个有电池保护的写缓存的RAID卷中。这兼顾了安全和速度。事实上,哦我们敢说任何希望能扛过高负荷工作负载的产品数据库服务器,都需要有这种类型的硬件。

Percona Server扩展了innodb_flush_log_at_trx_commit变量,使得它成为一个会话级变量,而不是一个全局变量。这允许有不同的性能和持久化要求的应用,可以使用同样的数据库,同时又避免了标准MySQL提供的一刀切的解决方案。

InnoDB 怎样打开和刷新日志以及数据文件

在这里插入图片描述

使用innodb_flush_method选项可以配置InnoDB如何跟文件系统相互作用。从名字来看,会以为只能影响InnoDB怎么写数据,实际上还影响了InnoDB怎么读数据。Windows和非Windows的操作系统对这个选项的值是互斥的:async_unbuffered、unbuffered和norm只能在Windows下使用,并且Windows下不能使用其他的值。在Windows下默认值是unbuffered,其他操作系统都是fdatasync(如果SHOW GLOBAL VARIABLES 显式这个变量为空,意味着它被设置为默认值了)。
改变Innodb执行IO操作的方式可以显著地影响性能,所以请确认你明白了在做什么后再去做改动。
这是个有点难以理解的选项,因为它既影响日志文件,也应该想数据文件,而且有时候对不同类型的文件的处理也不一样。如果有一个选项来配置日志,另一个选项来配置数据为念,这样最好了,但实际上它们混合在同一个配置项中。下面是一些可能的值:

  • 1.fdatasync
    这在非Windows系统上是默认值:InnoDB用fsync()来刷新数据和日志文件。InnoDB通常用fsync()代替fdatasync(),即使这个值似乎表达的是相反的意思。fdatasync()跟fsync()相似,但是只刷新文件的数据,而不包括元数据(最后修改时间,等等)。因此,fsync()会导致更多的IO,然而InnoDB的开发者都很保守,它们发现某些场景下fdatasync()会导致数据损坏。InnoDB决定了哪些方法可以安全地使用,有一些是编译时设置的,也有一些是运行时设置的。它使用尽可能最快的安全方法。使用fsync()的缺点是操作系统至少会在自己的缓存中缓冲一些苏剧。理论上,这种双重缓冲是浪费的,因为InnoDB管理自己的缓冲比操作系统能做的更加智能。然而,最后的影响跟操作系统和文件系统非常相关。如果能让文件系统做更智能的IO调度和批量操作,双重缓冲可能并不是坏事。有的文件系统和操作系统可以积累写操作后合并执行,通过对IO重新排序来提升效率,或者并发写入多个设备。它们也可能做预读优化,例如,若连续请求了几个顺序的块,它会通知硬盘预读下一个块。有时这些优化有帮助,有时没有。如果你好奇你的系统中的fsync()会做哪些具体的事,可以阅读系统的帮助手册,看下fsync(2).innodb_file_per_table选项会导致每个文件独立地做fsync(),这意味着些多个表不能合并到一个IO操作。这可能导致InnoDB执行更多的fsync()操作
  • 2.0_DIRECT
    InnoDB对数据文件使用0_DIRECT标记或directio()函数,这依赖于操作系统。这个设置并不影响文件并且不是在所有的类UNIX系统上都有效。但至少GNU/Linux、FreeBSD。以及Solaris(5.0以后的新版本)是支持的。不像0_DSYNC标记,它会同时影响读和写。这个设置依然使用fsync()来刷新文件到磁盘,但是会通知操作系统不要缓存数据,也不要使用预读。这个选项完全关闭了操作系统缓存,并且使所有的读和写都直接通过存储设备,避免了双重缓冲。在大部分系统上,这个实现用fcntl()调用来设置文件描述符的0_DIRECT标记,所以可以阅读fcntl(2)的手册页来了解系统上这个函数的细节。在Solaris系统,这个选项用directio().如果RAID卡支持预读,这个设置不会关闭RAID卡的预读。这个设置只能关闭操作系统和文件系统的预读(RAID卡的预读控制必须在RAID卡的设置中调整)。如果使用0_DIRECT选项,通常需要带有写缓存的RAID卡,并且设置为Write-Back策略(就是写入会在RAID卡缓存上进行缓冲,不直接写道硬盘)因为这是典型的唯一能保持好性能的方法。当InnoDB和实际存储设备之间没有缓冲时使用0_DIRECT,例如当RAID卡没有写缓存时,可能导致严重的性能下降。现在有了多个写线程,这个问题稍微小一点(并且MySQL5.5提供了原生异步IO)但是通常还是有问题。这个选项可能导致服务器预热时间变长,特别时草走系统的缓存很大的时候,也可能导致小容量的缓存池(例如,默认大小的缓冲池)比缓冲IO(Buffered IO)方式操作要慢的多。这是因为操作系统不会通过保持更多数据在自己的缓存中来"帮助"提升性能.如果需要的数据不在缓冲池,InnoDB将不得不直接从磁盘读取。这个选项不会对innodb_file_per_table产生任何额外的损失。相反,如果不用innodb_file_per_table,当使用0_DIRECT时,可能由于一些顺序IO而遭受性能损失。这种情况的发生是因为一些文件系统(包括Linux所有的ext文件系统)每个inode有一个Mutex。当在这些文件系统上使用0_DIRECT时,确实需要打开innodb_file_per_table
  • 3.0_DSYNC
    这个选项使用日志文件调用open()函数时设置0_SYNC标记。它使得所有的写同步——换个说法,只有数据写道磁盘后写操作才返回。这个选项不影响数据文件。0_SYNC标记和0_DIRECT标记的不同之处在于0_SYNC没有禁用操作系统层的缓存。因此,它没有避免双重缓冲,并且它没有使写操作直接操作到磁盘。用了0_SYNC标记,在缓存中写数据,然后发送到磁盘。使用0_SYNC标记做同步写操作,听起来可能跟fsync()作得事情非常相似,但是它们两个的实现无论在操作系统层还是在硬件层都非常不同。用了0_SYNC标记后,操作系统可能把"使用同步IO"标记下传给硬件层,告诉设备不要使用缓存,另一方面,fsync()告诉操作系统把修改过的缓冲数据刷写到设备上,如果设备支持,紧接着会传递一个指令给设备刷新它自己的缓存,所以,毫无疑问,数据肯定记录在了物理媒介上。另一个不同是,用了0_SYNC的话,每个write()或pwrite()操作都会在函数完成之前把数据同步到磁盘,完成前函数调用是阻塞的。相对来看,不用0_SYNC标记的写入调用fsync()允许写操作积累在缓存(使得每个写更快),然后一次性刷新所有的数据。再一次吐槽下这个名称,这个选项设置0_SYNC标记,不是0_DSYNC标记,因为InnoDB开发者发现了0_DSYNC的Bug。0_SYNC和0_DSYNC类似于fsync()和fdatasync(),0_SYNC同时同步数据和元数据,但是0_DSYNC只同步数据。
  • 4.async_unbuffered
    这是Windows下的默认值。这个选项让InnoDB对大部分写使用没有缓冲的IO;例外是当innodb_flush_log_at_trx_commit设置为2的时候,对日志文件使用缓冲IO。这个选项使得InnoDB在Windows 2000 、XP,以及更新版本中对数据读写都是用操作系统的原生(重叠的)IO.在更老的Windows版本哪种,InnoDB使用自己用多线程模拟的异步IO
  • 5.unbuffered
    只对Windows有效。这个选项于async_unbuffered类似,但是不适用原生异步IO
  • 6.normal
    只对Windows有效。这个选项让InnoDB不要使用原生异步IO或者无缓冲IO
  • 7.Nosync和littersync
    只为开发使用。这个两个选项在文档中没有并且对生产环境来说不安全,不应该使用这个。

如果这些看起来像是一堆不带建议的说明,那么下面是一些建议:如果使用类UNIX操作系统并且RAID控制器带有电池保护的写缓存,建议使用0_DIRECT。如果不是这样,默认值或者0_DIRECT都可能是最好的选择

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中的正排/倒排索引和DoubleWriteBuffer

正排/倒排索引 正排索引 文档1:词条A,词条B,词条C 文档2:词条A,词条D 文档3:词条B,词条C,词条E正排表是以文档的ID为关键字,表中记录文档中的每个字的位置信息&#xff…

人事信息管理系统(Java+MySQL)

一、项目背景 在现代企业中,管理大量员工的工作信息、薪资、请假、离职等事务是一项非常繁琐和复杂的任务。传统的手工管理方式不仅效率低下,而且容易出错。为了提高人事管理的效率,减少人工操作带来的错误,企业迫切需要一个高效…

怎样收集企业名单?

收集企业名单的方法按照不同维度有不同的方式, 通过人工一个个收集,通过技术手段收集,通过第三方进行购买。 按照来源渠道,可以分为官方和非官方网站,官方的有公示系统,年报等。此外一些相对于官方的平台…

论文阅读笔记:DepGraph: Towards Any Structural Pruning

论文阅读笔记:DepGraph: Towards Any Structural Pruning 1 背景2 创新点3 方法4 模块4.1 分组4.2 依赖图4.3 网络分解4.4 依赖建模4.4 组级剪枝 5 效果 论文:https://arxiv.org/pdf/2301.12900 代码:https://github.com/VainF/Torch-Prunin…

Anaconda环境安装失败的解决方案

链接步骤的补充。 为了运行marlib,需要一个全新的Anaconda环境。但是,不想把文件安装在C盘,会造成空间不足。于是试着在.condarc文件里面改动了路径,具体如图。 上图中,在defaults前面添加了D盘的路径作为安装路径。 …

docker环境中配置phpstorm php xdebug调试工具

本文介绍通过docker compose的使用方式 第一步:在php镜像中安装phpxdebug扩展,比如php7.4对应的是xdebug3.1.6 第二步:设置项目中的docker-compose.yml docker-compose 增加开启xdebug的环境变量,host.docker.internal是宿主机的地址&#…

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…

利用flask + pymysql监测数据同步中的数据是否完整

一、背景 最近项目搞重构,将原有的系统拆分成了多个子系统。但是有数据表需要在不同系统中数据,同时为了解决项目性能最了一个很简单的方案,就是公共数据存在每个系统之中。 二、分析 分析这些表,这些表相比源数据表,表…

网络编程之XDP和TC

一、TC之于XDP 在前面分析过XDP,今天简单分析一下与其相关的TC,即traffic control,流量控制。在分析XDP时知道其只能用于ingress方向触发,而TC却可以在两个方向即ingress和egress方向触发。也可以简单理解成它可以同时钩住进出两个方向的数据…

Aivis:AI声音模仿系统的创新之旅

在人工智能技术的不断进步中,声音合成技术也迎来了新的发展机遇。Aivis项目正是这一领域的杰出代表,它提供了一个全流程的工具,让用户能够从数据集的创建到学习再到推理,一站式地生成逼真的语音。 Aivis是一个基于Bert-VITS2模型的…

一键取票,YonSuite商旅费控助力企业“消灭报销”

在数字化与智能化并行的时代,企业商旅管理正经历着前所未有的变革。面对传统商旅出行管理中流程复杂、费用不透明等问题,YonSuite商旅费控以其独特的数智化商旅管理平台,为企业提供了一站式的解决方案,特别是其“一键取票”功能&a…

【博客718】时序数据库基石:LSM Tree(log-structured merge-tree)

时序数据库基石:LSM Tree(log-structured merge-tree) 1、为什么需要LSM Tree LSM被设计来提供比传统的B树更好的写操作吞吐量,通过消去随机的本地更新操作来达到这个目标,使得写入都是顺序写,而不是随机写。 那么为什么这是一个…

怎么图片转excel表格?推荐三个方法

怎么图片转excel表格?在信息化高速发展的今天,图片转Excel表格的需求日益凸显,尤其是在职场办公中,这一需求更是显得尤为迫切。为了满足广大用户的需求,市面上涌现出了众多图片转Excel的软件。今天,就为大家…

周五美国股市总结,标普止步四日连涨,纳指五日连创新高,法股单周跌幅两年多最深

美国消费者信心意外下滑至七个月新低,通胀预期反弹,标普大盘脱离历史最高,道指连跌四日,罗素小盘股跌至六周新低,有分析称对经济担忧浮现。全周标普和纳指分别累涨1.6%和3.2%,都是八周里第七周上涨&#xf…

基于SpringBoot+Vue高校自习室预约系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

Navicat和SQLynx产品功能比较一(整体比较)

Navicat和SQLynx都是数据库管理工具,在过去的二十年中,国内用户主要是使用Navicat偏多,一般是个人简单开发需要,数据量一般不大,开发相对简单。SQLynx是最近几年的数据库管理工具,Web开发,桌面版…

P450Rdb: CYP450数据库--地表最强系列--文献精读24

P450Rdb: A manually curated database of reactions catalyzed by cytochrome P450 enzymes P450Rdb: 一个人工整理的细胞色素P450酶催化反应数据库 http://www.cellknowledge.com.cn/p450rdb/ 还有一篇类似CYP450综述-20年-地表最强系列-文献精读-4 要点: P450…

【服务器硬件由 CPU、RAM、硬盘等组成,选购时需考虑应用需求、预算等。散热、安全、监控与维护亦重要,未来发展趋势包括高性能、低能耗和智能化。】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

TypeScript写好了,怎么运行啊!!!

环境搭建 Vs code Ctrlshiftp打开首选项—》打开工作区设置—》搜索Typescript 推荐开启的配置项主要是这几个: Function Like Return Types,显示推导得到的函数返回值类型;Parameter Names,显示函数入参的名称;Par…