美文网首页
InnoDB存储概览

InnoDB存储概览

作者: 天之見證 | 来源:发表于2019-08-20 23:25 被阅读0次
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. 内存

  1. 缓冲池
  2. redo log buffer
  3. innodb_additional_mem_pool_size

3.1 LRU, Free, Flush

LRU划分段:

  1. 首部 --> midpoint: new列表
  2. 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会刷入文件:

  1. Master Thread 定时刷文件
  2. 每个事务提交时
  3. redo log buffer剩余大小小于1/2时

innodb_log_buffer_size

3.3 额外内存池

一些数据结构本身的内存进行分配时, 需要在额外内存池中进行

例如: 每个缓冲池的帧缓冲, 还有对应的缓冲控制对象(buffer control block) (这些对象记录了LRU, 锁, 等待等信息)

一个较大的缓冲池, 需要相应的增加该参数

4. checkpoint

4.1 checkpoint解决的问题

数据库发生问题的情况:

  1. 丢数据 (缓存刷新到磁盘时宕机了)
  2. 宕机需要恢复

checkpoint的方案:

解决的问题 为什么能解决
缩短数据库恢复时间 数据库只需要对checkpoint后对redo log进行恢复
缓冲池不够用时 缓冲池不够用时, checkpoint会强制将脏页刷入磁盘
redo log不够用时 redo log需要循环重用时, checkpoint将脏页刷入磁盘, 留出更多的空间

对系统而言 checkpoint + redo log (距离上次checkpoint) 来恢复数据

4.2 checkpoint的执行策略

  1. 每次刷新多少页到磁盘
  2. 每次从哪里取脏页
  3. 什么时候触发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

  1. 将脏页刷到磁盘
  2. 合并insert buffer
  3. 将log buffer刷到磁盘
  4. 删除无用的undo页

以上的操作会有不同的启动频率和触发条件

随着磁盘性能的提升和应用场景的不同加入了参数: 1.0.x

  1. innodb_io_capacity: 合并insert buffer和刷脏页的时候参考该值
  2. innodb_adaptive_flushing: 根据产生redo log的速度来动态调整参数
  3. innodb_purge_batch_size: 最多回收undo页的页数

1.2.x的优化:

  1. 添加了Page Cleaner Thread, 减轻Master Thread负担, 提高系统并发
  2. 将每10s的操作部分的触发条件优化(if InnoDB is idle)

ref: InnoDB存储引擎

相关文章

网友评论

      本文标题:InnoDB存储概览

      本文链接:https://www.haomeiwen.com/subject/grhvsctx.html