参考链接: Mysql空间清理,最硬核
1.查看文件磁盘占用
1.1 查看磁盘空间占用
df -lh
1.2 查看目录空间占用
找到mysql的数据目录,可以看到binlog文件占用空间较多
du -sh ./*
2.Binlog日志清理
2.1.定时自动清理Binlog日志
show variables like '%expire_logs_days%'; --mysql 5.7
show variables like '%binlog_expire_logs_seconds%'; --mysql8.0
# mysql5.7
# 这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时生效:
set global expire_logs_days=10;
# mysql8.0
# mysql8开始 expire_logs_days 废弃 启用binlog_expire_logs_seconds设置binlog自动清除日志时间
# 保存时间 以秒为单位;默认2592000 30天
# 14400 4小时;86400 1天;259200 3天;
set global binlog_expire_logs_seconds=86400;
2.2 手动删除Binlog日志
# 第一步:登陆进入mysql,并使用 show binary logs; 查看日志文件,可以看到与之前服务器内的文件一致。
show binary logs;
# 查看正在使用的日志文件:show master status;
show master status;
# 当前正在使用的日志文件是binlog.000079,那么删除日志文件的时候应该排除掉该文件。删除日志文件的命令如下
purge binary logs to 'binlog.000079';
# 删除除binlog.000079以外的日志文件,也可以指定其他文件名,例如binlog.000001。删除后就能释放大部分空间。
2.3.Slow日志清理
# 步骤一 查看slow日志模式
show variables like 'log_output%';
# 步骤二 查看Slow日志文件位置
show variables like '%slow%';
# 步骤三 清空Slow日志
echo "">/var/lib/docker/overlay2/208f8ec99ffb5b103e7593fc54fcce1920faa6b57fb0056c3ffe9d8947031b1f/merged/usr/mysql/data
m/860a723cdf9b-slow.log #因为我是docker启动的mysql所以目录很长
2.3.Error日志清理
mysql开启错误日志的方法
MySQL8.0错误日志Error log介绍
#步骤一 查看error日志位置
show variables like 'log_error';
#步骤二 查看error日志大小
ll -h ./mysql_error.log
#步骤三 清空error日志
echo "">./mysql_error.log
3.表清理
- 大表,指单个数据文件磁盘占用大于100G,或者单个表数据记录量大于1亿。
3.1.查看表占空间和记录数
#查看所有数据库各表容量大小
select
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
-- where table_schema='test'
order by data_length desc, index_length desc;
3.1.常规表数据清理
#常规表指没达到大表标准的。
#Delete语法:
Delete from table_name [ where condition];
#Delete 只删除符合条件的数据,不会减少表所占空间。
#Delete 大量数据后,会存在碎片,需要整理回收碎片空间
optimize table table.name; #或者
alter table table.name engine='innodb'; #(会锁表,注意在业务低谷期执行)
#Truncate语法:
Truncate table table_name;
#Truncate 删除全表数据,回收所占表空间。
#Drop语法:
Drop table table_name;
#Drop 删除全表数据和表结构,回收所占表空间。