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 MySQL 5.5、5.6,不支持清理undo文件,建议将实例升级至RDS MySQL 5.7、8.0版本。详细操作请参见升级数据库版本。
如果您计划将实例升级至RDS MySQL 5.7版本时,请选择高可用系列。该系列的
innodb_undo_tablespaces
取值为2,允许使用独立的undo表空间存储undo数据,可以进行清理。
后续维护
减少并及时优化慢SQL。
尽量在业务低峰期进行索引创建删除、表结构修改、表维护和表删除操作。
监控和清理执行时间过长的会话或事务。详情请参见查看监控信息。
相关文档
您可以同时排查和清理数据文件、临时文件、Binlog文件,解决实例存储空间满的问题。
开启自治功能,避免undo文件增长过快导致实例锁定。