hopeless-dream

导航

磁盘结构与内存结构工作关系

LSN(日志序列号)

定义

LSN(log sequence number)日志序列号,5.6.3之后占用8字节,LSN主要用于发生crash时对数据进行recovery,LSN是一个一直递增的整型数字,表示事务写入到日志的字节总量。
LSN不仅只存在于重做日志中,在每个数据页头部也会有对应的LSN号,该LSN记录当前页最后一次修改的LSN号,用于在recovery时对比重做日志LSN号决定是否对该页进行恢复数据。
checkpoint也是有LSN号记录的,LSN号串联起一个事务开始到恢复的过程。

查看lsn

mysql> show engine innodb status\G;

---
LOG
---
Log sequence number          751381441
Log buffer assigned up to    751381441
Log buffer completed up to   751381441
Log written up to            751381441
Log flushed up to            751381441
Added dirty pages up to      751381441
Pages flushed up to          751381441
Last checkpoint at           751381441
15 log i/o's done, 0.33 log i/o's/second

结果说明

Log sequence number   当前系统最大的LSN号,最新的数据变更
log flushed up to    当前已经写入redo日志文件的LSN
pages flushed up to  已经将更改写入脏页的lsn号
Last checkpoint at  就是系统最后一次刷新buffer pool脏中页数据到磁盘的checkpoint
以上4个LSN是递减的:
LSN1>=LSN2>=LSN3>=LSN4.

checkpoint

https://www.cnblogs.com/zh-dream/p/13205177.html

分类

sharp checkpoint

完全检查点,数据库正常关闭时,会触发把所有的脏页都写入到磁盘上(这时候logfile的日志就没用了,脏页已经写到磁盘上了)

fuzzy checkpoint

模糊检查点,部分页写入磁盘 

fuzzy checkpoint 发生的策略

  • master thread checkpoint 差不多以每秒或每十秒的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘,这个过程是异步的,不会阻塞用户查询。
mysql> show variables like '%o_cap%';  单位数据页
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_io_capacity     | 200   |
| innodb_io_capacity_max | 2000  |
+------------------------+-------+
2 rows in set (0.00 sec)
  • flush_lru_list checkpoint
mysql> show variables like '%lru%depth';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_lru_scan_depth | 1024  |
+-----------------------+-------+
1 row in set (0.00 sec)

参数innodb_lru_scan_depth控制lru列表中可用页的数量,默认是1024
  • async/sync flush checkpoint
log file快满了,会批量的触发数据页回写,这个事件触发的时候又分为异步和同步,不可被覆盖的redolog占log file的比值:75%--->异步、90%--->同步。
指的是重做日志文件不可用的情况,这时需要强制将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的。
若将已经写入到重做日志的LSN记为redo_lsn,将已经刷新回磁盘最新页的LSN记为checkpoint_lsn,则可定义: checkpoint_age
= redo_lsn(log flushed up to的值) - checkpoint_lsn(Last checkpoint at的值)
再定义以下的变量:     async_water_mark
= 75% * total_redo_log_file_size     sync_water_mark = 90% * total_redo_log_file_size 若每个重做日志文件的大小为1GB,并且定义了两个重做日志文件,则重做日志文件的总大小为2GB。那么async_water_mark=1.5GB,sync_water_mark=1.8GB。
这时:
  • 当checkpoint_age<async_water_mark时,不需要刷新任何脏页到磁盘;
  • 当async_water_mark<checkpoint_age<sync_water_mark时触发Async Flush,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark;
  • checkpoint_age>sync_water_mark这种情况一般很少发生,除非设置的重做日志文件太小,并且在进行类似LOAD DATA的BULK INSERT操作。此时触发Sync Flush操作,从Flush列表中刷新足够的脏页回磁盘,使得刷新后满足checkpoint_age<async_water_mark。
  • dirty page too much checkpoint     脏页太多检查点,为了保证buffer pool的空间可用性的一个检查点。
  1. 查看脏页数量 mysql> show global status like 'Innodb_buffer_pool_pages%t%'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | Innodb_buffer_pool_pages_data | 1280 | | Innodb_buffer_pool_pages_dirty | 0 | | Innodb_buffer_pool_pages_total | 8192 | +--------------------------------+-------+ Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total:表示脏页在buffer pool的占比
  2. 查看是否出现性能负载 mysql> show global status like '%wait_free'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | Innodb_buffer_pool_wait_free | 0 | +------------------------------+-------+ 1 row in set (0.00 sec) 如果>0,说明出现性能负载,buffer pool中没有干净可用块
  • 脏页控制参数 mysql> show variables like '%dirty%pct%'; +--------------------------------+-----------+ | Variable_name | Value | +--------------------------------+-----------+ | innodb_max_dirty_pages_pct | 90.000000 | | innodb_max_dirty_pages_pct_lwm | 10.000000 | +--------------------------------+-----------+ 2 rows in set (0.01 sec)
    •   1、默认是脏页占比90%的时候,就会触发刷盘,将脏页写入磁盘,腾出内存空间。建议不调,调太低的话,io压力就会很大,但是崩溃恢复就很快;
    •   2、lwm:low water mark低水位线,刷盘到该低水位线就不写脏页了,0也就是不限制。

 

posted on 2020-11-03 08:06  hopeless-dream  阅读(140)  评论(0编辑  收藏  举报