阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL动态新建以及删除分区表

418次阅读
没有评论

共计 5572 个字符,预计需要花费 14 分钟才能阅读完成。

因为项目需要,最近研究了一下在 MySQL 数据库下如何动态新建以及删除分区表。如果全部借助存储过程的话,新建以及删除分区表在逻辑上比较死板、不灵活,而且还容易出错。因此,我新建了一个数据表 table_fen_qu,借助这个表可以很 (相对) 灵活的对分区表进行管理。

在首次创建分区表时,若单独一条分区表数据一条分区表数据的添加,此时 rang 的列值大于该表中此列的最大值时,可以创建,否则失败。在这里,我是把创建分区表的代码放到一起执行的(见 general_procedure 中的 else 语句段)。以下是操作过程,不足之处请各位看官指正。

第一步:建立存储过程。
建立新建分区表的存储过程代码如下:

drop procedure if exists general_procedure;
— general_procedure 的作用:新建分区表及在 table_fen_qu 表中存储新建分区表时的相关参数
— general_procedure 的参数:表名,分区表之间的时间间隔(单位为小时),要新增的分区表个数
create procedure general_procedure(in tablenamein varchar(50),in intervalHour int,in newIntervalNum int)
general_pro:begin
    — 参数:最大时间
    declare maxMonitTime datetime default SYSDATE();
    — 参数:最大时间对应的字符串
    declare maxMonitTimeStr varchar(50);
    — 参数:最小时间
    declare minMonitTime datetime default SYSDATE();
    — 参数:最大时间对应的字符串
    declare minMonitTimeStr varchar(50);
    — 参数:数据库记录数
    declare recoidNum int default 0;
    — 判断传入的表名是否为空
    if tablenamein is null then
        leave general_pro;
    end if;
    — 判断传入的时间间隔
    if intervalHour <= 0 then
        set intervalHour = 6;
    end if;
    — 判断新增分区表个数
    if newIntervalNum <= 0 then
        set newIntervalNum = 1;
    end if;
 
    — 在该表中,查询符合条件的记录数,backupflag= 0 说明是未备份
    select count(*) into recoidNum from table_fen_qu where tablename=tablenamein and backupflag=0;
    if recoidNum > 0 then
        — 查询该表在 table_fen_qu 表中的最大监测时间
        select monittime into maxMonitTime from table_fen_qu where tablename=tablenamein and backupflag=0 order by monittime desc limit 1;
        — 判断监测时间是否为 null
        if maxMonitTime is null then
            set maxMonitTime = SYSDATE();
        end if;
        — 比较最大时间减去 72 个小时之后的时间与系统时间的早晚
        set recoidNum = timestampdiff(hour,SYSDATE(),DATE_SUB(maxMonitTime,INTERVAL 3 DAY));
        — 如果 recoidNum 大于 0,说明最大监测时间减去 72 小时之后的时间仍然在系统时间之后,
        — 说明不用建立新的分区表,反之,则建立最大监测时间之后 newIntervalNum 个以每 intervalHour 小时为间隔的分区表
        if recoidNum <= 0 then
            set recoidNum = 1;
            while recoidNum <= newIntervalNum do
                set maxMonitTime = ADDDATE(maxMonitTime,INTERVAL intervalHour HOUR);
                set maxMonitTimeStr = CONCAT(‘p’,DATE_FORMAT(maxMonitTime,”%Y%m%d%H%i%s”));
                — 开始添加分区表
                — 拼接分区表代码段
                set @v_add_s = CONCAT(‘ALTER TABLE ‘,tablenamein,’ ADD PARTITION  (PARTITION ‘,maxMonitTimeStr,’ VALUES LESS THAN (\”,maxMonitTime,’\’) ENGINE = InnoDB )’);
                — 定义预处理语句 
                prepare stmt from @v_add_s;
                — 执行预处理语句
                execute stmt;
                — 释放预处理语句
                deallocate prepare stmt;
                — 开始在 table_fen_qu 中添加记录
                insert into table_fen_qu(fenquname,tablename,monittime,backupflag) VALUES(maxMonitTimeStr,tablenamein,maxMonitTime,0);
                — 记录数加 1
                set recoidNum = recoidNum + 1;
            end while;
        end if;
    else
        set recoidNum = 2;
        — 计算最小时间
        set minMonitTimeStr = CONCAT(DATE_FORMAT(DATE_SUB(maxMonitTime,INTERVAL 60 DAY),’%Y-%m-%d’),’ 00:00:00′);
        set minMonitTime = STR_TO_DATE(minMonitTimeStr,’%Y-%m-%d %H:%i:%s’);
        — 计算最大时间 hovertree.com
        set maxMonitTimeStr = CONCAT(DATE_FORMAT(ADDDATE(maxMonitTime,INTERVAL 4 DAY),’%Y-%m-%d’),’ 00:00:00′);
        set maxMonitTime = STR_TO_DATE(maxMonitTimeStr,’%Y-%m-%d %H:%i:%s’);
        — 计算新建表分区个数
        set newIntervalNum = floor(timestampdiff(hour,minMonitTime,maxMonitTime) / intervalHour) + 1;
        if newIntervalNum < 12 then
            set newIntervalNum = 12;
        end if;
        — 删除所有表分区
        set @v_del_s = CONCAT(‘ALTER TABLE ‘,tablenamein,’ remove partitioning’);
        — 定义预处理语句 
        prepare stmt from @v_del_s;
        — 执行预处理语句
        execute stmt;
        — 释放预处理语句
        deallocate prepare stmt;
        — 删除所有数据
        delete from table_fen_qu where tablename= tablenamein;
        — 新建分区
        — 设置时间
        set minMonitTimeStr = CONCAT(‘p’,DATE_FORMAT(minMonitTime,”%Y%m%d%H%i%s”));
        — 拼接添加分区表 sql
        set @v_add_s = CONCAT(‘ALTER TABLE ‘,tablenamein,’ PARTITION BY RANGE COLUMNS(moint_time) (PARTITION ‘,minMonitTimeStr,’ VALUES LESS THAN (\”,minMonitTime,’\’) ENGINE = InnoDB,’);
        — 开始在 table_fen_qu 中添加记录
        insert into table_fen_qu(fenquname,tablename,monittime,backupflag) VALUES(minMonitTimeStr,tablenamein,minMonitTime,0);
        while recoidNum <= newIntervalNum do
            — 设置时间
            set minMonitTime = ADDDATE(minMonitTime,INTERVAL intervalHour HOUR);
            set minMonitTimeStr = CONCAT(‘p’,DATE_FORMAT(minMonitTime,”%Y%m%d%H%i%s”));
            — 拼接添加分区表 sql
            set @v_add_s = CONCAT(@v_add_s,’PARTITION ‘,minMonitTimeStr,’ VALUES LESS THAN (\”,minMonitTime,’\’) ENGINE = InnoDB,’);
            — 开始在 table_fen_qu 中添加记录
            insert into table_fen_qu(fenquname,tablename,monittime,backupflag) VALUES(minMonitTimeStr,tablenamein,minMonitTime,0);
            — 记录数加 1
            set recoidNum = recoidNum + 1;
        end while;
        set @v_add_s = left(@v_add_s,LENGTH(@v_add_s)-1);
        set @v_add_s = CONCAT(@v_add_s,’);’);
        — 定义预处理语句 
        prepare stmt from @v_add_s;
        — 执行预处理语句 http://www.linuxidc.com
        execute stmt;
        — 释放预处理语句
        deallocate prepare stmt;
    end if;
end general_pro;

第二步:建立事件计划,定时执行事件。
事件如下:

— 打开事件计划
SET GLOBAL event_scheduler = ON;
/* 创建从开始时间每隔 1 天定时执行 */
drop event if exists eachDayEvent;
DELIMITER ||
create event eachDayEvent
    on schedule every 1 day  starts ‘2013-05-01 00:00:00’
    on completion preserve enable
do
    begin
        — general_procedure 的参数:表名,分区表之间的时间间隔(单位为小时),要新增的分区表个数
        — 非能耗 5 分钟表 - 间隔 6 小时 -6h/ 分区表 hovertree.com
        call general_procedure(‘no_energy_five_minute_data’,6,8);
        — 原始数据表 - 间隔 6 小时 -6h/ 分区表
        call general_procedure(‘temp_data’,6,8);
        — 能耗五分钟 - 间隔天 -24h/ 分区表
        call general_procedure(‘energy_five_minute_data’,24,4);
        — 能耗五分钟汇总 - 间隔天 -24h/ 分区表
        call general_procedure(‘energy_five_minute_data_summarize’,24,4);
        — 能耗小时表调用 - 间隔周 -7*24h/ 分区表 何问起
        call general_procedure(‘energy_hour_data_summarize’,168,4);
        — 能耗分类分项 5 分钟表 - 间隔周 7 *24h/ 分区表
        call general_procedure(‘energy_item_five_minute_data’,168,4);
        — 能耗分类分项小时表 - 间隔季度 -90*24h/ 分区表
        call general_procedure(‘energy_item_hour_data’,2160,4);
        — 能耗天汇总表 - 间隔半年 -4380h/ 分区表
        call general_procedure(‘energy_day_data_summarize’,4380,4);
        — 删除已备份的分区表 http://www.linuxidc.com
        call del_fenqu();
    end ||
DELIMITER ;

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131077.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计5572字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7800329
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...
我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...