1222是什么星座| 崩漏下血是什么意思| 翡翠什么样的好| 对口高考班是什么意思| 97属什么生肖| 月经黑色的是什么原因| 事急从权是什么意思| 急性阑尾炎什么症状| 倾诉是什么意思| 感冒了挂什么科| 睡觉中途总醒什么原因| 近视是什么原因造成的| 莞字五行属什么| 坎坷是什么意思| 芥末黄是什么颜色| sb是什么元素符号| 肾功能不好吃什么药| 小孩子流鼻血是什么原因引起的| 50分贝相当于什么声音| 什么时候立冬| 乘务员是干什么的| 皮肤挂什么科| 山人是什么意思| 香港电话前面加什么| 破窗效应是什么意思| 老人不睡觉是什么预兆| 太阳为什么能一直燃烧| 颈椎病看什么科| ubc是什么意思| 防小人应该佩戴什么| 梭织是什么意思| 无可厚非什么意思| 怀孕期间吃什么对胎儿发育好| esp是什么意思| 棺材用什么木材做最好| 漏斗胸为什么长不胖| 姝字五行属什么| 滑膜炎是什么病| 585是什么金| 富贵包去医院挂什么科| 谷氨酰转移酶高是什么病| 孕妇应该吃什么蔬菜| ect是什么意思| 拔罐对身体有什么好处和坏处| 月经下不来吃什么药| 什么地听| 脾胃不好可以吃什么水果| 人总放屁是什么原因| 湿疹可以吃什么药| 湖南有什么特产| 细菌感染引起的发烧吃什么药| 经常便秘吃什么| 颞下颌关节紊乱吃什么药| 月经量少要吃什么调理| 维生素b12高是什么原因| 12月22日什么星座| 怀璧其罪是什么意思| 突然手发抖是什么原因| acer是什么牌子的电脑| 甲亢吃什么药好| 火镰是什么意思| 女人为什么要少吃鳝鱼| 富不过三代是什么意思| 中暑喝什么| 心脏由什么组织构成| 脑白质病变是什么意思| 0r是什么意思| 下午6点半是什么时辰| 生长激素分泌的高峰期是什么时候| 排卵期过后是什么期| 成字五行属什么| o型b型生的孩子是什么血型| 理疗是什么| 沐五行属性是什么| 月经下不来吃什么药| En什么意思| bnp是什么意思| 鼻咽炎吃什么药| 多发息肉是什么意思| 掉头发是什么原因| 孤是什么意思| 牛油果坏了是什么样| 血脂高挂什么科| 女性阴部痒是什么原因| 五十知天命是什么意思| 果是什么结构的字| 尿酸高吃什么| 米醋和白醋有什么区别| 电气火灾用什么灭火| cd3cd4cd8都代表什么| 八字七杀是什么意思| 割礼是什么| 君子兰什么季节开花| 比熊吃什么牌子狗粮好| 恨嫁什么意思| 传导阻滞吃什么药| 卿字五行属什么| 榆字五行属什么| 七夕节的含义是什么| 缗什么意思| b型血阳性是什么意思| 什么样的人容易得脑梗| 紧张性头痛吃什么药| 性质是什么| 后脚跟疼是什么原因| 什么咖啡最好| 做试管前需要检查什么项目| 考药师证需要什么条件| 旗袍穿什么鞋子好看图| 橘黄色是什么颜色| 芨芨草长什么样图片| 没有什么了不起| 阴蒂痒是什么原因| 淋巴细胞数高说明什么| 天外有天人外有人是什么意思| 红楼梦贾家为什么被抄家| 唐僧属什么生肖| 儿童过敏吃什么药| 元气大伤什么意思| 马凡氏综合症是什么病| 脚踝扭伤挂什么科| 阴对什么| mdr是什么意思| 外伤用什么消炎药| 宇宙是什么意思| 腱鞘炎要挂什么科| 流感吃什么药| 官鬼是什么意思| 上天眷顾是什么意思| 左肾结晶是什么意思| 形同陌路是什么意思| 脑白质脱髓鞘吃什么药| 吃完就拉是什么原因| 嘴角起痘是什么原因| maybach是什么车| 口渴喝什么最解渴| 无痛人流和普通人流有什么区别| 汗疱疹用什么药好| 木冉读什么| 什么东西在倒立之后会增加一半| 什么是复利| 鹅喜欢吃什么草| 靠腰是什么意思| 血浓稠是什么原因引起的| 述求是什么意思| 肛门胀痛什么原因| 生理期喝什么| 毛峰茶属于什么茶| 司马懿字什么| 大便有酸味是什么原因| 蜘蛛吃什么食物| 皮肤癣是什么原因造成的| 不速之客的速是什么意思| 朱砂有什么作用与功效| 胆囊炎需要注意什么| 什么人容易得焦虑症| 芥末油是什么提炼出来的| 收口是什么意思| 吊客是什么意思| 蛞蝓是什么意思| 地球是什么星| 欧代是什么| 外阴炎用什么药膏| 蹂躏是什么意思| galaxy是什么牌子| 牛不吃草是什么原因| 真维斯属于什么档次| 女人性冷淡吃什么药效果好| 小孩子发烧是什么原因引起的| 什么是口爆| 罗贯中和施耐庵是什么关系| 什么是民间故事| 什么是天葬| 绿豆和什么相克| 嫂嫂是什么意思| 浮躁的意思是什么| 知了在树上干什么| 什么叫粳米| 白薯是什么| 甲基是什么| 亮丽是什么意思| 四季春茶属于什么茶| 嗜酸性气道炎症是什么意思| 刺猬爱吃什么| 自食其力是什么意思| 为什么大便会拉出血| 咋啦是什么意思| 南什么北什么的成语| 玉屏风颗粒治什么病| 间歇性跛行是什么意思| 来例假腰疼是什么原因| 慢阻肺是什么意思| 腮腺炎输液用什么药| 脚底有黑痣有什么说法| 三伏天什么意思| 清洁度1度是什么意思| 物欲横流什么意思| 半夜腿抽筋是什么原因| 黄褐斑内调吃什么中药| 长期吃阿司匹林有什么副作用| 义字少一点念什么| 骨外科是看什么病的| 骞是什么意思| 雪白的什么| 大脖子病有什么症状| 王林为什么叫王麻子| 曲奇饼干为什么不成形| 蚯蚓是什么动物| 背水一战是什么意思| 负离子什么意思| 520是什么节日| fvc是什么意思| 胸口长痘痘是什么原因| 桑树枝煮水有什么功效| 睡觉手麻是什么原因引起的女人| 黔驴技穷的意思是什么| 看脖子挂什么科| 覆水难收是什么意思| 来大姨妈可以吃什么水果| 以至于是什么意思| 北京市长属于什么级别| 肠胃炎能吃什么水果| 心影饱满是什么意思| 敛是什么意思| hr是什么职业| 相识是什么意思| 色散是什么意思| 尊字五行属什么| 牛肚是什么| 群众路线是什么| 心跳加快是什么病| 晕车药吃多了有什么副作用| 了了什么意思| 拍身份证照片穿什么衣服| 返现是什么意思| 血脂高有什么症状| 三月五号是什么星座| 脚踝扭伤挂什么科| 三高不能吃什么食物| 活珠子是什么| 阴虱用什么药物| 荨麻疹什么原因引起的| 什么叫辟谷减肥法| 防晒衣什么颜色最防晒| 疑神疑鬼是什么意思| 32年婚姻是什么婚| acc是什么意思| 一什么眼睛| 贫血去医院挂什么科| 肝脏检查挂什么科| 典韦字什么| 什么是白内障| 白细胞异常是什么原因| 什么是子宫憩室| secret什么意思| 谍影重重4为什么换主角| 心脏早搏是什么原因造成的| 毛孔粗大用什么洗面奶好| 失眠去医院挂什么科| 斗志昂扬是什么意思| 心神不宁是什么意思| 取是什么意思| 胃穿孔是什么原因引起的| 樱桃有什么营养价值| 百度

MySQL 23 MySQL是怎么保证数据不丢的?

百度 按照这两个数据来看,这两个重点区域在最近五年降幅当中,人努力占了80%以上,而天帮忙在20%以下。

只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。本文讲讲MySQL写入binlog和redo log的流程。

binlog的写入机制

binlog的写入逻辑比较简单:事务在执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件。

一个事务的binlog不能拆开,因此不论这个事务多大,也要确保一次性写入,这涉及到binlog cache的保存问题。系统给binlog cache分配了一片内存,每个线程一个,参数binlog_cache_size用于控制单个线程内binlog cache所占内存大小,如果超过参数大小,就要暂存到磁盘。

事务提交时,执行器把binlog cache里的完整事务写入binlog并清空binlog cache。

上图中:

  • write指的是把日志写入到文件系统的page cache,速度较快;

  • fsync指的是把数据持久化到磁盘。

write和fsync的时机,由参数sync_binlog控制:

  • sync_binlog=0,表示每次提交事务都只write,不fsync;

  • sync_binlog=1,表示每次提交事务都会fsync;

  • sync_binlog=N>1,表示每次提交事务都write,但累积N个事务后才fsync。

因此,在IO瓶颈的场景里,一般将参数设置为较大的值。在实际业务场景中,考虑到丢失日志量的可控性,比较常见的设置为100-1000中的某个数值。其风险是如果主机发生异常重启,会丢失最近N个事务的binlog日志。

redo log的写入机制

事务在执行过程中,生成的redo log先写到redo log buffer。redo log buffer里的内容,不需要每次生成后都直接持久化到磁盘,但也有可能在事务还没提交的时候被持久化到磁盘。

这个问题,需要从redo log可能存在的三种状态说起:

三种状态为:

  • 存在redo log buffer,物理上是在MySQL进程内存,即图中红色;

  • 写到磁盘,但是没有持久化(fsync),物理上是在文件系统的page cache,即图中黄色;

  • 持久化到磁盘,对应的是hard disk,即图中绿色。

日志写到redo log buffer,write到page cache都很快,但持久化到磁盘的速度会慢很多。

为了控制redo log的写入策略,InnoDB提供innodb_flush_log_at_trx_commit参数:

  • 设置为0,表示每次事务提交时都只是把redo log留在redo log buffer中;

  • 设置为1,表示每次事务提交时都将redo log持久化到磁盘;

  • 设置为2,表示每次事务提交时都只是把redo log写到page cache。

InnoDB有一个后台线程,每隔一秒会把redo log buffer中的日志调用write写到文件系统的page cache,然后调用fsync持久化到磁盘。

事务执行中间过程的redo log也是直接写在redo log buffer中,这些redo log也会被后台线程一起持久化到磁盘,因此一个没有提交的事务的redo log也有可能已经被持久化到磁盘。

除了后台线程每秒一次的轮询操作外,还有两种场景会让一个没有提交的事务的redo log写入到磁盘:

  • redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动写盘。这个写盘动作只是write,而没有调用fsync;

  • 并行的事务提交的时候,顺带将这个事务的redo log buffer持久化到磁盘。假设一个事务A执行到一半,已经写了一些redo log到buffer,这时另一个线程的事务B提交,如果innodb_flush_log_at_trx_commit=1,那么事务B要把redo log buffer里的日志全部持久化到磁盘,这时会带上事务A在redo log buffer里的日志一起持久化。

两阶段提交的时序是redo log先prepare,再写binlog,最后再把redo log commit。如果innodb_flush_log_at_trx_commit=1,那么redo log在prepare阶段就要持久化一次,因为有一个崩溃恢复逻辑依赖prepare的redo log+binlog。每秒一次后台轮询加上崩溃恢复这个逻辑,InnoDB会认为redo log在commit时不需要fsync了,只会write到文件系统的page cache。

通常说MySQL的双1配置,指的就是sync_binlog和innodb_flush_log_at_trx_commit都设置为1,即一个事务完整提交前,需要等待两次刷盘,一次是redo log prepare,一次是binlog。

这时,可能有一个疑问,这意味着从MySQL看到的TPS是每秒两万的话,每秒就会写四万次磁盘,但磁盘能力也就两万左右,怎么实现两万的TPS。

解释该问题需要用到组提交机制。先介绍日志逻辑序列化(LSN)的概念。LSN是单调递增的,用来对应redo log的一个个写入点,每次写入长度为length的redo log,LSN的值就会加上length。LSN也会写到InnoDB数据页,来确保数据页不会被多次执行重复的redo log。

下图是三个并发事务在prepare阶段,都写完redo log buffer持久化到磁盘的过程,对应的LSN分别是50、120和160:

解释该过程:

  • trx1第一个到达,会被选为这个组的leader;

  • 当trx1要开始写盘,组里有三个事务,此时LSN变为160;

  • trx1去写盘时,带的是LSN=160,等trx1返回,所有LSN小于等于160的redo log都已经被持久化到磁盘;

  • 此时trx2和trx3可以直接返回了。

所以一次组提交里,组员越多,节约磁盘IOPS的效果越好。在并发更新场景下,第一个事务写完redo log buffer后,接下来fsync越晚调用,组员可能越多,节约IOPS的效果就越好。

而为了让一次fsync带的组员更多,MySQL也有优化。在两阶段提交的过程,如果将binlog拆分,可以分为write和fsync,整个两阶段提交过程实际上为:

如上,MySQL调整了时间步骤,这样使得binlog也可以组提交,在执行第4步时,如果有多个事务的binlog已经写完,也是一起持久化的,这样也减少了IOPS的消耗。

不过通常第3步很快,所以第2步和第4步间隔很短,导致能集合到一起持久化的binlog比较少,因此binlog组提交效果通常不如redo log。如果想提升binlog组提交效果,可以设置两个参数:

  • binlog_group_commit_sync_delay:表示延迟多少微秒后才调用fsync;

  • binlog_group_commit_sync_no_delay_count:表示累积多少次后才调用fsync。

这里可以总结,WAL机制主要得益于两方面:

  • redo log和binlog都是顺序写,比随机写速度要快;

  • 组提交机制大幅降低磁盘的IOPS消耗。

最后再回答一下,如果MySQL出现了IO方面的性能瓶颈,该怎么去提升性能:

  • 设置binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count参数,减少binlog的写盘次数;

  • 将sync_binlog设置成大于1,风险是主机掉电时会丢binlog日志;

  • 将innodb_flush_log_at_trx_commit设为2,风险是主机掉电会丢数据。

posted @ 2025-08-04 09:12  叁沐  阅读(115)  评论(0)    收藏  举报
//雪花飘落效果
小孩子晚上睡觉磨牙是什么原因 扁桃体发炎喉咙痛吃什么药 白羊和什么星座最配 为什么叫基围虾 藏青色是什么颜色
nicole是什么意思 肚子胀挂什么科 结膜炎用什么眼药水 为什么会得甲减 肝阴不足吃什么中成药
肝火旺会出现什么症状 颠三倒四是什么意思 尿道口发炎用什么药 胎芽是什么意思 盐酸多西环素片治什么病
慢性扁桃体炎吃什么药 开火上下结构念什么 darker是什么意思 白色代表什么 什么是穴位
中国第一个不平等条约是什么hcv8jop9ns0r.cn 血液透析是什么意思hcv8jop4ns2r.cn 小孩做ct对身体有什么影响hcv8jop5ns2r.cn 吃什么食物养肝护肝hcv8jop3ns2r.cn 情商是什么cj623037.com
吃高血压药有什么副作用hcv9jop4ns2r.cn 无料案内所是什么意思hcv8jop6ns1r.cn 龙胆草长什么样hcv8jop3ns6r.cn 谷草谷丙比值偏高说明什么hcv7jop7ns2r.cn 假正经是什么意思hcv8jop3ns6r.cn
www是什么hcv8jop3ns9r.cn 胡饼是什么hcv9jop5ns3r.cn hiv弱阳性是什么意思hcv9jop8ns0r.cn ca是什么意思sscsqa.com 骨骼肌率是什么意思hcv8jop6ns9r.cn
高足是什么意思hcv9jop5ns7r.cn 二月初十是什么星座hcv8jop2ns6r.cn 肌肉代偿是什么意思hcv9jop2ns3r.cn 心脏疼痛吃什么药hcv9jop2ns9r.cn 曹植是什么生肖hcv8jop1ns4r.cn
百度