共计 1326 个字符,预计需要花费 4 分钟才能阅读完成。
数据库硬盘空间可用小于 90% 解决方案
一. 问题描述
我司在某云的 MySQL 数据库占硬盘空间大于 90%,RDS 空间总空间为 700G,表 A 分析之后。某渠道统计的表有 5 亿,单表空间超过 350G。
服务器架构:一主多从。
报警截图:
二. 处理流程
1. 解决方法一:
钞能力,增加 RDS 硬盘空间,剧终!但是会有大表查询效率问题,数据到达一定量还是需要会出现同样的问题。
2. 解决方法二:
- 备份表 A(mysqldump、xtrabackup 等)
- 跟研发沟通,新建相同表结构 B,将业务数据写入表 B 中,跑一段时间无问题。【实际业务中,将此表按月分表】
- 截断表 A,释放硬盘空间(不会导致主从延迟)。
- 定时任务:定期备份删除过期数据。
涉及到的知识点:
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(截断)都会回收被数据占用的空间,以及相关的索引。只有表的拥有者可以截断表。