<返回更多

数据库硬盘空间可用小于90%解决的方案

2022-08-09    星锅说事
加入收藏

一.问题描述

我司在某云的MySQL数据库占硬盘空间大于90%,RDS空间总空间为 700G,表A分析之后。某渠道统计的表有5亿,单表空间超过350G。

服务器架构:一主多从。

报警截图:

二.处理流程 1.解决方法一:

钞能力,增加RDS硬盘空间,剧终!但是会有大表查询效率问题,数据到达一定量还是需要会出现同样的问题。


2.解决方法二:

  1.  

    备份表A(mysqldump、xtrabackup等)

     

  2.  

    跟研发沟通,新建相同表结构B,将业务数据写入表B中,跑一段时间无问题。【实际业务中,将此表按月分表】

     

  3.  

    截断表A,释放硬盘空间(不会导致主从延迟)。

     

  4.  

    定时任务:定期备份删除过期数据。

     


涉及到的知识点:

 

mysql备份(鄙视一下某云,某云备份居然还要收费)。

截断表是否会导致主从延迟(不会)。


表空间分析


mysqldump 备份命令 mysqldump -u 用户名 -h 数据库地址 -p '密码' --opt 数据库名 表名 > /data/备份文件名.sql

备份表的时候报错:

mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `XXXXX` at row: 686431

有报错,于是发工单,某云客服推荐使用DMS导出

备份的时候影响小部分性能,但是免费居然超过免费额度。本着能免费,为啥要收费呢, 真的是无语了,浪费几个小时!

导出失败: 您当前使用的数据库实例管控模式为“自由操作”,已超出免费额度1,000,000。如您需要继续操作请调整实例管控模式为“稳定变更”、“安全协同”后再进行

域名是修改数据库配置,再用mysqldump 将表导出。

.NET_read_timeout:30
net_write_timeout:60

于是把这个参数修改为:

net_read_timeout:288000
net_write_timeout:288000

修改数据库配置

再用mysqldump导出数据库,等了将近十几个小时之后终于备份成功,大小为193G

mysqldump -u 用户名 -h 数据库地址 -p '密码' --opt 数据库名 表名 > /data/备份文件名.sql

新上一张表

实际在跟研发沟通,按月来做分表。比如:表名+日期 table_2208

截断表之后的硬盘总大小

删除表和截断表命令之间的区别

表删除包括表的定义和关联对象(规则、索引、约、触发器、主键,等)。很明显,一旦表被删除,那么表中包含的所有的数据行都会被一同删除。

truncate 命令则仅仅删除了表中所有的数据行。表的结构和所有的索引仍然继续存在,直到你输入删除表的命令(如上所述)。绑定到列上的规则、默认值、约束仍然继续绑定,并且触发器也仍然起作用。

截断表命令还会回收所有索引的分配页。

截断表的执行速度与不带where子句的delete(删除)命令相同,甚至比它还要快。delete(删除) 一次删除一行数据,并且将每一行被删除的数据都作为一个事务记录日志;而truncate (截断)表则回收整个数据页,只记录很少的日志项。delete(删除)和truncate(截断)都会回收被数据占用的空间,以及相关的索引。只有表的拥有者可以截断表。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>