关于checkpoint你可能不知道的事
我们都知道,当用户修改了数据,数据页在内存中修改后并不是每次都刷新到磁盘上。checkpoint之前的数据页保证一定落盘了,这也代表这这部分redolog可以被覆盖了,checkpoint之后的之后的数据有可能落盘,也有可能没有落盘,所以在进行崩溃恢复时,checkpoint之后的日志还是需要被使用的。innodb会依据脏页的刷新情况,定期推进checkpoint,从而减少数据库崩溃恢复的时间。
checkpoint的作用
- 缩短数据库的恢复时间
- 缓冲池不够用时,将脏页刷新到磁盘
- redolog不可用时,刷新脏页
关于redo log的生成情况分析
关于redo log生成情况可以通过show engine innodb statusG命令查看。
---
LOG
---
Log sequence number 25778620828
Log flushed up to 25778620828
Pages flushed up to 25778620828
Last checkpoint at 25778620819
0 pending log flushes, 0 pending chkp writes
16 log i/o's done, 0.00 log i/o's/second
1. Log sequence number,表示数据库开启到现在已经产生的日志量,即LSN,日志序列号,单位是字节,值越大,说明数据库更新越多。通过它可以计算日志的产生速度。
2. Log flushed up to,表示日志已经刷新到哪个点了,它的值>=LSN。
LSN - Log flushed up to表示log buffer中还有多少日志未刷新到磁盘。如果系统hang住了,可以通过LSN - Log flushed up to来看下是否是由于log buffer满了导致系统hang住了。一般情况下,如果超过30%的日志还没有刷新到日志文件中,就需要增大innodb_log_buffer_size的值。
3. Pages flushed up to,表示脏页已经刷到哪个点了,表示这之前的logfile里的日志可以被覆盖了。
2-3表示不可覆盖的脏页的量,如果它的值较小,说明Log flushed up to和Pages flushed up to的值比较接近,表示脏页刷的比较快,可以被覆盖的logfile就多。如果2-3的值大,表示脏页刷新的速度慢,能被覆盖的logfile就少。
4. Last checkpoint at,表示最后一次检查点的log位置。它的值表示系统启动时从哪个点去恢复,redo log做崩溃恢复时指定的起点。去做崩溃恢复时,终点是最新的一条logfile,起点就是checkpoint,记录的最早脏的点。
3-4表示checkpoint这个动作的跟进速度。值大表示需要提高checkpoint的跟进速度。
2-4表示崩溃后日志要恢复的量。
checkpoint的工作机制
checkpoint有两种方式,sharp checkpoint和fuzzy checkpoint。
1. sharp checkpoint:完全检查点,数据库正常关闭时,会触发把所有的脏页都写入到磁盘上,这就是完全检查点,数据库正常运行过程中不会使用sharp checkpoint。
2. fuzzy checkpoint:模糊检查点,主要有以下四种情况:
- master thread checkpoint:以每秒或者每十秒的速度从缓冲池的脏页列表中刷新一定比例的脏页回磁盘,这个过程是异步的,不会阻塞用户线程。
- flush_lru_list checkpoint:通过参数 innodb_lru_scan_depth 控制LRU列表中可用页的数量,发生了这个checkpoint时,说明脏页写入速度过慢。
- async/sync flush checkpoint:指的是重做日志不可用的情况。当重做日志不可用时, 如果不能被覆盖的脏页数量(2-3)达到 75%时,触发异步checkpoint。 不能被覆盖的脏页数量(2-3)达到90%时,同步并且阻塞用户线程,然后根据 flush 列表最早脏的顺序刷脏页。 当这个事件中的任何一个发生的时候,都会记录到errlog 中,一旦errlog出现这种日志提示,一定需要加大logfile的组数。
- dirty page too much checkpoint:脏页太多时,也会发生强制写日志,会阻塞用户线程,由innodb_max_dirty_pages_pct参数(默认75%)控制。
小结
mysql数据库为了提高事务的操作效率,在事务提交之后并不会立即将修改后的数据写入磁盘,而是通过日志先行(write log ahead)的策略保证事务的持久性。对于脏页,则通过异步的方式刷新到磁盘上,MySQL则是采用了checkpoint技术实现了异步刷新脏页的目的。
- Android主题换肤 无缝切换
- Android RxJava/RxAndroid结合Retrofit使用
- 网络犯罪和网络间谍对经济的影响(长文,阅读需勇气)
- FireEye:2013年度APT攻击报告(多图)
- linux下利用一次性口令实现安全管理
- HTTPS对于用户隐私泄露无能为力
- 移动APP安全在渗透测试中的应用
- ASLR在Windows与Linux系统之间的差别
- 基于RDP的SSL中间人攻击
- 软件漏洞分析技巧分享
- 撞库攻击:一场需要用户参与的持久战
- Android自定义下拉刷新动画--仿百度外卖下拉刷新
- Android自定义View之高仿QQ健康
- Paypal的一个Dom型XSS漏洞分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现截屏方式整理(总结)
- 用RSHINY DASHBOARD可视化美国投票记录
- Android 侧滑关闭Activity的实例
- Android 两个Fragment之间的跳转和数据的传递实例详解
- Android编程实现保存图片到系统图库的方法示例
- Android自定义单选多选下拉列表的实例代码
- R语言POT超阈值模型在洪水风险频率分析中的应用研究
- Android开发之ToggleButton实现开关效果示例
- Android使用Circular Reveal动画让页面跳转更炫酷
- 学习使用Material Design控件(三)使用CardView实现卡片效果
- Android实现dialog的3D翻转示例
- Android ImageView 固定宽高比例的实现方法
- Android 实现IOS选择拍照相册底部弹出的实例
- ubuntu 20.04上搭建LNMP环境的方法步骤
- Android实现界面内嵌多种卡片视图(ViewPager、RadioGroup)