应急预案:专有云V3环境中RDS MySQL5.7实例触发Bug导致宕机的应急处理方法

1. 概述

本文主要介绍在专有云V3环境中,RDS MySQL5.7实例触发Bug导致宕机的应急处理方法。

1.1. 适用范围

  • 专有云V3企业版,RDS
    说明:适用于专有云V3.8~V3.12环境。

1.2. 用户告知

  • 适用平台:x86
  • 授权级别:L2(二线技术支持工程师)
  • 临时或固化方案:临时
  • 操作复杂度:低
  • 预估执行时长:20分钟
  • 业务影响:否
    说明
    • 设置参数不影响平台管控正常运行。
    • 设置参数不影响用户业务正常运行。
  • 风险等级:低

2. 问题描述

在使用RDS for MySQL 5.7的时候,高并发场景下,有可能会触发MySQL5.7的Bug,导致宕机,临时的紧急修复方法可根据本方案针对实例进行参数的修改。Bug的详细信息请参见Bug #77588Bug #100771

3. 解决方案

3.1. 环境检查

  1. 登录到宕机实例所在的物理机,执行以下命令,查看并记录实例的版本信息。如果版本低于mysql57_20190815,则会存在这个Bug。
    cat /etc/my[$Port].cnf |grep basedir
    说明:[$Port]为实例端口号。
    系统显示类似如下。
  2. 登录故障实例,执行以下操作,查询并记录以下几个相关参数的值。
    1. 执行以下SQL语句,查看innodb_stats_auto_recalc参数的值。
      show variables like '%innodb_stats_auto_recalc';
      系统显示类似如下。
    2. 执行以下SQL语句,查看innodb_satats_persistent参数的值。
      show variables like '%innodb_satats_persistent%';
      系统显示类似如下。
    3. 执行以下SQL语句,查看innodb_spin_wait_delay参数的值。
      show variables like '%innodb_spin_wait_delay%';
      系统显示类似如下。
    4. 执行以下SQL语句,查看innodb_sync_spin_loops参数的值。
      show variables like '%innodb_sync_spin_loops%';
      系统显示类似如下。
    5. 执行以下SQL语句,查看table_definition_cache参数的值。
      show variables like '%table_definition_cache%';
      系统显示类似如下。
  3. 在宕机的节点上,进入/home/mysql/data[$Port]/mysql/目录中,查看master-error.log日志文件,获取实例的服务日志,查看该MySQL实例crash的栈。返回的crash的栈是否与下图中一致,如果一致,则说明遇到的是MySQL5.7的并发Bug。

3.2. 实施步骤

  1. 登录到宕机的RDS数据库,分别在RDS的主备实例中执行以下SQL语句,修改相应的参数。
    set global innodb_stats_auto_recalc=off;
    set global innodb_stats_persistent=off;
    set global innodb_spin_wait_delay=6;
    set global innodb_sync_spin_loops=30;
  2. 登录RDS运维管理控制台,单击实例名,进入实例基本信息页面,单击左侧的实例参数设置
  3. 单击读写参数(不需要重启数据库),查找table_definition_cache参数,修改参数值为3000,单击保存,会自动触发针对该实例的一个配置更新任务。
  4. 实例变更记录页面,找到相关任务,观察任务的进度,确认进度100%,说明任务完成。

3.3. 结果验证

登录RDS的主备实例,查询相关参数是否修改成功,具体操作如下:

  1. 执行以下SQL语句,查看innodb_stats_auto_recalc参数的值。
    show variables like '%innodb_stats_auto_recalc';
    系统显示类似如下。
  2. 执行以下SQL语句,查看innodb_satats_persistent参数的值。
    show variables like '%innodb_satats_persistent%';
    系统显示类似如下。
  3. 执行以下SQL语句,查看innodb_spin_wait_delay参数的值。
    show variables like '%innodb_spin_wait_delay%';
    系统显示类似如下。
  4. 执行以下SQL语句,查看innodb_sync_spin_loops参数的值。
    show variables like '%innodb_sync_spin_loops%';
    系统显示类似如下。
  5. 执行以下SQL语句,查看table_definition_cache参数的值。
    show variables like '%table_definition_cache%';
    系统显示类似如下。

4. 回滚方案

参见实施步骤,将参数更新为环境检查第2步中记录的参数值。