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文件大小。
查看实例存储空间使用量,判断sys_data_size文件是否过大。详情请参见查看监控信息。
查看实例是否已开启general_log(运行参数值为ON)。详情请参见查看实例参数。
连接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语句获得的数据为抽样数据,和实际数据存在一定误差。