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


    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 statusG;
    
    ---
    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也就是不限制。
  • 相关阅读:
    基于YIIFRAMEWORK框架开发学习(一)
    Android学习系列(24)App代码规范之使用CheckStyle
    64为操作系统,64位IIS,运行32位应用程序的问题
    IE下设置网页为 首页,收藏
    部分.net 目录
    强大的ldd
    (原创)初试Robotium
    在solaris上安装iperf
    (原创)LoadRunner 中 调用dll
    (原创)学习NotesList(Robotium自带的例子)
  • 原文地址:https://www.cnblogs.com/zh-dream/p/13260984.html
Copyright © 2020-2023  润新知