• MySQL 8.0.30动态redo log初探


    • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
    • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
    • 作者:YeJinrong/叶金荣

    MySQL 8.0.30全新的动态redo log玩法探秘。

    MySQL从5.7版本开始支持在线动态修改 innodb_buffer_pool_size,8.0开始支持在线添加undo表空间,以及临时表空间的自动回收,真的是越来越方便了。

    从8.0.30开始,又新增支持动态调整redo log的大杀器,对DBA来说又是一大福音。

    在8.0.30里,新增选项 innodb_redo_log_capacity,用于定义redo log总大小。如果设置了该选项,则原来定义redo log的几个选项 innodb_log_file_sizeinnodb_log_files_in_group 就都失效了

    在8.0.30里,如果innodb_log_group_home_dir 没有设置,redo log存储在 datadir/#innodb_redo下,由32个文件组成。文件命名为 #ib_redoN**,每个文件大小是 innodb_redo_log_capacity/32(在resize redo log时可能会短时间不一样)。

    -rw-r-----. 1 mysql mysql 110M Sep 28 13:54 #ib_redo2923
    -rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2924
    -rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2925
    -rw-r-----. 1 mysql mysql 256K Sep 28 13:54 #ib_redo2926
    • 1
    • 2
    • 3

    有两种类型的redo log文件,一种是当前正在使用的(ordinary),文件名是正常的 #ib_redoN;另一种是空闲的(spare),文件名为 #ib_redoN_tmp,多加了个 _tmp 后缀。

    -rw-r-----. 1 mysql mysql 192M Sep 28 13:53 #ib_redo2922
    -rw-r-----. 1 mysql mysql 192M Sep 28 13:53 #ib_redo2923
    -rw-r-----. 1 mysql mysql 192M Sep 28 12:42 #ib_redo2924_tmp
    -rw-r-----. 1 mysql mysql 192M Sep 28 12:44 #ib_redo2925_tmp
    -rw-r-----. 1 mysql mysql 192M Sep 28 12:47 #ib_redo2926_tmp
    • 1
    • 2
    • 3
    • 4

    可以直接查看当前所有活跃redo log的状态:

    mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
    mysql> SELECT * FROM performance_schema.innodb_redo_log_files;
    +---------+-----------------------------+-------------+-------------+---------------+---------+
    | FILE_ID | FILE_NAME                   | START_LSN   | END_LSN     | SIZE_IN_BYTES | IS_FULL |
    +---------+-----------------------------+-------------+-------------+---------------+---------+
    |    9692 | ./#innodb_redo/#ib_redo9692 | 19417284608 | 19419379712 |       2097152 |       1 |
    |    9693 | ./#innodb_redo/#ib_redo9693 | 19419379712 | 19421474816 |       2097152 |       1 |
    |    9694 | ./#innodb_redo/#ib_redo9694 | 19421474816 | 19423569920 |       2097152 |       1 |
    |    9695 | ./#innodb_redo/#ib_redo9695 | 19423569920 | 19425665024 |       2097152 |       1 |
    |    9696 | ./#innodb_redo/#ib_redo9696 | 19425665024 | 19427760128 |       2097152 |       1 |
    |    9697 | ./#innodb_redo/#ib_redo9697 | 19427760128 | 19429855232 |       2097152 |       1 |
    |    9698 | ./#innodb_redo/#ib_redo9698 | 19429855232 | 19431950336 |       2097152 |       1 |
    |    9699 | ./#innodb_redo/#ib_redo9699 | 19431950336 | 19434045440 |       2097152 |       1 |
    |    9700 | ./#innodb_redo/#ib_redo9700 | 19434045440 | 19436140544 |       2097152 |       1 |
    |    9701 | ./#innodb_redo/#ib_redo9701 | 19436140544 | 19438235648 |       2097152 |       1 |
    |    9702 | ./#innodb_redo/#ib_redo9702 | 19438235648 | 19440330752 |       2097152 |       1 |
    |    9703 | ./#innodb_redo/#ib_redo9703 | 19440330752 | 19442425856 |       2097152 |       1 |
    |    9704 | ./#innodb_redo/#ib_redo9704 | 19442425856 | 19444520960 |       2097152 |       0 |
    +---------+-----------------------------+-------------+-------------+---------------+---------+
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    相应的,增加了几个status用来观察redo log的状态:

    mysql> show global status like '%innodb%redo%';
    +-------------------------------------+-------------+
    | Variable_name                       | Value       |
    +-------------------------------------+-------------+
    | Innodb_redo_log_read_only           | OFF         |   #当前redo不是处于RO状态
    | Innodb_redo_log_uuid                | 1075899837  |   #redo log uuid,归档用
    | Innodb_redo_log_checkpoint_lsn      | 16900081552 |   #最新的checkpoint
    | Innodb_redo_log_current_lsn         | 16905440582 |   #当前LSN
    | Innodb_redo_log_flushed_to_disk_lsn | 16905433909 |   #已刷盘的LSN
    | Innodb_redo_log_logical_size        | 5358080     |   #当前活跃事务正在使用中的redo log大小
    | Innodb_redo_log_physical_size       | 24117248    |   #当前正在使用中的redo log大小(不含空闲的那部分)
    | Innodb_redo_log_capacity_resized    | 33554432    |   #redo log resized后的大小
    | Innodb_redo_log_resize_status       | OK          |   #resize状态,OK|Resizing down两种
    | Innodb_redo_log_enabled             | ON          |
    +-------------------------------------+-------------+
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    从上面的结果中能看到当前redo log总大小是32MB,ordinary空间是 24117248字节,spare空间 9437184字节(33554432 - 24117248),当前活跃事务占用的空间是 5358080字节。

    我们还可以利用下面的方法来预估合理的 innodb_redo_log_capacity 值应该是多少。

    mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn'; SELECT SLEEP(60); SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_current_lsn';
    
    +-----------------------------+------------+
    | Variable_name               | Value      |
    +-----------------------------+------------+
    | Innodb_redo_log_current_lsn | 1895933494 |
    +-----------------------------+------------+
    1 row in set (0.01 sec)
    
    +-----------+
    | SLEEP(60) |
    +-----------+
    |         0 |
    +-----------+
    1 row in set (1 min 0.00 sec)
    
    +-----------------------------+------------+
    | Variable_name               | Value      |
    +-----------------------------+------------+
    | Innodb_redo_log_current_lsn | 1986911858 |
    +-----------------------------+------------+
    1 row in set (0.01 sec)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    先观察1分钟内,共产生多少redo log为 86.76MB(1986911858-1895933494),通常我们要预留10-30分钟的redo log空间,因此合理的 innodb_redo_log_capacity 建议值约为 1GB ~ 3GB左右。

    当我们把redo log调小(压测期间,从32MB调低到8MB):

    mysql> SET GLOBAL innodb_redo_log_capacity = 8*1024*1024;

      日志中可能会有类似下面的提示,警告redo log可能不够用,建议加大:

      2022-09-28T14:04:15.046016+08:00 8 [Note] [MY-013884] [InnoDB] User has set innodb_redo_log_capacity to 8M.
      2022-09-28T14:04:15.046322+08:00 0 [Note] [MY-013885] [InnoDB] Redo log has been requested to resize from 64M to 8M.
      2022-09-28T14:04:15.918901+08:00 0 [Warning] [MY-013867] [InnoDB] Redo log is running out of free space, pausing user threads... Consider increasing innodb_redo_log_capacity.
      2022-09-28T14:04:16.012707+08:00 0 [Note] [MY-013868] [InnoDB] Redo log reclaimed some free space, resuming user threads.
      2022-09-28T14:04:18.630082+08:00 0 [Note] [MY-013887] [InnoDB] Redo log has been resized to 8M.
      • 1
      • 2
      • 3
      • 4

      注意:调小redo log的话,需要等当前事务提交后,相应的活跃redo log文件才能释放。

      当启用 innodb_redo_log_capacity 后,如果还继续设置 innodb_log_files_in_groupinnodb_log_file_size,则日志中会有类似下面的提示,忽略即可:

      2022-09-28T14:49:20.248216+08:00 0 [Warning] [MY-013869] [InnoDB] Ignored deprecated configuration parameter innodb_log_file_size. Use
      d innodb_redo_log_capacity instead.
      2022-09-28T14:49:20.248271+08:00 0 [Warning] [MY-013870] [InnoDB] Ignored deprecated configuration parameter innodb_log_files_in_group
      . Used innodb_redo_log_capacity instead.
      • 1
      • 2
      • 3

      有了动态redo log功能,又少了一个需要重启MySQL的理由,对DBA来说真的是很方便。

      顺便一起来猜猜MySQL下一个能动态实现的功能是啥呢?比如可以在线动态回收空闲的表空间?


      Enjoy GreatSQL :)

      关于 GreatSQL

      GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

      相关链接: GreatSQL社区 Gitee GitHub Bilibili

      GreatSQL社区:

      捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

      社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

      6440

    • 相关阅读:
      【大数据部落】混合IBCF协同过滤推荐算法推荐引擎的探索1
      自定义终结符:EOF
      【笔记】判断高电平,低电平和方波的几种方法
      Air001 TIM1高级定时器单脉冲输出模式使用
      LuaJIT编写的解析十六进制数据
      java的IO流-字符流
      吴恩达机器学习课程资源(笔记、中英文字幕视频、课后作业,提供百度云镜像!)
      2023中国民航大学计算机考研信息汇总
      Linux上部署Kubectl(k8s)
      windows 查看本地安装证书情况
    • 原文地址:https://blog.csdn.net/GreatSQL2021/article/details/127754544