近期整理数据库堆积了三年多的数据,将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';

查看当前占用空间,可与之前记录下来的做比较。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐