小结:

1、避免并行大大事务对磁盘、内存的消耗;

MySQL数据文件导致实例空间满的解决办法_空间/内存_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/101642.html

MySQL实例可能会由于查询语句的排序、分组、关联表产生的临时表文件,或者大事务未提交前产生的binlog cache文件,导致实例空间满,为避免数据丢失,RDS会对实例进行自动锁定,磁盘锁定之后,将无法进行写入操作。

查看数据库的文件大小,分析其中可以删除的历史数据文件或无用数据文件。

SELECT file_name, concat(TOTAL_EXTENTS,'M') as 'FIle_size' FROM INFORMATION_SCHEMA.FILES  order by TOTAL_EXTENTS 

MySQL Binlog日志的生成和清理规则_数据备份/恢复_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/41815.html

Binlog日志的生成规则

MySQL实例空间内生成binlog日志的规则如下:

  • 通常情况下,当前binlog大小超过500MB或超过6小时会切换到下一序号文件继续写入,即写满500MB或超过6小时就会生成新的binlog日志文件。新的binlog文件继续写入,老的binlog文件并不会立刻上传,会异步上传。

  • 有些情况下,binlog日志不满500MB就不再写入,比如由于命令的执行、系统重启等原因。

  • 有些情况下,会出现binlog文件尺寸超过500MB的情况,比如当时在执行大事务,不断写入binlog导致当前binlog文件尺寸超过500MB。

Binlog日志的保存及清理规则

MySQL实例的空间内默认清理binlog日志的规则如下:

  • 实例空间内默认会保存最近18个小时内的binlog文件。

  • 当实例使用空间小于购买空间的80%时,系统会保存购买空间的30%的binlog(即使该binlog文件已经上传到OSS内)。

  • 当实例使用空间超过购买空间的80%时,binlog会在上传到OSS后,发起删除本地数据的请求,但本地删除会有任务调度,有一定延迟。

  • Binlog文件上传到OSS后,才可以在RDS控制台上显示。查看步骤如下:

    1. 登录RDS管理控制台

    2. 选择要管理的实例所在的地域。

    3. 单击目标实例右的ID,进入基本信息页面。

    4. 在左侧导航栏中,选择备份恢复,进入备份恢复页面。

    5. 选择日志备份标签页,即可查看已上传的binlog日志。

  • Binlog日志在后台生成,可在RDS控制台中下载,大概需要30~60分钟,如果binlog文件较大,所需时间更长。

后续维护

对于经常有delete操作的表,容易产生数据空洞,可以在业务低峰期使用optimize table <数据库名>.<表名>回收空间。

后续维护

    • 针对查询产生的临时文件,应该优化SQL语句,避免频繁使用 order by、group by 操作,可以适当调大tmp_table_size和max_heap_table_size,但是为了减少磁盘使用而调高 tmp_table_size 和 max_heap_table_size 并不明智,因为内存资源远比磁盘资源宝贵;可以通过explain+SQL语句查看是否使用内部临时表,在 Extra 字段中有 Using temporary 字样的代表会使用内部临时表。示例如下:

       
      explain select * from alarm group by created_on order by default;

    • 针对binlog cache,应该少执行大事务,尤其应该减少在多个连接同时执行大事务,如果大事务比较多,可以适当调大binlog_cache_size,但是同样不应该为了节省磁盘调整这个参数,使用短连接执行大事务可以有效降低临时空间开销。
 
 
 
现场:
中午对同张表的补数据时,并行大事务提交导致临时文件激增消耗500G的有限空间。;<1>刚才又删除了多余数据后,现在是500G用了约70%;<2>空间回收优化的sql还在执行中,会进一步降低利用率;<3>程序这边今后也避免对单张大表的并行大事务提交;