解决MySQL实例空间满自动锁定的问题

RDS MySQL实例由于慢SQL、插入数据多等原因导致实例空间满,为避免数据丢失,RDS会对实例进行自动锁定,锁定之后,将无法进行写入操作。您可以参照本文清理数据文件、临时文件、Binlog文件、undo文件和general_log文件,解决存储空间问题。

问题描述

阿里云RDS MySQL版实例由于慢SQL、插入数据多等原因导致实例磁盘空间满,为避免数据丢失,实例会自动锁定,且无法进行写入操作,导致在实例详情页面的运行状态为锁定中

常见原因

造成实例空间满的主要原因有以下几种:

  • 数据文件磁盘空间占用高。

  • 日志文件磁盘空间占用高。

    在没有正确设置日志备份策略时,可能会由于大事务SQL导致日志增长较快。

  • 临时文件磁盘空间占用高。

    通常导致临时文件占用高的原因是由于查询语句的排序、分组、关联表产生的临时表文件,或者大事务未提交前产生的日志缓存文件。

  • 系统文件磁盘空间占用高。

    系统文件过大主要是由于undo文件过大。当存在对InnoDB表长时间不结束的查询语句,而且在查询过程中表有大量的数据变化时,系统会生成大量的undo信息,占用大量存储空间。

    说明

    对于RDS MySQL 8.0,系统会自动清理undo文件,不会出现此问题。

  • general_log文件磁盘占用高。

    当RDS MySQL开启了general_log后,该文件记录了用户的所有操作,包括每条SQL语句的执行细节,无论是查询、插入、更新还是删除操作。当访问量大或者长时间不清理general_log文件时,会占用大量的存储空间,导致存储空间耗尽。您可以通过如下方法确认general_log文件大小。

    1. 查看实例存储空间使用量,判断sys_data_size文件是否过大。详情请参见查看监控信息

    2. 查看实例是否已开启general_log(运行参数值为ON)。详情请参见查看实例参数

    3. 连接RDS MySQL实例并执行如下语句,查询general_log文件大小。连接实例的详细请参见连接RDS MySQL实例

      SELECT table_schema AS '数据库', table_name,SUM(data_length + index_length + data_free)/1024/1024 AS "表大小MB",SUM(DATA_FREE)/1024/1024 AS "碎片大小MB"
      FROM information_schema.TABLES
      WHERE table_name='general_log'
      说明
      • 此SQL语句会从information_schema 数据库的TABLES表中检索mysql.general_log表的数据,然后将其转换成以MB为单位的大小。

      • 此SQL语句获得的数据为抽样数据,和实际数据存在一定误差。

解决办法

执行以下步骤,定位问题并按照对应的解决方法处理:

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
  2. 在左侧导航栏中单击监控与报警,查看占用存储空间的文件类型。详情请参见查看监控信息

  3. 选择对应的解决方法:

    说明

    清理磁盘空间后,需要耐心等待一段时间(5~15分钟左右),RDS实例才会解锁。