首页 > 数据库 >mysql分区

mysql分区

时间:2024-07-16 14:51:17浏览次数:18  
标签:分区 PARTITION hist ens rb mysql table accr

-- 1. 分区相关
-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE ens_rb.add_partitions_by_day(in table_name varchar(30), start_str varchar(30), end_str varchar(30))
BEGIN
        declare start_d date default DATE_FORMAT(start_str, '%Y-%m-%d');
        declare end_d date default DATE_FORMAT(end_str, '%Y-%m-%d');

    WHILE start_d < end_d DO
        SET @sql = CONCAT('ALTER TABLE ', table_name, ' ADD PARTITION (PARTITION p', REPLACE(start_d, '-', ''), ' VALUES LESS THAN (TO_DAYS("', start_d, '")))');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

        SET start_d = DATE_ADD(start_d, INTERVAL 7 day);
    END WHILE;
END$$

DELIMITER ;


-- 删除已有分区
alter table ens_rb.rb_accr_hist drop PARTITION p202409;
alter table ens_rb.rb_accr_hist drop PARTITION p202410;
alter table ens_rb.rb_accr_hist drop PARTITION p202411;
alter table ens_rb.rb_accr_hist drop PARTITION p202412;
alter table ens_rb.rb_accr_hist drop PARTITION p202501;


-- 批量创建分区
call add_partitions_by_day('ens_rb.rb_accr_hist', '20240807', '20260101');


-- 2. 备份数据

-- 复制表
create table ens_rb.rb_accr_his_bak like ens_rb.rb_accr_hist;

-- 数据迁移
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202310);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202311);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202312);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202401);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202402);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202403);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202404);
insert into ens_rb.rb_accr_his_bak select * from ens_rb.rb_accr_hist partition(p202405);

-- 3. 删除分区数据
alter table ens_rb.rb_accr_hist drop PARTITION p202310;
alter table ens_rb.rb_accr_hist drop PARTITION p202311;
alter table ens_rb.rb_accr_hist drop PARTITION p202312;
alter table ens_rb.rb_accr_hist drop PARTITION p202401;
alter table ens_rb.rb_accr_hist drop PARTITION p202402;
alter table ens_rb.rb_accr_hist drop PARTITION p202403;
alter table ens_rb.rb_accr_hist drop PARTITION p202404;
alter table ens_rb.rb_accr_hist drop PARTITION p202405;
View Code

 

-- 分区7天
-- 备份到历史表, 只保留最近三个月的数据

-- 创建存储过程
DELIMITER $$
CREATE PROCEDURE add_partitions_by_day(in table_name varchar(30), start_str varchar(30), end_str varchar(30))
BEGIN
        declare start_d date default DATE_FORMAT(start_str, '%Y-%m-%d');
        declare end_d date default DATE_FORMAT(end_str, '%Y-%m-%d');

    WHILE start_d < end_d DO
        SET @sql = CONCAT('ALTER TABLE ', table_name, ' ADD PARTITION (PARTITION p', REPLACE(start_d, '-', ''), ' VALUES LESS THAN (TO_DAYS("', start_d, '")))');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

        SET start_d = DATE_ADD(start_d, INTERVAL 7 day);
    END WHILE;
END$$

DELIMITER ;

call add_partitions_by_day('ens_rb.rb_accr_hist', '202', '20250110');

-- 更新表统计
ANALYZE TABLE ens_rb.rb_accr_hist;
FLUSH TABLES;

-- 查看分区信息
SELECT
    partition_name part,
    partition_expression expr,
    partition_description descr,
    from_days(partition_description),
    table_rows 
FROM
    information_schema.PARTITIONS 
WHERE
    table_schema = 'ens_rb' 
    AND table_name = 'rb_accr_hist';
    
    select min(ACCR_DATE), max(ACCR_DATE) from ens_rb.rb_accr_hist;
 select DATE_FORMAT(ACCR_DATE, '%Y-%m') , count(1) as cnt from  ens_rb.rb_accr_hist group by DATE_FORMAT(ACCR_DATE, '%Y-%m') order by  DATE_FORMAT(ACCR_DATE, '%y-%m')

-- 正式操作流程 ------------------------

select count(1) from rb_accr_hist;     -- 2383643
select count(1) from rb_accr_hist;  -- 2383643
-
-- 删除所有分区
ALTER TABLE ens_rb.rb_accr_hist REMOVE PARTITIONING;

-- 对新表创建分区
ALTER TABLE ens_rb.rb_accr_hist 
PARTITION BY RANGE (TO_DAYS(ACCR_DATE)) (
    PARTITION p20240101 VALUES LESS THAN (TO_DAYS('20240101')),
        PARTITION p20240201 VALUES LESS THAN (TO_DAYS('20240201')),
        PARTITION p20240301 VALUES LESS THAN (TO_DAYS('20240301')),
        PARTITION p20240401 VALUES LESS THAN (TO_DAYS('20240401')),
        PARTITION p20240501 VALUES LESS THAN (TO_DAYS('20240501')),
        PARTITION p20240601 VALUES LESS THAN (TO_DAYS('20240601')),
        PARTITION p20240701 VALUES LESS THAN (TO_DAYS('20240701')),
        PARTITION p20240801 VALUES LESS THAN (TO_DAYS('20240801')),
        PARTITION p20240901 VALUES LESS THAN (TO_DAYS('20240901')),
        PARTITION p20241001 VALUES LESS THAN (TO_DAYS('20241001')),
        PARTITION p20241007 VALUES LESS THAN (TO_DAYS('20241007'))
);

select * from ens_rb.rb_accr_hist partition(p20240301);

select from_days('739495')

-- 删除已有的分区(这里会删除分区的数据)
alter table ens_rb.rb_accr_hist drop PARTITION p20250101;

-- 添加单个分区
ALTER TABLE ens_rb.rb_accr_hist ADD PARTITION (PARTITION p20231001 VALUES LESS THAN (TO_DAYS('20231001')));


-- 批量添加分区
call add_partitions_by_month('ens_rb.rb_accr_hist', '20240714', '20240901');
call add_partitions_by_day('ens_rb.rb_accr_hist', '20241014', '20250101');


-- 分区数据备份
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240101);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240201);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240301);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240401);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240501);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240601);
insert into ens_rb.rb_accr_hist_bak select * from ens_rb.rb_accr_hist PARTITION(p20240701);

select count(1) from ens_rb.rb_accr_hist_bak;
select min(ACCR_DATE), max(ACCR_DATE) from ens_rb.rb_accr_hist_bak;

-- 删除已有的分区(这里会删除分区的数据)
alter table ens_rb.rb_accr_hist drop PARTITION p20240101;
alter table ens_rb.rb_accr_hist drop PARTITION p20240201;
alter table ens_rb.rb_accr_hist drop PARTITION p20240301;
alter table ens_rb.rb_accr_hist drop PARTITION p20240401;
alter table ens_rb.rb_accr_hist drop PARTITION p20240501;
alter table ens_rb.rb_accr_hist drop PARTITION p20240601;
alter table ens_rb.rb_accr_hist drop PARTITION p20240701;
View Code

 

标签:分区,PARTITION,hist,ens,rb,mysql,table,accr
From: https://www.cnblogs.com/cxxjohnson/p/18305221

相关文章

  • Java性能优化-书写高质量SQL的建议(如何做Mysql优化)
    场景Mysql中varchar类型数字排序不对踩坑记录:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139955012为避免开发过程中针对mysql语句的写法再次踩坑,总结开发过程中常用书写高质量sql的一些建议。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现查询......
  • mysql索引与锁
    一.MYSQL索引1.1索引介绍1.1.1索引是什么官⽅方介绍索引是帮助MySQL高效获取数据的数据结构。更更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文......
  • Mysql8.4参考手册走读(四)
    第19章复制MySQL复制支持从一个MySQL数据库服务器(称为source)复制到一个或多个MySQL数据库服务器(称为副本)。默认情况下,复制是异步的,副本不需要永久连接才能接收来自源的更新。根据配置,您可以复制所有数据库、选定的数据库,甚至是数据库中的选定表。MySQL复制的优点包括:......
  • mysql命令行操作显示表属性的类型与修改
        随着工具的进步,类似于Navicat这些可以让mysql具备可视化的软件越来越多。但是为了安全性,并非每一个都可以使用这些工具进行连接,因此掌握一定的mysql命令基础是必备的,本文主要是讲述一下如何查看表中,各个属性的类型,以及如何对其进行修改操作。一:对表进行查询  ......
  • MySQL的意向锁
    InnoDB支持多粒度锁,它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁1、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度的锁并存2、意向锁是一种不与行锁冲突表级锁,这一点非常重要3、表明某个事务正在某些行持有锁或该事务准备去持有锁意向锁通常有两种类型:意向......
  • MySql 创建完表后,进行主键自增的设置、文件上传之后,保存到数据库里(拿到文件名,文件大小
    20240715一、MySql创建完表后,进行主键自增的设置二、文件上传之后,保存到数据库里(拿到文件名,文件大小等文件信息)三、redis缓存更新的模式四、mybatisPlus一、MySql创建完表后,进行主键自增的设置第一种方式:altertable表名changeididintauto_increment;......
  • MySQL增量备份
    增备1做增量备份前,是需要进行一次完成备份的1、做数据修改创建一个add1.t1t1包含:id,name加2条数据id|name|+----+------+|1|add1||2|add2|+----+------+操作如下:MySQLroot@(none):(none)>showdatabases;+--------------------+|Database......
  • MySQL差异备份
    只需准备第一次和最后一次即可1、清理之前的备份内容rm-rf/data/backup/*2、进行完整备份#mkdir-p/data/backup/#xtrabackup--defaults-file=/etc/my.cnf--backup--target-dir=/data/backup/base/-uroot-pLixinyi@123-Hlocalhost-P3306--no-ser......
  • MySQL时间戳转成日期格式
    将时间戳转换为日期格式:--如果时间戳为毫秒级长度为13位,需要先除以1000SELECTid,`task_name`,FROM_UNIXTIME(`task_register_begin_time`/1000,'%Y-%m-%d%H:%i:%s')astask_register_begin_time,FROM_UNIXTIME(`task_register_end_time`/1000,'%Y-%m-%d%H:%i:%s')ast......
  • 基于Java+ Java Swing Mysql 实现的学生宿舍管理系统设计与实现
    一、前言介绍:1.1项目摘要随着高校招生规模的不断扩大,学生宿舍管理面临着越来越多的挑战。传统的学生宿舍管理方式往往依赖于人工记录、纸质档案和口头通知,这种方式不仅效率低下,而且容易出错,给宿舍管理带来了诸多不便。因此,开发一套高效、便捷、准确的学生宿舍管理系统成......