暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL配置redo日志大小

原创 蔡璐 2024-08-26
436

1. 配置重做日志容量配置(>=MySQL 8.0.30)

从MySQL 8.0.30开始,innodb_redo_log_capacity系统变量控制重做日志文件占用的磁盘空间量。您可以在启动时或运行时使用 SET GLOBAL 语句在选项文件中设置此变量;例如,以下语句将重做日志容量设置为8GB:

SET GLOBAL innodb_redo_log_capacity = 8589934592;

在运行时设置时,配置更改会立即生效,但新限制可能需要一些时间才能完全生效。如果重做日志文件占用的空间小于指定值,则脏页会不太积极地从缓冲池刷新到表空间数据文件,最终会增加重做日志文件占用的磁盘空间。如果重做日志文件占用的空间超过指定值,则会更积极地刷新脏页,最终减少重做日志文件占用的磁盘空间。

如果未定义 innodb_redo_log_capacity,并且未定义 innodb_log_file_size 或 innodb_log_files_in_group,则使用默认的 innodb_redo_log_capacity 值。

如果未定义 innodb_redo_log_capacity,并且定义了 innodb_log_file_size和innodb_log_files_in_group其中一个或两个,则 InnoDB 重做日志容量计算为 (innodb_log_files_in_group * innodb_log_file_size)。此计算不会修改未使用的 innodb_redo_log_capacity 设置的值。

Innodb_redo_log_capacity_resized 服务器状态变量指示所有重做日志文件的总重做日志容量。

重做日志文件驻留在数据目录中的 #innodb_redo 目录中,除非 innodb_log_group_home_dir 变量指定了不同的目录。如果定义了 innodb_log_group_home_dir,则重做日志文件驻留在该目录中的 #innodb_redo 目录中。重做日志文件有两种类型:普通重做日志文件和备用重做日志文件。普通重做日志文件是正在使用的文件。备用重做日志文件是那些等待使用的文件。 InnoDB尝试总共维护32个重做日志文件,每个文件的大小等于1/32 * innodb_redo_log_capacity;但是,修改 innodb_redo_log_capacity 设置后,文件大小可能会暂时有所不同。

重做日志文件使用 #ib_redoN 命名约定,其中 N 是重做日志文件编号。备用重做日志文件由 _tmp 后缀表示。以下示例显示了 #innodb_redo 目录中的重做日志文件,其中有 21 个活动重做日志文件和 11 个备用重做日志文件,按顺序编号。

'#ib_redo582'  '#ib_redo590'  '#ib_redo598'      '#ib_redo606_tmp'
'#ib_redo583'  '#ib_redo591'  '#ib_redo599'      '#ib_redo607_tmp'
'#ib_redo584'  '#ib_redo592'  '#ib_redo600'      '#ib_redo608_tmp'
'#ib_redo585'  '#ib_redo593'  '#ib_redo601'      '#ib_redo609_tmp'
'#ib_redo586'  '#ib_redo594'  '#ib_redo602'      '#ib_redo610_tmp'
'#ib_redo587'  '#ib_redo595'  '#ib_redo603_tmp'  '#ib_redo611_tmp'
'#ib_redo588'  '#ib_redo596'  '#ib_redo604_tmp'  '#ib_redo612_tmp'
'#ib_redo589'  '#ib_redo597'  '#ib_redo605_tmp'  '#ib_redo613_tmp'

每个普通重做日志文件都与特定范围的 LSN 值相关联;例如,以下查询显示上一示例中列出的活动重做日志文件的 START_LSN 和 END_LSN 值:

mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files; +----------------------------+--------------+--------------+ | FILE_NAME | START_LSN | END_LSN | +----------------------------+--------------+--------------+ | ./#innodb_redo/#ib_redo582 | 117654982144 | 117658256896 | | ./#innodb_redo/#ib_redo583 | 117658256896 | 117661531648 | | ./#innodb_redo/#ib_redo584 | 117661531648 | 117664806400 | | ./#innodb_redo/#ib_redo585 | 117664806400 | 117668081152 | | ./#innodb_redo/#ib_redo586 | 117668081152 | 117671355904 | | ./#innodb_redo/#ib_redo587 | 117671355904 | 117674630656 | | ./#innodb_redo/#ib_redo588 | 117674630656 | 117677905408 | | ./#innodb_redo/#ib_redo589 | 117677905408 | 117681180160 | | ./#innodb_redo/#ib_redo590 | 117681180160 | 117684454912 | | ./#innodb_redo/#ib_redo591 | 117684454912 | 117687729664 | | ./#innodb_redo/#ib_redo592 | 117687729664 | 117691004416 | | ./#innodb_redo/#ib_redo593 | 117691004416 | 117694279168 | | ./#innodb_redo/#ib_redo594 | 117694279168 | 117697553920 | | ./#innodb_redo/#ib_redo595 | 117697553920 | 117700828672 | | ./#innodb_redo/#ib_redo596 | 117700828672 | 117704103424 | | ./#innodb_redo/#ib_redo597 | 117704103424 | 117707378176 | | ./#innodb_redo/#ib_redo598 | 117707378176 | 117710652928 | | ./#innodb_redo/#ib_redo599 | 117710652928 | 117713927680 | | ./#innodb_redo/#ib_redo600 | 117713927680 | 117717202432 | | ./#innodb_redo/#ib_redo601 | 117717202432 | 117720477184 | | ./#innodb_redo/#ib_redo602 | 117720477184 | 117723751936 | +----------------------------+--------------+--------------+

当执行检查点时,InnoDB 将检查点 LSN 存储在包含该 LSN 的文件的标头中。在恢复期间,将检查所有重做日志文件,并从最新的检查点 LSN 开始恢复。

MySQL提供了几个状态变量用于监视重做日志和重做日志容量调整操作;例如,您可以查询 Innodb_redo_log_resize_status 来查看调整大小操作的状态:

mysql> SHOW STATUS LIKE 'Innodb_redo_log_resize_status'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | Innodb_redo_log_resize_status | OK | +-------------------------------+-------+

Innodb_redo_log_capacity_resized 状态变量显示当前重做日志容量限制:

mysql> SHOW STATUS LIKE 'Innodb_redo_log_capacity_resized'; +----------------------------------+-----------+ | Variable_name | Value | +----------------------------------+-----------+ | Innodb_redo_log_capacity_resized | 104857600 | +----------------------------------+-----------+

其他适用的状态变量包括:

  • Innodb_redo_log_checkpoint_lsn
    • 重做日志检查点 LSN。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_current_lsn
    • 当前LSN表示重做日志缓冲区中最后写入的位置。 InnoDB在请求操作系统将数据写入当前重做日志文件之前,会将数据写入MySQL进程内部的重做日志缓冲区。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_flushed_to_disk_lsn
    • 刷新到磁盘的 LSN。 InnoDB首先将数据写入重做日志,然后请求操作系统将数据刷新到磁盘。刷新到磁盘的 LSN 表示 InnoDB 知道已刷新到磁盘的重做日志中的最后一个位置。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_logical_size
    • 数据大小值(以字节为单位),表示包含正在使用的重做日志数据的 LSN 范围,范围从重做日志使用者所需的最旧块到最新写入的块。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_physical_size
    • 磁盘上所有重做日志文件当前消耗的磁盘空间量(以字节为单位),不包括备用重做日志文件。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_read_only
    • 重做日志是否是只读的。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_uuid
    • 重做日志 UUID。
    • 该变量是在 MySQL 8.0.30 中添加的。
  • Innodb_redo_log_resize_status
    • 重做日志大小调整状态指示重做日志容量调整机制的当前状态。可能的值包括:
      • ok:没有问题,也没有待处理的重做日志容量调整操作。
      • Resizing down:正在进行Resizing down操作。
    • 调整大小操作是即时生效,因此没有待处理状态。
    • 该变量是在 MySQL 8.0.30 中添加的。

查看有关活动重做日志文件的信息可以通过查询 innodb_redo_log_files Performance Schema 表。以下查询从表的所有列中检索数据:

SELECT FILE_ID, START_LSN, END_LSN, SIZE_IN_BYTES, IS_FULL, CONSUMER_LEVEL FROM performance_schema.innodb_redo_log_files;

2. 配置重做日志容量配置(>=MySQL 8.0.30)

在MySQL 8.0.30之前,InnoDB默认在数据目录中创建两个重做日志文件,名为ib_logfile0和ib_logfile1,并以循环方式写入这些文件。
修改重做日志容量需要更改重做日志文件的数量或大小,或同时更改两者。

  1. 停止 MySQL 服务器并确保其关闭时没有错误。
  2. 编辑 my.cnf 以更改重做日志文件配置。要更改重做日志文件大小,请配置 innodb_log_file_size。要增加重做日志文件的数量,配置 innodb_log_files_in_group。
  3. 重新启动MySQL

如果InnoDB检测到innodb_log_file_size与重做日志文件大小不同,它会写入日志检查点,关闭并删除旧的日志文件,按请求的大小创建新的日志文件,然后打开新的日志文件。

3. 自动配置MySQL实例Redo log容量

当使用–innodb-dedicated-server启动服务器时,InnoDB会自动计算并设置某些InnoDB参数的值,包括重做日志容量。自动配置适用于驻留在 MySQL 专用服务器上的 MySQL 实例,其中 MySQL 服务器可以使用所有可用的系统资源。

4. 参考文档

MySQL redo log

文章转载自蔡璐,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论