binlog写盘状态.png

一、binlog的写入机制

binlog写入逻辑:

事务执行过程中、先写日志导binlog cache、事务提交时、再把binlog cache写入到binlog文件中.

一个事务的binlog不能被拆开、因此不论事务有多大、也要确保一次性写入. 系统给binlog cache每个线程分配一片内存(binlog_cache_size大小), 超过会先暂存到磁盘.

事务提交时、执行器会把binlog cache里的完整事务写入binlog、清空binlog cache.

每个线程有自己的binlog cache、但共用binlog文件.

事务提交、先写入到文件系统的page cache(write), 然后调用fsync写入磁盘(占用IOPS)

write和fsync的时机:

sync_binlog=0, 每次事务提交只write、不fsync

sync_binlog=1, 每次事务提交都执行fsync

sync_binlog=N, 每次事务提交都write、累积N个事务才fsync

所以、在出现IO瓶颈的场景里、可以将sync_binlog设置为一个比较大的值、可以提升性能.

风险: 若主机异常重启、会丢失最近N个事务的binlog.

二、redo log的写入机制

事务执行过程中会先写redo log buffer, 然后才写redo log

redo log存储状态.png

从redo log的三种状态说起:

存在redo log buffer中、物理上是在 mysql 进程内存中.

写到磁盘write、但未持久化fsync、物理上是在文件系统的Page Cache中

持久化到磁盘

1、2的过程都很快、但3的速度就慢很多了. InnoDB提供了三种策略, 通过 innodb_flush_log_at_trx_commit参数控制:

0, 表示每次事务提交只把redo log留在redo log buffer中

1, 表示每次事务提交都将redo log直接持久化到磁盘

2, 表示每次事务提交都把redo log写到Page Cache.

InnoDB 有一个后台线程、每隔1s、会把redo log buffer中的日志调用write写到FS Pae Cache、然后调用 fsync 持久化到磁盘.

注意: 事务执行过程中的redo log也是在buffer中、可能会被后台线程一起持久化到磁盘

还有两种场景会将一个未提交的事务redo log写入磁盘:

redo log buffer占用的空间即将达到innodb_log_buffer_size 一半的时候、后台线程会主动写盘. (此时事务未提交、只是write、并未fsync, 即: 只留在FS Page Cache)

并行事务提交时, 顺带将该事务的 redo log buffer持久化到磁盘、eg. Trx A执行到一半、Trx B要把buffer数据写入磁盘、会顺带把Trx A的日志一起持久化到磁盘

注意: 若将 innodb_flush_log_at_trx_commit 设为1, redo log在prepare阶段就要持久化一次、因为有一个崩溃恢复依赖于prepare的redo log + binlog.

通常说的双1配置、是redo log 和binlog的刷盘机制都设为1, 即: 一个事务完整提交前、需要等待两次刷盘: redo log(prepare阶段) 和 binlog

思考: TPS 2w/s 的话、写盘就是 4w/s, 但磁盘能力只有2w/s, 是怎么实现的呢 ?

组提交: 三个并发事务trx1, trx2, trx3, 对应LSN(日志逻辑序列化、单调递增)分别为:50, 120, 160, trx1写盘时、这组(trx1->3)已经有3个事务、LSN也变成了160, 去写盘时、带的LSN=160, 等trx1返回时、所有LSN<160的redo log都已持久化到磁盘, trx2,trx3可直接返回.

两阶段提交细化.png

在并发更新场景下、第一个事务写完 redo log buffer、调用fsync越晚、组员越多、节约IOPS效果越好.

binlog的write 和 fsync的时间间隔短、组提交优化不如redo log.

可以通过设置以下参数来提升效果:

binlog_group_commit_sync_delay, 延迟x 微秒后才调用fsync

binlog_group_commit_sync_no_delay_count, 累积x次以后调用fsync

二者满足其一就调用 fsync

另: 不建议设置 innodb_flush_log_at_trx_commit=0, 因为这样redo log只保存在内存中、MySQL异常重启会丢失数据、风险太大. 而redo log写到 FS Page Cache的速度也是很快的、不会损失很多性能, 可以保证异常重启不丢数据、风险小很多.

mysql如何保证数据不丢失_Mysql 是怎么保证数据不丢的相关推荐

  1. mysql数据库导入后莫名丢失_MySQL数据库导入或者同步大量数据时数据丢失解决方案...

    相信大家都经常遇到这样的情况,我们在编码的过程中经常需要在调试代码的时候切换到本地的数据库上做修改调试,如果当测试数据库的数据在几十万或者上百万数据的时候,我们无论是通过恢复备份/导入SQL的方式来把 ...

  2. mysql 先删后增 更新_MySQL 高级操作——新增数据、更新数据、删除数据、查询数据...

    新增数据 多数据插入 只要写一次insert指令,但是可以插入多条记录 语法:insert into 表名 [(字段列表)] values (值列表1),(值列表2),(值列表3); 主键冲突 主键冲 ...

  3. php 重定向数据不丢失,PHP重定向如何实现数据不丢失?

    PHP重定向如何实现数据不丢失? 首先获取要保存的数据:$data = [ 'username' => 'guanhuicoder', 'redirect_url' => './index ...

  4. mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决

    问题: 直接拷贝data下的数据库数据进行备份,重装升级了数据库,直接复制备份数据到新的数据库data目录下,发现部分数据表不见了. 原因分析: 以表"Table"为例: 如类型是 ...

  5. mysql数据刷盘_MySQL延迟问题和数据刷盘策略

    一. MySQL 复制流程 官方文档流程图如下: 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.MySQL延迟问题分析 1.主库 ...

  6. mysql统计数据的代码_MySQL按时间统计数据的方法介绍(代码示例)

    本篇文章给大家带来的内容是关于MySQL按时间统计数据的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做数据库的统计时,经常会需要根据年.月.日来统计数据,然 ...

  7. mysql数据异常增长_mysql表到一定数据量后会异常的增长

    如题 InnoDB的table,里面的字段非常简单,如图中的类型 才100多W的数据量,数据是慢慢积累起来的,到了最近发现涨到12G后,会每天成倍的增长,最高到达过50G,而数据量还是那些,longt ...

  8. mysql日志恢复的时间格式_mysql binlog 日志恢复数据

    首先:开启binlog日志 server-id=1 log-bin=mysql-bin binlog_format=MIXED binlog_format有三种格式: 1)只有sql语句STATEME ...

  9. mysql上面waring删掉吗_MySQL经典练习题:数据插入,更新,删除

    1. 创建数据表P_list(误将death设置成了not null) mysql> create table P_list -> (name varchar(20) not null, ...

最新文章

  1. Flex 布局详解 - 转自阮一峰老师
  2. c语言作业 龟兔赛跑,c语言龟兔赛跑
  3. Oracle 学习笔记:Backup Recovery 常用命令
  4. exists的用法 python_5 年 Python ,总结的 10 条 Python 使用技巧
  5. 择天记手游的服务器维护世界,3月8日停服更新公告
  6. platform总线的probe函数调用
  7. python中numpy模块的around方法_Python numpy.around()用法及代码示例
  8. 这个天气怎么就这么热啊,哪里还有心情写代码呀。
  9. php 判断用户是否刷新,如何在php和ajax中创建一个注册页面,它会在不刷新页面的情况下检查某个用户名是否已经存在? - php...
  10. PAT乙级(1013 数素数)
  11. C++之指针探究(十四):回调函数
  12. sqlalchemy用in_ 批量delete
  13. Java:类与对象概念
  14. 数字化建筑与数字化建造,数字化建筑设计与建造
  15. NC65与蓝凌OA审批集成
  16. 光之盟:从ONA的握手,解锁全光网产业未来
  17. 11. 文件操作与模块
  18. 对抗样本论文阅读Intriguing properties of neural networks
  19. 机器人运动学---雅克比矩阵伪逆
  20. 北京交通大学本科毕业论文答辩PPT模板

热门文章

  1. The table ‘xxxx‘ is full
  2. 王者荣耀苹果游客服务器信号,王者荣耀游客号怎么转移 苹果游客号怎么转移到微信...
  3. 实现用户登录权限验证
  4. Face Paper: 目标检测RSSD论文详解
  5. java8 无限流_Java8-无限流
  6. 视频教程-2019视频营销实战教程-网络营销
  7. 观点 | 关于元宇宙的21个真相
  8. visual studio code无法生成可执行文件
  9. css flex布局网页小游戏
  10. DB2快速入门—DB2 11的安装与使用