show engine innodb status;
1. InnoDB Status
参数 | 含义 |
---|---|
Buffer pool size |
总页数 |
Free buffers |
Free列表中页数 |
Databases pages |
LRU列表中页数 |
pages made young |
LRU列表中页移动到前端的次数 |
pages not made young |
由于innodb_old_blocks_time 的设置导致页没有从old部分移动到new部分的操作 |
LRU len |
LRU列表中页数 (包含unzip_LRU ) |
unzip_LRU len |
由于16KB页面支持压缩为1KB, 2KB, 4KB, 8KB; 这些页面用该列表管理 |
Modified db pages |
脏页的页数 |
Log sequence number |
|
Log flushed up to |
|
Last checkpoint at |
|
2. InnoDB 中的表
2.1 information_schema
table | desc |
---|---|
INNODB_BUFFER_POOL_STATS |
缓冲池运行状态 |
INNODB_BUFFER_PAGE_LRU |
LRU列表中每个页的具体信息 (SPACE=页id) |
INNODB_BUFFER_PAGE_LRU (compressed_size <> 0 ) |
unzip_LRU 中的页面 |
INNODB_BUFFER_PAGE_LRU (oldest_modification > 0 ) |
脏页 |
3. 内存
- 缓冲池
- redo log buffer
- innodb_additional_mem_pool_size
3.1 LRU, Free, Flush
LRU划分段:
- 首部 --> midpoint: new列表
- midpoint --> 尾部: old列表
Free->LRU: 需要从缓冲池中分配页,加入LRU,从Free中删除
LRU->LRU: LRU尾部释放页,分配给新页
LRU->Flush: LRU中页面被修改, 加入Flush,不会从LRU中删除
Flush->Disk: checkpoint
3.2 redo log buffer
3种情况下redo log buffer会刷入文件:
- Master Thread 定时刷文件
- 每个事务提交时
- redo log buffer剩余大小小于1/2时
innodb_log_buffer_size
3.3 额外内存池
一些数据结构本身的内存进行分配时, 需要在额外内存池中进行
例如: 每个缓冲池的帧缓冲, 还有对应的缓冲控制对象(buffer control block) (这些对象记录了LRU, 锁, 等待等信息)
一个较大的缓冲池, 需要相应的增加该参数
4. checkpoint
4.1 checkpoint解决的问题
数据库发生问题的情况:
- 丢数据 (缓存刷新到磁盘时宕机了)
- 宕机需要恢复
checkpoint的方案:
解决的问题 | 为什么能解决 |
---|---|
缩短数据库恢复时间 | 数据库只需要对checkpoint后对redo log进行恢复 |
缓冲池不够用时 | 缓冲池不够用时, checkpoint会强制将脏页刷入磁盘 |
redo log不够用时 | redo log需要循环重用时, checkpoint将脏页刷入磁盘, 留出更多的空间 |
对系统而言 checkpoint + redo log (距离上次checkpoint) 来恢复数据
4.2 checkpoint的执行策略
- 每次刷新多少页到磁盘
- 每次从哪里取脏页
- 什么时候触发checkpoint
问题 | Sharp Checkpoint | Fuzzy Checkpoint |
---|---|---|
什么时候触发checkpoint | 数据库关闭时 | Master Thread, Flush_LRU, Async/sync Flush, Dirty Page too much |
每次刷新多少页到磁盘 | 所有脏页 | |
每次从哪里取脏页 |
Fuzzy Checkpoint:
方式 | 什么时候触发checkpoint | 每次刷新多少页到磁盘 | 同步/异步 |
---|---|---|---|
Master Thread | 定时 | 一定比例 | 异步 |
Flush_LRU_List | 可用空闲页不够, 从尾部移除的页面中包含脏页时 | 一定数量 | 异步(Page Cleaner 线程) |
Async/sync Flush | redo log不可用时 (async/sync water mark) | 从脏页列表中选取 | 异步(Page Cleaner 线程) |
Dirty Page too much | 脏页太多时 (innodb_max_dirty_page_pct ) |
一定数量 | Master Thread中完成 |
5. Master Thread
- 将脏页刷到磁盘
- 合并insert buffer
- 将log buffer刷到磁盘
- 删除无用的undo页
以上的操作会有不同的启动频率和触发条件
随着磁盘性能的提升和应用场景的不同加入了参数: 1.0.x
-
innodb_io_capacity
: 合并insert buffer和刷脏页的时候参考该值 -
innodb_adaptive_flushing
: 根据产生redo log的速度来动态调整参数 -
innodb_purge_batch_size
: 最多回收undo页的页数
1.2.x的优化:
- 添加了Page Cleaner Thread, 减轻Master Thread负担, 提高系统并发
- 将每10s的操作部分的触发条件优化(
if InnoDB is idle
)
ref: InnoDB存储引擎
网友评论