//buf0dblwr.cc
/*
*这个算是双写缓冲区与外部交互的接口了
*/
dberr_t dblwr::write(buf_flush_t flush_type, buf_page_t *bpage,bool sync) noexcept {dberr_t err;/* 对于只读的,或者临时表空间数据,或者禁用双写缓冲区,或者双写缓冲区的实例配置为空的,跳过写double-wirte文件,直接将数据写入对应的数据文件if (srv_read_only_mode || fsp_is_system_temporary(bpage->id.space()) ||!dblwr::enabled || Double_write::s_instances == nullptr) {/* Disable use of double-write buffer for temporary tablespace.Temporary tablespaces are never recovered, therefore we don'tcare about torn writes. */err = Double_write::write_to_datafile(bpage, sync);if (err == DB_SUCCESS && sync) {fil_flush(bpage->id.space());/* true means we want to evict this page from the LRU list as well. */buf_page_io_complete(bpage, true);}} else {
/*
*  如果数据异步写入且不是来自单页flush list,则先写入doublewrite buffer,doublewrite buffer使用了最少4个,
*  最大池数量*2的instance。在这里确定一个instance,将page提交的instance,instance中使用了两个数组,
*  m_buffer和m_buf_pages,其中m_buffer保存了经过对其的数据块内容的copy,m_buf_pages保存输入进来的page。
*  如果在保存的时候,对应instance的数组满了,那么会进行flush到磁盘的操作。doublewrite 将双写文件划分为了
*  一个一个的segment,写入的时候,一次写一个segment。segment有batchsegment和单segment之分,batchsegment
*  一次写入一批pages,单segment一次写入一个page。这里通过batchsegment将instance其中的pages通过一次io,使用
*  同步io的方式写入双写缓冲区文件。双写缓冲区文件写入完成后,会接着通过write_to_datafile函数,一个一个page的
*  写入对应的数据文件,此时是异步io。
*/ut_d(auto page_id = bpage->id);if (!sync && flush_type != BUF_FLUSH_SINGLE_PAGE) {MONITOR_INC(MONITOR_DBLWR_ASYNC_REQUESTS);Double_write::submit(flush_type, bpage);err = DB_SUCCESS;
#ifdef UNIV_DEBUGif (dblwr::Force_crash.equals_to(page_id)) {force_flush(flush_type, buf_pool_index(buf_pool_from_bpage(bpage)));}
#endif /* UNIV_DEBUG */} else {
/*
* 如果上面的条件不满足,这里会通过single_write将page写入双写缓冲区文件后,
* 再通过write_to_datafile使用同步io的方式将数据写入data文件。
*/MONITOR_INC(MONITOR_DBLWR_SYNC_REQUESTS);bpage->set_dblwr_batch_id(std::numeric_limits<uint16_t>::max());err = Double_write::sync_page_flush(bpage);}}return err;
}

mysql innodb 双写缓冲区关键代码实现相关推荐

  1. InnoDB双写缓冲

    先简单解释下什么是双写缓冲.InnoDB使用了一种叫做doublewrite的特殊文件flush技术,在把pages写到date files之前,InnoDB先把它们写到一个叫doublewrite ...

  2. mysql改表字段类型导致数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题【转】...

    一.问题起源 不久前用户反馈部门的 MySQL 数据库发生了数据更新丢失.为了解决这个问题,当时对用户使用的场景进行了分析.发现可能是因为用户在两台互为主从的机器上都进行了写入导致的数据丢失. 如图所 ...

  3. 数据库周刊62丨央企2021年数据库成交公告,国产占90%;流数据库HStreamDB开源;MySQL主从双写导致数据丢失;Oracle 19c升级最佳实践;PG日常工作分享;MySQL MGR运维指

    热门资讯 [1.中央国家机关2021年数据库成交公告:国产数据库份额占90% [摘要]据央采网3月19日发布的<中央国家机关2021年数据库软件协议供货采购项目成交公告>显示事务型数据库管 ...

  4. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

    0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所 ...

  5. sql text转image_[转]故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题

    作者:戴骏贤 网易游戏 技术部资深数据库系统工程师. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.问题起源 不久前用户反馈部门的 MySQL ...

  6. mysql主从数据丢失_故障分析 | 记一次 MySQL 主从双写导致的数据丢失问题

    作者:戴骏贤 网易游戏 技术部资深数据库系统工程师. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1. 问题起源 不久前用户反馈部门的 MySQ ...

  7. mysql双写是什么意思_MYSQL双写和块裂

    什么时块裂呢? 这就涉及到OS(操作系统)的原子写的大小,一般情况下OS原子写是4K,硬盘一个扇区是512字节,4K需要写8个扇区. 假如写了4个扇区发生了断电,或者其他的意外,那么不就是丢失了另外4 ...

  8. 针对 MySQL/InnoDB 刷盘调优

    原文 https://www.percona.com/blog/2020/05/14/tuning-mysql-innodb-flushing-for-a-write-intensive-worklo ...

  9. 面试官: Redis 与 MySQL 双写一致性如何保证?

    前言 四月份的时候,有位好朋友去美团面试.他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题. ...

最新文章

  1. ==和equals()的作用及区别
  2. 【教程】Matrikon OPC使用教程连载(四)
  3. 黄聪:第2章 并发操作的一致性问题 (2)
  4. 企业数据中心夏季冷却散热的十二大技巧
  5. struts2中一个表单中提交多个请求(动态调用方法)
  6. go给Linux安装mysql_在Linux上安装Go语言开发包
  7. 雷赛运动控制卡能不能用c语言_基于PMAC控制卡的三坐标测量机控制系统
  8. python求50的阶乘_python中求阶乘
  9. opencv掩膜操作
  10. 总结一下切换git地址 重合代码的过程
  11. pandas dataframe column_数据处理的瑞士军刀pandas | 火星技术帖
  12. Unicode编码表
  13. php1008打印机驱动器,hp laserjet p1008打印机驱动
  14. 60、在Visual Studio 2019 环境下,使用C#调用C++生成的dll实现yolov5的图片检测
  15. STC单片机使用RS485下载程序方法
  16. ​Android实现仿QQ登录可编辑下拉菜单
  17. js 对象解构 默认值 重命名
  18. 为什么魂斗罗只有 128KB 却可以实现那么长的剧情?
  19. 植物大战僵尸音乐计算机简谱,植物大战僵尸(主题音乐)钢琴谱
  20. matlab的讲稿ppt,Matlab初步(讲稿200508)之一_Matlab讲解_doc_大学课件预览_高等教育资讯网...

热门文章

  1. Cisco PT模拟实验(1) 交换机的基本配置与管理
  2. 旅游(travel)
  3. 哈工大ltp——python版的部署方法
  4. leaflet和leaflet.pm的使用
  5. 地址总线,字长,内存容量,与寻址空间
  6. 河南计算机教师资格证,2016河南教师资格证考试笔试备考:《信息技术学科知识与教学能力》(...
  7. 数据分析—用户行为分析
  8. SpringMVC汇总
  9. Linux 查看打开的网络端口
  10. 「 Flutter 项目实战 」设计企业级项目入口 main.dart 设计与实现 ( GSYGithubApp 源码解读·二 )