mysql 5.7自動建立分區(qū)表 已有表改成分區(qū)表

自動創(chuàng)建新的分區(qū)表

-- 創(chuàng)建一張管理分區(qū)的表
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 '表分區(qū)類型0:日 1:月 沒用上',
  PRIMARY KEY (`sysId`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8 COMMENT='分區(qū)管理表 ';
-- 創(chuàng)建一個空的分區(qū)表
CREATE TABLE `test` (
  `seq` varchar(20) NOT NULL COMMENT '映射編號',
  `version` varchar(8) NOT NULL COMMENT '版本號',
  `type` smallint(7) DEFAULT NULL COMMENT '基礎(chǔ)信息類型',
  `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='基礎(chǔ)信息映射表'
 PARTITION BY LIST  COLUMNS(version)
(PARTITION p20210106 VALUES IN ('20210303','20210304','20210305','20210306') ENGINE = InnoDB;

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

-- 創(chuàng)建一個函數(shù)
CREATE DEFINER=`root`@`%` PROCEDURE `add_partition`()
BEGIN
   -- 定義需要用到的變量
   DECLARE v_sysdate date;
   DECLARE v_mindate date;
   -- 分區(qū)值
   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;
    
  -- 遍歷數(shù)據(jù)結(jié)束標志
   DECLARE done INT  DEFAULT FALSE;
  -- 定義游標  查詢出分區(qū)表對應(yīng)的數(shù)據(jù)信息
   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;
    -- 將結(jié)束標志綁定到游標
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
   -- 打開游標咖祭,開始處理新增分區(qū)
   OPEN cur;
   read_loop: LOOP
    -- 提取游標里的數(shù)據(jù)金句,分別對應(yīng)上面sql查詢的3個屬性
     FETCH cur INTO tableschema,tablename,v_maxdate; 
      set v_sysdate = sysdate();
        -- 如果最大分區(qū)的值 小于等于當前時間加2天的值 就循環(huán)創(chuàng)建分區(qū)
      WHILE v_maxdate <= (v_sysdate + INTERVAL 2 DAY) DO
        -- 這里是用List分區(qū) 4天為一個分區(qū) 所以4個值  對應(yīng)在上方定義的變量
        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;
        -- 循環(huán)的條件變更 這里對應(yīng)上面的天數(shù)
        SET v_maxdate = v_maxdate + INTERVAL 4 DAY;     
      END WHILE;
  
    -- 結(jié)束循環(huán)后 打印
    IF done THEN
            SELECT v_maxdate,'done';
      LEAVE read_loop;
    END IF;
    END LOOP;
    close cur;

END
-- 創(chuàng)建事件 每天執(zhí)行
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

在舊表改成分區(qū)表

--    有主鍵 要先刪除主鍵 
ALTER TABLE `表名test` 
-- 設(shè)置新的分區(qū)建  并建立聯(lián)合主鍵
MODIFY COLUMN `time` datetime  NOT NULL ,
DROP PRIMARY KEY,
ALTER TABLE `trc_laneexlist`  ADD PRIMARY KEY (`id` , `time`) USING BTREE;


-- 創(chuàng)建range分區(qū)表的 time作為分區(qū)鍵 
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
);

分區(qū)相關(guān)命令

-- 統(tǒng)計分區(qū)中的數(shù)據(jù)數(shù)量
select count(*) from test partition (p20200708);
-- 刪除分區(qū)
ALTER TABLE  test DROP  PARTITION p20200708
-- 增加分區(qū)
ALTER TABLE test ADD PARTITION (PARTITION p20200908 VALUES LESS THAN ("2020-09-08") )
-- 查看庫下面所有分區(qū)
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));
-- 整理分區(qū)碎片
ALTER TABLE test optimize partition p20200712,p20200713;
-- 修補分區(qū)索引數(shù)據(jù) 
ALTER TABLE tb04 CHECK partition p1,p2;
-- 復(fù)制分區(qū)的數(shù)據(jù)到his表中
INSERT INTO test_his  SELECT  * FROM  test  PARTITION ( p20210309 )
-- 創(chuàng)建存儲過程
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;     
-- 獲取表對應(yīng)的分區(qū)時間和名字
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);

-- 同步分區(qū)數(shù)據(jù)到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;     

-- 刪除分區(qū)數(shù)據(jù)
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



-- 創(chuàng)建定時任務(wù)
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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寝杖,一起剝皮案震驚了整個濱河市睬涧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涯雅,老刑警劉巖夺欲,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粱哼,居然都是意外死亡,警方通過查閱死者的電腦和手機檩咱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門揭措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刻蚯,你說我怎么就攤上這事绊含。” “怎么了炊汹?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵躬充,是天一觀的道長。 經(jīng)常有香客問我兵扬,道長麻裳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任器钟,我火速辦了婚禮,結(jié)果婚禮上妙蔗,老公的妹妹穿的比我還像新娘傲霸。我一直安慰自己,他們只是感情好眉反,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布昙啄。 她就那樣靜靜地躺著,像睡著了一般寸五。 火紅的嫁衣襯著肌膚如雪梳凛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天梳杏,我揣著相機與錄音韧拒,去河邊找鬼。 笑死十性,一個胖子當著我的面吹牛叛溢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劲适,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼楷掉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了霞势?” 一聲冷哼從身側(cè)響起烹植,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤斑鸦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后草雕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巷屿,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年促绵,在試婚紗的時候發(fā)現(xiàn)自己被綠了攒庵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡败晴,死狀恐怖浓冒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尖坤,我是刑警寧澤稳懒,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站慢味,受9級特大地震影響场梆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纯路,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一或油、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驰唬,春花似錦顶岸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搓逾,卻和暖如春卷谈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霞篡。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工世蔗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寇损。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓凸郑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親矛市。 傳聞我的和親對象是個殘疾皇子芙沥,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容