加入收藏 | 设为首页 | 会员中心 | 我要投稿 天瑞地安资讯网_保定站长网 (https://www.52baoding.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL的redo log 和 binlog 日志

发布时间:2022-09-30 13:00:43 所属栏目:MySql教程 来源:
导读:  MySQL的redo log 和 binlog 日志

  InnoDB引擎的重要日志 redo log(重做日志) 一个是binlog(归档日志) 。

  redo log 日志的作用 当我们修改一条数据时,如果数据在内存中,我们是先会去改内存的
  MySQL的redo log 和 binlog 日志
 
  InnoDB引擎的重要日志 redo log(重做日志) 一个是binlog(归档日志) 。
 
  redo log 日志的作用 当我们修改一条数据时,如果数据在内存中,我们是先会去改内存的,而不是先去改磁盘。假如数据都在内存中,这时候断电了怎么办,服务器宕机怎么办,这个时候就需要我们的redo log了。redo只是记录了对数据的修改,数据会比一页数据小得多。大大减少了IO频率。并且想比于更新操作,更新过程是在磁盘上随机IO,费时。 而写redo log 是在磁盘上顺序IO。效率要高。
 
  数据更新时,MySQL会先写redo log日志,在去写binlog 日志。在写这两个日志过程中会涉及到两阶段提交。他可以保证两个日志逻辑上的一致性。所以即使因为停电,宕机等原因,MySQL也可以通过redo log将数据进行恢复。
 
  区别
 
  redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
 
  binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=10 这一行的 c 字段加 10 ”。
 
  redo log 是循环写的,空间固定会用完;写满后就要去同步磁盘和binlog日志了;而且这时候停止一切写操作;
 
  binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
 
  有了redlog,为什么还要有binglog
 
  一个原因是,redolog只有InnoDB有,别的引擎没有。另一个原因是,redolog是循环写的,不持久保存,
 
  binlog的“归档”这个功能,redolog是不具备的。
 
  缓冲池 buffer pool
 
  参考
 
  是数据库的一个内存组件,缓存了磁盘里的真实的数据,对数据库的增删改操作,就是在这个内存空间里操作的;
 
  缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。
 
  默认是128M,实际可以通过参数 innodb_buffer_pool_size 对 buffer pool进行调整
 
  缓冲池的预读
 
  对磁盘的读取,不是按需读取,而是按页读取,一次至少读取一页时间(4K);
 
  刷脏页
 
  什么是脏页?
 
  内存数据页和磁盘数据不一致,就是脏页,也理解为还未同步到磁盘的内存页;
 
  什么是干净页?
 
  内存数据写入磁盘后,磁盘和内存数据一致,就是干净页;
 
  什么时候会刷脏页?
 
  redo log 日志满了
 
  redo log 的日志是有固定空间大小的,不会一直无限制的增多,总有日志满的时候,这个时候就会进行刷脏页也就是flush 脏页;
 
  这时候mysql会先将内存中的数据更新到磁盘mysql作用,将redo log清空,这时候InnoDB的所有更新写操作会停止;
 
  内存使用满了
 
  缓冲池内存空间是有固定大小的,当缓冲池满了,也可能会刷脏页;
 
  而这时在内存中的数据会有三种类型数据页
 
  第一种是,还没有使用的; 第二种是,使用了并且是干净页;第三种是,使用了并且是脏页。
 
  内存满了,而当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。
 
  这时候只能把最久不使用的数据页从内存中淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;
 
  但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。
 
  mysql 空闲的时候
 
  这个时候就是我们MySQL比较空闲,没有请求的时候。这个时候redo log会flush 脏页,会把内存中的脏页更新到我们的磁盘里
 
  mysql正常关闭的时候
 
  因为MySQL正常关闭,肯定是要把内存脏页更新到磁盘中的。
 
  刷脏页会影响性能
 
  查询操作需要淘汰的脏页较多,刷脏页的速度比较慢,会导致查询时间过长;redo log写满了,这时候的写操作很受影响; 刷脏页的控制策略 设置系统的刷脏页速度能力
 
  show global variables like ‘innodb_io_capacity’; 查看当前系统刷脏页的能力
  set global innodb_io_capacity=200; 进行设置刷脏页速度
  设置脏页比例
 
  系统一直全力去刷盘的话,那其他业务必定会受到影响。所以我们需求设置脏页比例,去执行刷盘。脏页比例默认75%,一定不要让其接近75%**
 
  查看当前脏页比例
 
  参数innodb_max_dirty_pages_pct是脏页比例上限,默认值是75%
  select VARIABLE_VALUE into @a from performance_schema.global_status
  where VARIABLE_NAME = ‘Innodb_buffer_pool_pages_dirty’;
  select VARIABLE_VALUE into @b from performance_schema.global_status
  where VARIABLE_NAME = ‘Innodb_buffer_pool_pages_total’;
  select @a/@b;
  刷脏页速度 nnodb_io_capacity定义的能力乘以R%(redolog)来控制刷脏页的速度
 
  InnoDB每次写入的日志都有一个序号,当前写入的序号跟checkpoint对应的序号之间的差值,InnoDB会将这两个值经过一定的计算得出一个数,这个结果数就是用来控制刷脏页的速度。
 
  innodb_flush_neighbors=0(不开启脏页相邻淘汰) (对于机械硬盘顺序读写会有提升,ssd无提升。iops普通机械硬盘只有几百,ssd有上千,可以不开启)
 
  在MySQL 8.0中,innodb_flush_neighbors参数的默认值已经是0了。
 

(编辑:天瑞地安资讯网_保定站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!