MySQL大表清理mysql
生產環境data庫業務表base_data大小:500G,data_free:31Gsql
mysql> SELECT table_schema,table_name,data_free/1024/1024 AS data_free_MB FROM information_schema.tables WHERE engine LIKE 'InnoDB' AND data_free > 100*1024*1024;orm
mysql> show create table base_data\G;索引
*************************** 1. row ***************************ip
Table: base_datait
Create Table: CREATE TABLE `base_data` (io
`id` bigint(20) NOT NULL AUTO_INCREMENT,table
`method` varchar(50) NOT NULL COMMENT '區分具體操做',form
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,class
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_base_data_ct` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1605027 DEFAULT CHARSET=utf8
根據需求,update_time<='2018-01-01 00:00:00'的數據進行備份並清理該部分數據。經過推算得知,
id列建立主鍵索引,id<=1372421爲須要備份清理的數據。
1:與研發協商,分析base_data表,update_time列能夠根據時間進行數據分隔,而且該列建有索引,須要保留數據爲2018年1月以後的數據,能夠清理的數據爲2018年1月以前的數據
2:根據id列、update_time列,逐次清理2018年1月以前的數據,可按照每次對一季度的數據進行整理,先備份,再進行清理
如:備份刪除id<30,0000的行
mysqldump -uroot -p data base_data --single-transaction --where="id<300000 and update_time <='2018-01-01 00:00:00'" |gzip > /data/backup/base_data.sql.gz
delete from base_data where id<100000 and update_time <='2017-10-01 00:00:00' limit 1000;
delete from base_data where id<200000 and update_time <='2017-10-01 00:00:00' limit 1000;
delete from base_data where id<300000 and update_time <='2017-10-01 00:00:00' limit 1000;
下面進行base_data表碎片整理
3:記錄下當前步驟3中update_time列的時間t1,以及此時的錶行數;將表base_data的2018年1月以後到時間t1的數據導出base_data1.dmp
mysql> select max(id) from base_data;
+---------+
| max(id) |
+---------+
| 1614699 |
+---------+
1 row in set (0.00 sec)
mysql> select min(id) from hl_base_data;
+---------+
| min(id) |
+---------+
| 300100 |
+---------+
1 row in set (0.00 sec)
mysql> select count(id) from base_data where id<300000 and update_time <='2018-01-01 00:00:00';
+-----------+
| count(id) |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
mysqldump -uroot -p data base_data --single-transaction --where="id>=300000 and update_time <='t1'" > /backup/base_data.sql
4:編輯dump文件base_data1.dmp,將base_data更名爲base_data_tmp,將其導入到與data庫同實例下的test庫,此時補充增量數據
mysql> insert into test. base_data_tmp select * from data. base_data where update_time >’t1’;
5:最後
mysql> RENAME TABLE data. base_data to data. base_data_old;
mysql> RENAME TABLE test. base_data_tmp to data. base_data;
實現不停業務,對碎片進行清理。