mysql checkPoint和bin-log小计

mysql中数据存储在磁盘上,但直接在磁盘上操作数据代价很高,所以mysql在内存中开辟了一块缓冲区buffer pool,将数据以数据页的形式放入buffer poll中,提高操作效率,因此buffer pool缓冲区中数据与磁盘中的数据存在不一致,称为脏页。

缓冲区的大小是有限的,所以需要有一个时间点将脏页数据刷回磁盘;另外为了提供crash safe能力,进行数据修改操作时数据库引擎会记录redo log,redo log文件大小是有限的,当文件写满时,会从头开始覆盖老数据循环写,因此也需要将老数据中涉及的脏页内容刷回磁盘,这个脏页刷盘的时间点就叫做checkpoint。

此外为了数据库宕机后数据恢复保证事务的持久性,还利用了rodo log记录mysql修改操作,可是rodo log日志文件是循环写的,当文件写满之后就会出现新数据覆盖老数据的问题。

下面说一下checkPoint的分类,Innodb中有两种checkPoint:sharp checkPoint、fuzzy checkPoint,sharp checkPoint指每次当数据库关闭时才将脏页刷新至磁盘,这是默认的工作方式;此外还支持fuzzy checkPoint,它是在数据库正常运行时,在不同的时机将脏页刷新至磁盘,下面简单说一下。

Master Thread checkpoint:以每秒或10秒的频率,异步将部分脏页刷新至磁盘,用户线程的数据操作不会被干扰

FLUSH_LRU_LIST Checkpoint:mysql中缓冲池本身需要保证有一定的空闲页面,它使用了lru的方式,如果空闲页面数量到达临界点的话,空闲页的数量由innodb_lru_scan_depth参数表来控制的,会通过lru算法寻找最久没有被使用的页,进行回收,如果其中有脏数据则刷至磁盘

Async/Sync Flush Checkpoint:上面说了重做日志redo log是循环写入的,每次需要覆盖旧日志,就会触发checkPoint,将旧日志中涉及的脏页刷新至磁盘中

Dirty Page too much Checkpoint:当缓冲区中脏页数量过多,到达一定比例时,脏页占缓冲区数据页比例由innodb_max_dirty_pages_pct配置,innodb_max_dirty_pages_pct的默认值在innodb 1.0之前是90%,之后是75%,会进行将部分脏页刷至磁盘的操作。

通过不同的checkPoint将脏页在mysql运行时就不断的将脏页刷至磁盘,从而解决缓冲区内存不足、redo log 大小不足,mysql宕机恢复时磁盘数据与redo log差异过大恢复时间过长的问题。

bin log是MySQL 二进制日志,记录了数据库表结构改变和表中数据改变事件,它包括了两个部分,index索引文件和日志文件,日志文件的后缀是00000*,如mysql-bin.index和mysql-bin.000001,index文件中记录了当前哪些bin-log文件正在被使用,日志文件就记录了ddl(表结构修改)和dml(数据操作)事件。bin-log可以用于数据库恢复(库被删掉或数据被删掉)、主从复制、审计(二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击)

bin-log有三种格式,当前用的比较多的是row这种形式

format定义优点缺点
statement记录的是修改SQL语句日志文件小,节约IO,提高性能准确性差,对一些系统函数不能准确复制或不能复制,如now()、uuid()等
row记录的是每行实际数据的变更准确性强,能准确复制数据的变更日志文件大,较大的网络IO和磁盘IO
mixedstatement和row模式的混合准确性强,文件大小适中结构比较复杂,有可能发生主从不一致问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值