JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MYSQL相关

    • MySQL中 InnoDB 和 MylSAM 的区别是什么?
    • 聚簇索引和非聚簇索引有什么区别?
    • 简述 MySQL 常见索引类型,介绍一下覆盖索引
    • 简述Mysql的事务隔离级别
    • 说一下Mysql锁
    • MySQL 为什么使用 B+ 树来作索引,对比 B 树它的优点和缺点是什么
    • 简述乐观锁以及悲观锁的区别以及使用场景
    • 简述脏读和幻读的发生场景,InnoDB 是如何解决幻读的?
    • 简述什么是最左匹配原则
    • MySQL 联合索引底层原理是什么?
    • 产生死锁的必要条件有哪些?如何解决死锁?
    • 简述常见的负载均衡算法
    • 简述 MySQL 的主从同步机制,如果同步失败会怎么样?
    • 如何设计数据库压测方案?
    • 简述数据库中什么情况下进行分库,什么情况下进行分表?
    • 数据库的读写分离的作用是什么?如何实现?
    • 简述 undo log 和 redo log 的作用
      • redo log 的写入机制
      • binlog 的写入机制
      • 组提交机制(group commit)
    • 什么是 SQL 注入攻击?如何防止这类攻击?
    • MySQL 中 join 与 left join 的区别是什么?
    • 简述 MySQL MVCC 的实现原理
    • MySQL 中 varchar 和 char 的区别是什么?
    • 模糊查询是如何实现的?
  • REDIS相关

  • 数据库
  • MYSQL相关
YoungAnn
2022-05-21
目录

简述 undo log 和 redo log 的作用

# binlog和redo log是什么,有什么用

这两个日志都可以用于数据库的备份和恢复,以及主从复制。区别在于

binlog redo log 备注
在sql 层产生 在innoDB存储引擎层产生
记录数据行修改 记录数据页修改
先提交事务,再产生binlog 先产生redo log再提交事务
用于主从复制 在在mysql崩溃时,恢复未提交事务数据

# binlog和redo log写入机制

先说共性,这两个log的写入都要走这个过程: 先写入mysql server的buffer,再写入os buffer,再写入磁盘。 两个buffer之间的写入是内存操作,很快的,耗费io的操作是调用fsync写入磁盘的操作。

# redo log 的写入机制

innodb_flush_log_at_trx_commit的值有三种0、1、2。控制log写入磁盘的频率。 innodb_flush_log_at_trx_commit的值 | 写入策略

-------- | ----- 1 |事务commit后马上将log buffer写入os buffer并且调用fsync写入磁盘 0 | 每秒写入os buffer并立刻调用fsync写入磁盘 2 | commit后立即写入os buffer,然后每秒调用fsync写磁盘

# binlog 的写入机制

每个线程一个binlog缓存,因为binlog写入要求事务的完整性,即一个事务完成才能把事务binlog完整的写入。

sync_binlog的值 写入策略
1 事务commit后马上将log buffer写入os buffer并且调用fsync写入磁盘
0 每秒写入os buffer并立刻调用fsync写入磁盘
N(N>1) commit后立即写入os buffer,积累N个事务调用fsync写磁盘

# 组提交机制(group commit)

双1配置是说将sync_binlog和innodb_flush_log_at_trx_commit都设置为1.那是不是说每次commit都要两次刷盘?但是是否定的。用组提交机制来实现。

如果你想提升 binlog 组提交的效果,可以通过设置binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count实现:

binlog_group_commit_sync_delay binlog_group_commit_sync_no_delay_count
调用多少微妙后再调用fsync 积累多少次后调用fsync

# 应对IO性能瓶颈

如果IO出现性能瓶颈,可以考虑以下三个解决办法

  • 调大binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count,后果是可能增加sql执行时间,但是数据不会丢失。
  • sync_binlog设置大于1的数,风险是,断电后悔丢掉binlog日志
  • innodb_flush_log_at_trx_commit设置为2,风险是,断电后会丢失数据。
编辑 (opens new window)
#binlog#redo log
上次更新: 2022/05/22, 00:01:01
数据库的读写分离的作用是什么?如何实现?
什么是 SQL 注入攻击?如何防止这类攻击?

← 数据库的读写分离的作用是什么?如何实现? 什么是 SQL 注入攻击?如何防止这类攻击?→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式