mysql分區(qū):每天自動添加新分區(qū)

test數(shù)據(jù)庫中position表按日期(天)分區(qū):
需要做:

  • 對已有數(shù)據(jù)分區(qū)
  • 添加過程存儲(相當于函數(shù))
  • 添加事件(相當于定時調(diào)用函數(shù))

  1. 開啟事件調(diào)度器(默認關(guān)閉)

    SET GLOBAL event_scheduler = ON; 
    
  2. 必須對已有數(shù)據(jù)先進行分區(qū)

    ALTER TABLE position PARTITION BY RANGE(TO_DAYS(date))
    (
        PARTITION p20181028 VALUES LESS THAN (TO_DAYS('2018-10-29')),
        PARTITION p20181029 VALUES LESS THAN (TO_DAYS('2018-10-30')),
        PARTITION p20181030 VALUES LESS THAN (TO_DAYS('2018-10-31'))
    )
    
  3. 分區(qū)腳本

    use test;
    
    DELIMITER ||
    -- 刪除存儲過程
    drop procedure if exists auto_set_partitions ||
    -- 注意:使用該存儲過程必須保證相應(yīng)數(shù)據(jù)庫表中至少有一個手動分區(qū)
    -- 創(chuàng)建存儲過程[通過數(shù)據(jù)庫名和對應(yīng)表名]-建多少個分區(qū)殉挽,分區(qū)時間間隔為多少
    -- databasename:創(chuàng)建分區(qū)的數(shù)據(jù)庫
    -- tablename:創(chuàng)建分區(qū)的表的名稱
    -- partition_number:一次創(chuàng)建多少個分區(qū)
    -- partitiontype:分區(qū)類型[0按天分區(qū)丰涉,1按月分區(qū),2按年分區(qū)]
    -- gaps:分區(qū)間隔斯碌,如果分區(qū)類型為0則表示每個分區(qū)的間隔為 gaps天一死;
    --       如果分區(qū)類型為1則表示每個分區(qū)的間隔為 gaps月
    --            如果分區(qū)類型為2則表示每個分區(qū)的間隔為 gaps年
    create procedure auto_set_partitions (in databasename varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,in tablename varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, in partition_number int, in partitiontype int, in gaps int)
    L_END:
    begin     
        declare max_partition_description varchar(255) default '';
        declare p_name varchar(255) default 0;       
        declare p_description varchar(255) default 0;   
        declare isexist_partition varchar(255) default 0; 
     declare i int default 1;
      
     -- 查看對應(yīng)數(shù)據(jù)庫對應(yīng)表是否已經(jīng)有手動分區(qū)[自動分區(qū)前提是必須有手動分區(qū)]
        select partition_name into isexist_partition from information_schema.partitions where table_schema = databasename  and table_name = tablename limit 1;
        -- 如果不存在則打印錯誤并退出存儲過程
        if isexist_partition <=> "" then
           select "partition table not is exist" as "ERROR";
           leave L_END;
        end if;
     
        -- 獲取最大[降序獲取]的分區(qū)描述[值]
        select partition_description into max_partition_description  from information_schema.partitions where table_schema = databasename  and table_name = tablename order by partition_description desc limit 1;
       
        -- 如果最大分區(qū)沒有,說明沒有手動分區(qū),則無法創(chuàng)建自動分區(qū)
        if max_partition_description <=> "" then
           select "partition table is error" as "ERROR";
           leave L_END;
        end if;
     
        -- 替換前后的單引號[''兩個引號表示一個單引號的轉(zhuǎn)義]
        -- set max_partition_description = REPLACE(max_partition_description, '''', '');
         -- 或使用如下語句
         set max_partition_description = REPLACE(max_partition_description-1, '\'', '');
     
       -- 自動創(chuàng)建number個分區(qū)
        while (i <= partition_number) do
                     if (partitiontype = 0) then
                         -- 每個分區(qū)按天遞增,遞增gaps天
                         set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps day); 
                     elseif (partitiontype = 1) then
                         -- 每個分區(qū)按月遞增,遞增gaps月
                         set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps month); 
                     else 
                         -- 每個分區(qū)按年遞增,遞增gaps年
                         set p_description = DATE_ADD(FROM_DAYS(max_partition_description), interval i*gaps year);
                     end if;
                     -- 刪除空格
                     set p_name = REPLACE(p_description, ' ', '');
                     -- 例如10.20的記錄實際是less than 10.21
                     set p_description = DATE_ADD(p_description, interval 1 day); 
                     -- 如果有橫桿替換為空
              set p_name = REPLACE(p_name, '-', '');
                     -- 刪除時間冒號
                     set p_name = REPLACE(p_name, ':', '');
                     -- alter table tablename add partition ( partition pname values less than ('2017-02-20 10:05:56') );
              set @sql=CONCAT('ALTER TABLE ', tablename ,' ADD PARTITION ( PARTITION p', p_name ,' VALUES LESS THAN (TO_DAYS(\'', p_description ,'\')))');
                     -- set @sql=CONCAT('ALTER TABLE ', tablename ,' ADD PARTITION ( PARTITION p', p_name ,' VALUES LESS THAN (TO_DAYS(\'', p_description ,'\')))');
                     -- 打印sql變量
              -- select @sql;
                     -- 準備sql語句
              PREPARE stmt from @sql;
                     -- 執(zhí)行sql語句
              EXECUTE stmt;
                     -- 釋放資源
              DEALLOCATE PREPARE stmt;
                     -- 遞增變量
              set i = (i + 1) ;
     
        end while;          
    end ||
    -- 恢復語句中斷符
    DELIMITER ;
    
    
  4. 添加事件處理,每天執(zhí)行一次

    DELIMITER ||
    drop event if exists auto_set_partitions  ||
    create event auto_set_partitions 
    on schedule every 1 day
    starts '2018-10-30 23:59:59'
    do
    BEGIN
        call auto_set_partitions('test', 'position', 1, 0, 1);
    END ||
    DELIMITER ;
    

ps: 其他操作

  • 刪除表中分區(qū)
alter table table_name drop partition p0;
  • 修改事件
ALTER EVENT
event_name

ON SCHEDULE schedule
[RENAME TO new_event_name][ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE][COMMENT 'comment']
DO sql_statement
  • 刪除事件
DROP EVENT [IF EXISTS] auto_set_partitions;

但當一個事件正在運行中時傻唾,刪除該事件不會導致事件停止投慈,事件會執(zhí)行到完畢為止

  • 查看事件是否開啟
show variables like 'event_scheduler';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逛裤,更是在濱河造成了極大的恐慌瘩绒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件带族,死亡現(xiàn)場離奇詭異锁荔,居然都是意外死亡,警方通過查閱死者的電腦和手機蝙砌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門阳堕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人择克,你說我怎么就攤上這事恬总。” “怎么了肚邢?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵壹堰,是天一觀的道長。 經(jīng)常有香客問我骡湖,道長贱纠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任响蕴,我火速辦了婚禮谆焊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浦夷。我一直安慰自己辖试,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布劈狐。 她就那樣靜靜地躺著罐孝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天庆锦,我揣著相機與錄音,去河邊找鬼怒见。 笑死,一個胖子當著我的面吹牛姑宽,可吹牛的內(nèi)容都是我干的遣耍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炮车,長吁一口氣:“原來是場噩夢啊……” “哼舵变!你這毒婦竟也來了酣溃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤纪隙,失蹤者是張志新(化名)和其女友劉穎赊豌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绵咱,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碘饼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悲伶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艾恼。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖麸锉,靈堂內(nèi)的尸體忽然破棺而出钠绍,到底是詐尸還是另有隱情,我是刑警寧澤花沉,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布柳爽,位于F島的核電站,受9級特大地震影響主穗,放射性物質(zhì)發(fā)生泄漏泻拦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一忽媒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腋粥,春花似錦晦雨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至展辞,卻和暖如春奥邮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罗珍。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工洽腺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人覆旱。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓蘸朋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扣唱。 傳聞我的和親對象是個殘疾皇子藕坯,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

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