文档

MySQL系统文件导致实例空间满的解决方法

更新时间:

RDS MySQL实例系统文件(主要是undo文件)过大,使存储空间占满,导致实例自动锁定时,您可以参照本文的指引来解锁并清理undo文件。

问题描述

RDS MySQL实例存储空间满,实例运行状态锁定中。在监控与报警中,查看实例存储空间使用量,undo文件过大。

问题原因

系统文件过大主要是由于undo文件过大。当存在对InnoDB表长时间不结束的查询语句,而且在查询过程中表有大量的数据变化时,系统会生成大量的undo信息,占用大量存储空间,导致存储空间耗尽。为避免数据丢失,RDS会自动锁定实例,实例运行状态显示为锁定中

说明

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

解决方法

步骤一:解锁实例

扩容实例存储空间后可解锁实例。扩容存储空间的详细操作请参见变更配置

步骤二:清理undo文件

  • 对于RDS MySQL 5.7

    连接RDS MySQL实例并执行如下语句,查询innodb_undo_tablespaces参数的值。如何连接实例,请参见连接RDS MySQL实例

    SHOW VARIABLES LIKE 'innodb_undo_tablespaces';
    • innodb_undo_tablespaces取值为2时,表示实例允许使用独立的undo表空间存储undo数据,可以进行清理。

      当undo文件大小超过innodb_max_undo_log_size参数值且其中的日志不再被任何活动的事务所需要时,系统会对undo文件进行truncate操作,清理过大的文件并释放空间。如何开启参数,请参见设置实例参数

      说明

      innodb_undo_tablespaces参数只能在实例创建时指定,创建后不再允许修改。因此对于早期已创建的RDS MySQL 5.7实例,由于创建时未指定,此时若innodb_undo_tablespaces=0则无法通过升级内核小版本切换到独立undo表空间模式。

    • innodb_undo_tablespaces取值为0时,表示不使用独立的undo表空间,undo文件存储在系统表空间ibdata1中,不可以进行清理。

      如果您希望清理这部分数据,您可以创建新的实例并迁移数据,或者将实例升级至RDS MySQL 8.0版本。详细操作请参见升级数据库版本

      重要
      • 升级数据库版本可能存在兼容性问题,请仔细阅读升级数据库版本中的功能限制和版本差异。

      • 数据库迁移或升级过程中,RDS会进行实例切换,请您尽量在业务低峰期执行迁移或升级操作,并确保您的应用有自动重连机制。实例切换的影响请参见实例切换的影响

  • 对于RDS MySQL 5.5、5.6,不支持清理undo文件,建议将实例升级至RDS MySQL 5.7、8.0版本。详细操作请参见升级数据库版本

    如果您计划将实例升级至RDS MySQL 5.7版本时,请选择高可用系列。该系列的innodb_undo_tablespaces取值为2,允许使用独立的undo表空间存储undo数据,可以进行清理。

    重要
    • 升级数据库版本可能存在兼容性问题,请仔细阅读升级数据库版本中的功能限制和版本差异。

    • 数据库升级过程中,RDS会进行实例切换,请您尽量在业务低峰期执行升级操作,并确保您的应用有自动重连机制。实例切换的影响请参见实例切换的影响

后续维护

  • 减少并及时优化慢SQL。

  • 尽量在业务低峰期进行索引创建删除、表结构修改、表维护和表删除操作。

  • 监控和清理执行时间过长的会话或事务。详情请参见查看监控信息

相关文档