zoukankan      html  css  js  c++  java
  • MySQL表碎片清理

    MySQL大表清理

    生产环境data库业务表base_data大小:500G,data_free:31G

    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;

     

    mysql> show create table base_dataG;

    *************************** 1. row ***************************

           Table: base_data

    Create Table: CREATE TABLE `base_data` (

      `id` bigint(20) NOT NULL AUTO_INCREMENT,

      `method` varchar(50) NOT NULL COMMENT '区分具体操作',

      `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

      `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;

    实现不停业务,对碎片进行清理。

  • 相关阅读:
    事件的截获
    页面嵌入dom与被嵌入iframe的攻防
    如何在windows下安装JDK
    Java and C# Comparison
    利用hadoop来解决“单表关联”的问题
    Oracle10GODP连接11G数据库,出现ORA
    sql 2005出现错误:数据库 'Twitter' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
    MapReduce 模式、算法和用例
    利用hadoop来解决“共同好友”的问题
    部署hadoop的开发环境
  • 原文地址:https://www.cnblogs.com/elontian/p/10132946.html
Copyright © 2011-2022 走看看