MySQL 删除表数据,释放空间
近期整理数据库堆积了三年多的数据,将19年之前的数据(大概十几万条,也不是很多居然……)删除,只保留今年的数据,也仅仅释放出了500MB左右。
第一步:先查看了一下占用磁盘空间较多的几张表
SELECT TABLE_NAME, CONCAT(TRUNCATE(data_length/1024/1024,2),' MB') AS data_size,
CONCAT(TRUNCATE(index_length/1024/1024,2),' MB') AS index_size
FROM information_schema.tables WHERE TABLE_SCHEMA = 'database_name'
GROUP BY TABLE_NAME ORDER BY data_length DESC
(PS:以后要仔细研究,详细说明,不马虎了,打脸打脸打脸)
mysql在安装成功后,会有四个系统自带的database(可以通过mysql命令>show databases;查看):
| information_schema |
| mysql |
| performance_schema |
| sys |
而查看数据库占用空间(包括数据data和索引index)则是查看information_schema。而关于这四张表的解释,可以参考
https://blog.csdn.net/dj673344908/article/details/80482844
第二步:针对占用空间大的表做清理删除
由于直接操作服务器,非常卡,所以我都是拷在本地,在本地操作,就是试着玩儿的……
Linux服务器备份MySQL数据库:
mysqldump -u userName -p dataBaseName > fileName.sql
将备份的sql文件下载到本地,Windows下MySQL数据库恢复:
mysql -u 用户名 -p 数据库名 < 保存文件.sql
如果上述命令不成功,换一个,好吧,我用的下面的(mysql命令不是一次性执行的,分开执行!):
mysql>
show databases;
create database 数据库名;
use 数据库名;
source 保存文件.sql;
再次显示mysql>即成功
言归正传
之前关于删除数据库数据首先想到是delete,但是delete执行完成后不会释放磁盘空间。(还有一个truncate table语句,但是这个是删除整张表的数据,由于整个操作不会记录日志,因为时间要比delete删除整张表快。且delete可以添加删除条件,truncate不支持)。
因此通过drop表的方式删除。一大批命令呈上来:
create table temp_table like drop_table;
insert into temp_table select * from drop_table where time >= '2019-01-01 00:00:00';
drop table drop_table;
alter table temp_table rename to drop_table;
>首先创建一个新表(temp_table),格式和要删除的表(drop_table)一样
>然后将要保留的数据放在临时表(temp_table)中
>将旧表删掉
>将临时表重命名为旧表名称
表中可能会有外键,删除的时候会ERROR提示,以下:
SELECT @@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
第一行命令查看外键约束是否打开,1是打开,0是关闭,删除的时候如果是1会报错,通过第二行命令修改为0,删除成功之后再改回1。
第三步:执行完成
执行完成后如果想查看某个表空间占用是否变小:
select concat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB, concat(round(sum(index_length/1024/1024),2),'MB') as index_length_MB from information_schema.tables where table_schema='database_name' AND table_name='drop_table';
查看当前占用空间,可与之前记录下来的做比较。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)