checkpoint技术mysql_认识 MySQL 中的 Checkpoint 技术

认识 MySQL 中的 Checkpoint 技术

1,checkpoint 产生的背景

数据库在发生增删查改操作的时候, 都是先在 buffer pool 中完成的, 为了提高事物操作的效率, buffer pool 中修改之后的数据, 并没有立即写入到磁盘, 这有可能会导致内存中数据与磁盘中的数据产生不一致的情况

事物要求之一是持久性(Durability),buffer pool 与磁盘数据的不一致性的情况下发生故障, 可能会导致数据无法持久化

为了防止在内存中修改但尚未写入到磁盘的数据, 在发生故障重启数据之后产生事物未持久化的情况, 是通过日志 (redo log) 先行的方式来保证的

redo log 可以在故障重启之后实现重做, 保证了事物的持久化的特性, 但是 redo log 空间不可能无限制扩大, 对于内存中已修改但尚未提交到磁盘的数据, 也即脏页, 也需要写入磁盘

对于内存中的脏页, 什么时候, 什么情况下, 将多少脏页写入磁盘, 是由多方面因素决定的

checkpoint 的工作之一, 就是对于内存中的脏页, 在一定条件下将脏页刷新到磁盘

2,checkpoint 的分类

按照 checkpoint 刷新的方式, MySQL 中的 checkpoint 分为两种, 也即 sharp checkpoint 和 fuzzy checkpoint

sharp checkpoint: 在关闭数据库的时候, 将 buffer pool 中的脏页全部刷新到磁盘中

fuzzy checkpoint: 数据库正常运行时, 在不同的时机, 将部分脏页写入磁盘, 进刷新部分脏页到磁盘, 也是为了避免一次刷新全部的脏页造成的性能问题

3 ,checkpoint 发生的时机

checkpoint 都是将 buffer pool 中的脏页刷新到磁盘, 但是在不同的情况下, checkpoint 会被以不同的方式触发, 同时写入到磁盘的脏页的数量也不同

3.1, Master Thread checkpoint

在 Master Thread 中, 会以每秒或者每 10 秒一次的频率, 将部分脏页从内存中刷新到磁盘, 这个过程是异步的正常的用户线程对数据的操作不会被阻塞

3.2 ,FLUSH_LRU_LIST checkpoint

FLUSH_LRU_LIST checkpoint 是在单独的 page cleaner 线程中执行的

MySQL 对缓存的管理是通过 buffer pool 中的 LRU 列表实现的, LRU 空闲列表中要保留一定数量的空闲页面, 来保证 buffer pool 中有足够的空闲页面来相应外界对数据库的请求

当这个空间页面数量不足的时候, 发生 FLUSH_LRU_LIST checkpoint

空闲页的数量由 innodb_lru_scan_depth 参数表来控制的, 因此在空闲列表页面数量少于配置的值的时候, 会发生 checkpoint, 剔除部分 LRU 列表尾端的页面

ab7653affab982b574eb7acc55df2e04.gif

3.3 ,Async/Sync Flush checkpoint

Async/Sync Flush checkpoint 是在单独的 page cleaner 线程中执行的

Async/Sync Flush checkpoint 发生在重做日志不可用的时候, 将 buffer pool 中的一部分脏页刷新到磁盘中, 在脏页写入磁盘之后, 事物对应的重做日志也就可以释放了

关于 redo_log 文件的的大小, 可以通过 innodb_log_file_size 来配置

ab7653affab982b574eb7acc55df2e04.gif

对于是执行 Async Flush checkpoint 还是 Sync Flush checkpoint, 由 checkpoint_age 以及 async_water_mark 和 sync_water_mark 来决定

定义:

checkpoint_age = redo_lsn-checkpoint_lsn, 也即 checkpoint_age 等于最新的 lsn 减去已经刷新到磁盘的 lsn 的值async_water_mark=75%*innodb_log_file_size

sync_water_mark=90%*innodb_log_file_size

1)当 checkpoint_age

2)当 async_water_mark

3)当 checkpoint_age>sync_water_mark 的时候, 执行 sync Flush checkpoint 也就说, redo log 剩余空间不足 10% 的时候, 执行 Sync Flush checkpoint, 刷新到满足条件 1

在 mysql 5.6 之后, 不管是 Async Flush checkpoint 还是 Sync Flush checkpoint, 都不会阻塞用户的查询进程

个人认为:

由于磁盘是一种相对较慢的存储设备, 内存与磁盘的交互是一个相对较慢的过程

由于 innodb_log_file_size 定义的是一个相对较大的值, 正常情况下, 由前面两种 checkpoint 刷新脏页到磁盘, 在前面两种 checkpoint 刷新脏页到磁盘之后, 脏页对应的 redo log 空间随即释放, 一般不会发生 Async/Sync Flush checkpoint 同时也要意识到, 为了避免频繁低发生 Async/Sync Flush checkpoint, 也应该将 innodb_log_file_size 配置的相对较大一些

3.4, Dirty Page too much Checkpoint

Dirty Page too much Checkpoint 是在 Master Thread 线程中每秒一次的频率实现的

Dirty Page too much 意味着 buffer pool 中的脏页过多, 执行 checkpoint 脏页刷入磁盘, 保证 buffer pool 中有足够的可用页面

Dirty Page 由 innodb_max_dirty_pages_pct 配置, innodb_max_dirty_pages_pct 的默认值在 innodb 1.0 之前是 90%, 之后是 75%

ab7653affab982b574eb7acc55df2e04.gif

总结:

MySQL 数据库 (当然其他关系数据也有类似的机制), 为了提高事物操作的效率, 在事物提交之后并不会立即将修改后的数据写入磁盘, 而是通过日志先行(write log ahead) 的方式保证事物的持久性

对于将事物修改的数据页面, 也即脏页, 通过异步的方式刷新到磁盘中, checkpoint 正是实现这种异步刷新脏页到磁盘的实施者

不同的情况下, 会发生不同的 checkpoint, 将不同数量的脏页刷新到磁盘, 从而到达管理内存 (第 1,2,4 种 checkpoint) 和 redo log 可用空间 (第 3 种 checkpoint) 的目的

参考: MySQL 技术内幕 Innodb 存储引擎 PDF 下载见 http://www.linuxidc.com/Linux/2013-06/86413.htm

来源: http://www.linuxidc.com/Linux/2018-01/150615.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理一下出现的日志 Plugin 'FEDERATED' is disabled. 2017-11-15 19:23:46 16c0 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator. 2017-11-15 19:23:46 1404 [Note] InnoDB: Using atomics to ref count buffer pool pages 2017-11-15 19:23:46 1404 [Note] InnoDB: The InnoDB memory heap is disabled 2017-11-15 19:23:46 1404 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions 2017-11-15 19:23:46 1404 [Note] InnoDB: Memory barrier is not used 2017-11-15 19:23:46 1404 [Note] InnoDB: Compressed tables use zlib 1.2.3 2017-11-15 19:23:46 1404 [Note] InnoDB: Not using CPU crc32 instructions 2017-11-15 19:23:46 1404 [Note] InnoDB: Initializing buffer pool, size = 9.0G 2017-11-15 19:23:46 1404 [Note] InnoDB: Completed initialization of buffer pool 2017-11-15 19:23:46 1404 [Note] InnoDB: Highest supported file format is Barracuda. 2017-11-15 19:23:46 1404 [Note] InnoDB: Log scan progressed past the checkpoint lsn 9219742510 2017-11-15 19:23:46 1404 [Note] InnoDB: Database was not shutdown normally! 2017-11-15 19:23:46 1404 [Note] InnoDB: Starting crash recovery. 2017-11-15 19:23:46 1404 [Note] InnoDB: Reading tablespace information from the .ibd files... 2017-11-15 19:23:46 1404 [Note] InnoDB: Restoring possible half-written data pages 2017-11-15 19:23:46 1404 [Note] InnoDB: from the doublewrite buffer... InnoDB: Doing recovery: scanned up to log sequence number 9219763629 InnoDB: 1 transaction(s) which must be rolled back or cleaned up InnoDB: in total 0 row operations to undo InnoDB: Trx id counter is 275040768 2017-11-15 19:23:47 1404 [Note] InnoDB: Starting an apply batch of log records to the database... InnoDB: Progress in percent: 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
nside君的MySQL网络培训班课程特点: 业界最权威的MySQL数据库培训师姜承尧老师(也就是Inside君本人啦)亲授.姜承尧老师出版了《MySQL技术内幕:InnoDB存储引擎》、《MySQL内核:InnoDB存储引擎》等Mysql书籍。 课程紧密结合互联网公司实践,学员能够领略到BAT、网易等大公司的数据库架构与应用案例 课纲结合最新的MySQL 5.6、5.7版本,使得学员学到的都是最新的内容 充分掌握课程内容的学员年薪至少在25W起,第1期的学员已经证明了培训的价值 优秀学员可以获得姜老师的BAT等大型互联网公司的内推 面试技巧与简历模板(新增),帮助学员拿到更好的offer MySQL 安装与引擎 day001-MySQL 5.7介绍和安装 day002-MySQL 5.7安装多实例 day003-MySQL升级 参数 连接 权限 day004-MySQL权限拾 遗Role模拟 Workbench 体系结构 day005-slow_log generic_log audit 存储引擎一 day006-存储引擎二 多实例安装上 day007-MySQL 多实例下 SSL MySQL 数据类型和SQL查询 开发 day008-MySQL 数据类型 day009-精通JSON类型 day010-Employees 临时表的创建 外键约束 day011-SQL语法之SELECT day012-子查询 INSERT UPDATE DELETE REPLACE day013-作业讲解一 Rank 视图 UNION 触发器上 day014-触发器下 存储过程 自定义函数 MySQL 执行计划与优化器 day015-索引 B+树 上 day016-索引 B+树 下 Explain 1 day017-Explain 2 MySQL innodb引擎优化 day018-磁盘 day019-磁盘测试 day020-InnoDB_1 表空间 General day021-InnoDB_2 SpaceID.PageNumber 压缩表) day022-InnoDB_3 透明表空间压缩 索引组织表 day023-InnoDB_4 页(2) 行记录 day024-InnoDB_5 – heap_number Buffer Poo day025-InnoDB_6 Buffer Pool与压缩页 CheckPoint LSN day026-InnoDB_7 doublewrite ChangeBuffer AHI FNP MySQL 索引与innodb锁机制 day027-Secondary Index day028-join算法锁_1 day029-锁_2 day030-锁_3 day031-锁_4 day032-锁_5 day032-锁5标清 day033-锁_6 事物_1 day033-锁_6 事物1标清 day034-事物_2 MySQL 性能衡量 day035-redo_binlog_xa day036-undo_sysbench day036-undosysbench标清 day037-tpcc_mysqlslap MySQL 备份与恢复 day038-purge死锁举例_MySQL backup备份_1 day039-MySQL backup备份恢复_2 MySQL 复制技术与高可用 day040-MySQL 备份恢复backup_3_replication_1 day041-backup_4-replication_2 day042-replication_3 day043-replication_4-GTID 1 day044-replication_5-GTID 2

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值