mysql 5.7自动建立分区表 已有表改成分区表

自动创建新的分区表

-- 创建一张管理分区的表
CREATE TABLE `t_bfi_partition` (
  `sysId` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键自增序列',
  `table_schema` varchar(100) DEFAULT NULL COMMENT '库',
  `table_name` varchar(100) DEFAULT NULL COMMENT '表名',
  `partition_type` int(11) DEFAULT NULL COMMENT '表分区类型0:日 1:月 没用上',
  PRIMARY KEY (`sysId`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8 COMMENT='分区管理表 ';
-- 创建一个空的分区表
CREATE TABLE `test` (
  `seq` varchar(20) NOT NULL COMMENT '映射编号',
  `version` varchar(8) NOT NULL COMMENT '版本号',
  `type` smallint(7) DEFAULT NULL COMMENT '基础信息类型',
  `name` varchar(200) DEFAULT NULL COMMENT '名称',
  `hex` varchar(10) DEFAULT NULL COMMENT 'HEX 编码字符串',
  PRIMARY KEY (`seq`,`version`),
  UNIQUE KEY `id_UNIQUE` (`seq`,`version`),
  KEY `idx_version` (`version`,`type`),
  KEY `idx_hex` (`hex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='基础信息映射表'
 PARTITION BY LIST  COLUMNS(version)
(PARTITION p20210106 VALUES IN ('20210303','20210304','20210305','20210306') ENGINE = InnoDB;

-- 插入到管理分区的表中
INSERT INTO `library`.`t_bfi_partition`(`sysId`, `table_schema`, `table_name`, `partition_type`) VALUES (1, 'library', 'test', 0);

-- 创建一个函数
CREATE DEFINER=`root`@`%` PROCEDURE `add_partition`()
BEGIN
   -- 定义需要用到的变量
   DECLARE v_sysdate date;
   DECLARE v_mindate date;
   -- 分区值
   DECLARE v_pt1 varchar(20);
   DECLARE v_pt2 varchar(20);
   DECLARE v_pt3 varchar(20);
   DECLARE v_pt4 varchar(20);

   DECLARE partitionName varchar(20);
   DECLARE v_maxval varchar(20);
   DECLARE i int;
  
   DECLARE tableschema VARCHAR(255);
   DECLARE tablename VARCHAR(255);
   DECLARE v_maxdate date;
    
  -- 遍历数据结束标志
   DECLARE done INT  DEFAULT FALSE;
  -- 定义游标  查询出分区表对应的数据信息
   DECLARE cur CURSOR FOR 
    SELECT
        a.table_schema, a.table_name, 
        max(cast( REPLACE ( substring_index( partition_description, ',',- 1 ), '''', '' ) AS date )) AS val 
    FROM
        INFORMATION_SCHEMA.PARTITIONS a, fhboot.T_BFI_PARTITION b 
    WHERE
        a.table_schema = b.table_schema AND a.table_name = b.table_name  AND b.partition_type = 0 
    GROUP BY  table_schema,table_name;
    -- 将结束标志绑定到游标
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
   -- 打开游标,开始处理新增分区
   OPEN cur;
   read_loop: LOOP
    -- 提取游标里的数据,分别对应上面sql查询的3个属性
     FETCH cur INTO tableschema,tablename,v_maxdate; 
      set v_sysdate = sysdate();
        -- 如果最大分区的值 小于等于当前时间加2天的值 就循环创建分区
      WHILE v_maxdate <= (v_sysdate + INTERVAL 2 DAY) DO
        -- 这里是用List分区 4天为一个分区 所以4个值  对应在上方定义的变量
        SET v_pt1 = date_format(v_maxdate+ INTERVAL 1 DAY ,'%Y%m%d');
        SET v_pt2 = date_format(v_maxdate+ INTERVAL 2 DAY ,'%Y%m%d');
        SET v_pt3 = date_format(v_maxdate+ INTERVAL 3 DAY ,'%Y%m%d');
        SET v_pt4 = date_format(v_maxdate+ INTERVAL 4 DAY ,'%Y%m%d');
        SET partitionName = date_format(v_maxdate + INTERVAL 4 DAY, '%Y%m%d');
        --拼接sql语句 
        SET @sql = concat('alter table ',tableschema,'.',tablename,' add partition (partition p', partitionName, ' values in(''', v_pt1, ''',''', v_pt2, ''',''', v_pt3, ''',''', v_pt4, '''))');
        -- SELECT @sql;  -- 需要打印sql就放开
        PREPARE stmt FROM @sql;
        EXECUTE stmt; 
        DEALLOCATE PREPARE stmt;
        -- select v_maxdate;
        -- 循环的条件变更 这里对应上面的天数
        SET v_maxdate = v_maxdate + INTERVAL 4 DAY;     
      END WHILE;
  
    -- 结束循环后 打印
    IF done THEN
            SELECT v_maxdate,'done';
      LEAVE read_loop;
    END IF;
    END LOOP;
    close cur;

END
-- 创建事件 每天执行
CREATE DEFINER=`root`@`%` EVENT `Partition_add_event` ON SCHEDULE EVERY 1 DAY STARTS '2021-03-08 18:10:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN  
          CALL library.add_partition();  
  END

在旧表改成分区表

--    有主键 要先删除主键 
ALTER TABLE `表名test` 
-- 设置新的分区建  并建立联合主键
MODIFY COLUMN `time` datetime  NOT NULL ,
DROP PRIMARY KEY,
ALTER TABLE `trc_laneexlist`  ADD PRIMARY KEY (`id` , `time`) USING BTREE;


-- 创建range分区表的 time作为分区键 
alter TABLE `表名test`  
PARTITION BY RANGE  COLUMNS(time)
(
 PARTITION p20210308 VALUES LESS THAN ('2021-03-08') ENGINE = InnoDB,
 PARTITION p20210309 VALUES LESS THAN ('2021-03-09') ENGINE = InnoDB
);

分区相关命令

-- 统计分区中的数据数量
select count(*) from test partition (p20200708);
-- 删除分区
ALTER TABLE  test DROP  PARTITION p20200708
-- 增加分区
ALTER TABLE test ADD PARTITION (PARTITION p20200908 VALUES LESS THAN ("2020-09-08") )
-- 查看库下面所有分区
select TABLE_NAME,PARTITION_NAME from information_schema.partitions where table_schema='branchdb';
-- 把上面的tb05表中分解的p01和p02合并至p1上
alter table test reorganize partition p01,p02 into(partition p1 values less than (1000));
-- 整理分区碎片
ALTER TABLE test optimize partition p20200712,p20200713;
-- 修补分区索引数据 
ALTER TABLE tb04 CHECK partition p1,p2;
-- 复制分区的数据到his表中
INSERT INTO test_his  SELECT  * FROM  test  PARTITION ( p20210309 )
-- 创建存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `backUp_partition_test`()
BEGIN   
DECLARE v_sysdate date;   
DECLARE v_mindate date;      
DECLARE v_pt varchar(20);   
DECLARE v_maxval varchar(20);   
DECLARE kubiaoName varchar(50);   
DECLARE i int;      
DECLARE tableschema VARCHAR(255);  
DECLARE tablename VARCHAR(255);  
DECLARE partitionname VARCHAR(255);  
DECLARE v_maxdate date;    
DECLARE done INT  DEFAULT FALSE;     
-- 获取表对应的分区时间和名字
DECLARE cur CURSOR FOR SELECT a.table_schema,a.table_name,min(PARTITION_NAME) as partitionname,min(cast(replace(partition_description, '''', '') AS date)) AS val  FROM   INFORMATION_SCHEMA.PARTITIONS a,branchdb.T_BFI_PARTITION b where a.table_schema=b.table_schema and a.table_name=b.table_name and b.partition_type=0  group by table_schema,table_name having count(1)>1;   
DECLARE CONTINUE HANDLER FOR NOT FOUND 
        
SET done = TRUE;   OPEN cur;   read_loop: 
LOOP  FETCH cur INTO tableschema,tablename,partitionname,v_maxdate;  
SET v_sysdate = cast(sysdate()  AS date);  
SET kubiaoName = concat(tableschema,'.',tablename);

-- 同步分区数据到his
IF v_maxdate <= (v_sysdate - INTERVAL 60 DAY) THEN
 SET @sql = concat('INSERT INTO ',kubiaoName,'_his ',' SELECT  * FROM ',kubiaoName,' PARTITION  (',partitionname,')');      
 PREPARE stmt FROM @sql;      
 EXECUTE stmt;      
 DEALLOCATE PREPARE stmt;     

-- 删除分区数据
SET @sql_dpop = concat('ALTER TABLE ',kubiaoName,' DROP  PARTITION ',partitionname);
PREPARE stmt2 FROM @sql_dpop;      
EXECUTE stmt2;      
DEALLOCATE PREPARE stmt2;     
END IF;

IF done THEN             
SELECT 'done';       
LEAVE read_loop;     
END IF;

END LOOP;  
close cur;  
END



-- 创建定时任务
CREATE  EVENT backUp_partition_success ON SCHEDULE EVERY 1 DAY STARTS '2020-08-14 00:02:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN  
     CALL branchdb.backUp_partition();        
END
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容