MySQL表碎片清理

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;

實現不停業務,對碎片進行清理。

相關文章
相關標籤/搜索