鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使用说明

建议关注官网MySQL 8.0.20版本的CVE漏洞,按照要求及时进行漏洞修复。

应用场景

当MySQL中发生undo tablespace truncation,且目标undo tablespace已较大时,undo_spaces_lock这个读写锁会出现显著的竞争。如果通过Performance Schema和可视化工具(如dimSTAT),观测到Undo tablespace truncation时undo_spaces_lock热点(此时通常伴随吞吐量波动),可通过本特性缓解该热点,减少该期间的性能波动。

本特性在补丁应用后重新编译MySQL,还需额外配置系统变量才能生效,详见新增系统变量

编译安装方法

MySQL undo_spaces_lock优化特性以Patch补丁文件形式提供,该补丁基于MySQL 8.0.20版本开发,并在Gitee社区开源,使用该特性前,需要先将Patch应用到MySQL源码中,再编译和安装MySQL。具体操作步骤如下:

  • 优化特性以补丁文件形式提供,需在MySQL源码应用补丁后,编译安装MySQL。
  • 补丁针对MySQL 8.0.20版本开发。
  1. 下载MySQL 8.0.20源码,上传源码至服务器“/home”目录下后,解压源码包并进入MySQL源码的根目录。
    cd /home
    tar -zxvf mysql-boost-8.0.20.tar.gz
    cd mysql-8.0.20
  2. 解压源码包并进入MySQL源码目录。
    tar -zxvf mysql-boost-8.0.20.tar.gz
    cd mysql-8.0.20
  3. 在源码根目录,使用git初始化命令来建立git管理信息。
    git init
    git add -A
    git commit -m "Initial commit"
    • 一般情况下,系统自带git,若需要安装git,请先参见《MySQL 移植指南》中配置Yum源相关内容,再执行如下命令安装git。
      1
      yum install git
      
    • 若未配置git的提交用户信息,git commit前需要先配置用户邮件及用户名称信息。
      1
      2
      git config user.email "123@example.com"
      git config user.name "123"
      
  4. 合入补丁。
    • 如果本特性不和MySQL NUMA调度优化特性共同使用,则下载undo_spaces_lock优化补丁文件,并将补丁文件放到MySQL源码的根目录,执行以下命令生效补丁。
      1
      git am --quiet --whitespace=nowarn 0001-UNDO-SPACES-LOCK-OPT.patch
      

      如果没有回显报错信息,则补丁应用成功。

    • 如果本特性要和MySQL NUMA调度优化特性共同使用,则需要先合入MySQL NUMA调度优化特性,再合入本特性:
      下载NUMA调度特性补丁文件undo_spaces_lock优化补丁文件,并将补丁文件放到MySQL源码的根目录,执行以下命令使NUMA调度优化特性补丁和undo_spaces_lock优化补丁生效。
      1
      git am --quiet --whitespace=nowarn 0001-SCHED-AFFINITY.patch 0002-UNDO-SPACES-LOCK-OPT.AFTER-SCHED-AFFINITY.patch
      

      如果没有回显报错信息,则补丁应用成功。

  5. 根据正常的编译安装MySQL源码的操作步骤进行MySQL的编译安装。详细信息请参见《MySQL 移植指南》。

新增系统变量

本特性增加动态系统变量innodb_undo_spaces_snapshot_tickets,默认值0,相当于未启用innodb_undo_spaces_snapshot_tickets特性。最大值1048576。

本特性增加3个innodb monitors,用于帮助innodb_undo_spaces_snapshot_tickets调优。

innodb monitor名称

描述

undo_truncate_snapshot_ticket_grant_count

在undo truncation期间,授予snapshot ticket的次数

undo_truncate_snapshot_ticket_try_count

在undo truncation期间,请求snapshot ticket的次数

undo_truncate_snapshot_ticket_wait_count

在undo truncation期间,purge coordinator等待所有ticket返回的次数

参数设置举例

innodb_undo_spaces_snapshot_tickets用于控制单次undo tablespace truncation过程产生的这个undo tablespaces快照最多被查询的次数。举例一个调优流程,发现undo_spaces_lock竞争后,先将innodb_undo_spaces_snapshot_tickets设置为一个较大值,如100000,然后重新运行负载,并观察上述innodb monitors。

  • undo_truncate_snapshot_ticket_grant_count表示DML线程累计从快照中收益的次数,这些次数的事务本会被purge coordinator阻塞。
  • undo_truncate_snapshot_ticket_try_count表示多个DML线程在读快照时的竞争情况。绝大多数情况下undo_truncate_snapshot_ticket_try_count等于或略大于undo_truncate_snapshot_ticket_grant_count,表示无竞争。
  • 若undo_truncate_snapshot_ticket_wait_count很小(趋近0),这是绝大多数情况,表示purge coordinator临界区时间没有被影响。此时,若undo_truncate_snapshot_ticket_grant_count接近innodb_undo_spaces_snapshot_tickets,可进一步增大innodb_undo_spaces_snapshot_tickets。
  • 若undo_truncate_snapshot_ticket_wait_count较大(本例中,上千),可适当减小innodb_undo_spaces_snapshot_tickets值,平衡DML线程的收益和purge coordinator的损耗。