Google Cloud SQL MySQL 8实例存储空间每日大幅增长问题求助
排查方向
- 检查InnoDB undo表空间占用:执行
SELECT tablespace_name, file_size/1024/1024/1024 AS size_gb FROM information_schema.files WHERE file_type = 'UNDO LOG';,如果undo空间远大于1GB,可定位是未purge的undo日志导致- 关联检查长事务:执行
SELECT trx_id, trx_started, TIMESTAMPDIFF(HOUR, trx_started, NOW()) AS trx_running_hours, trx_mysql_thread_id FROM information_schema.innodb_trx ORDER BY trx_started ASC;,运行超过24小时的长事务会阻塞undo日志回收,导致空间持续上涨
- 关联检查长事务:执行
- 检查InnoDB系统表空间ibdata1大小:执行
SELECT file_size/1024/1024/1024 AS ibdata1_size_gb FROM information_schema.files WHERE tablespace_name = 'innodb_system';,你未开启innodb_file_per_table,所有表数据、索引、未独立存储的undo日志都存在这个文件中,即使删除数据文件也不会自动释放空间,高频写入删除操作会导致文件持续膨胀 - 检查Cloud SQL日志保留配置:在实例控制台详情页查看慢查询日志、错误日志、审计日志的保留天数,未配置轮转或保留天数过长的日志会占用大量实例存储
- 检查临时表空间占用:执行
SELECT file_size/1024/1024/1024 AS tmp_size_gb FROM information_schema.files WHERE tablespace_name = 'innodb_temporary';,大量排序、聚合类慢查询会生成大型临时表,若MySQL未正常回收也会导致空间上涨 - 检查实例残留临时文件:通过Cloud SQL的「诊断」标签页查看文件系统各目录占用,确认是否有未清理的备份、导入导出操作残留的临时文件
解决建议
- 若为长事务导致undo膨胀:先终止无用的长事务,等待undo日志自动purge,若purge速度慢可适当调大
innodb_purge_batch_size参数 - 若为ibdata1膨胀:这是未开启innodb_file_per_table的已知问题,需通过数据迁移恢复空间:
- 全量备份所有数据库
- 新建Cloud SQL实例,开启
innodb_file_per_table参数 - 将备份恢复到新实例,原ibdata1的冗余空间会在恢复过程中自动释放
- 若为日志占用过高:调整日志保留天数为3~7天,开启日志自动轮转,也可配置日志导出到对象存储降低成本
- 若为临时表空间或残留临时文件占用过高:重启实例即可释放占用空间,同时优化慢查询减少大型临时表的生成
内容的提问来源于stack exchange,提问作者Thien Nguyen
相关产品推荐
相关产品推荐

