因为项目需要,最近研究了一下在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.cnblogs.com/roucheng/
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.cnblogs.com/roucheng/
call del_fenqu();
end ||
DELIMITER ;

http://www.cnblogs.com/roucheng/p/mysqlfenqu.html

mysql 动态新建以及删除分区表的更多相关文章

  1. MySQL添加用户、删除用户与授权

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...

  2. MySql安装与MySQL添加用户、删除用户与授权

    1.安装MySql       目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的.msi格式的直接点击setup.exe就好,按照步骤进行.但是很多人下了zip格式的解压发现没有s ...

  3. MySql中添加用户/删除用户

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  4. Unity NGUI中动态添加和删除sprite

    (以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链 ...

  5. 转载:mysql添加用户、删除用户、授权、修改密码

    mysql添加用户.删除用户.授权.修改密码等 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码1.新建用户. //登录MYSQL @>mysql -u root -p @> ...

  6. 【转】【Mysql】MySQL添加用户、删除用户与授权

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...

  7. linux mysql添加用户,删除用户,以及用户权限

    一些主要的命令: 登录: mysql -u username -p 显示全部的数据库: show databases; 使用某一个数据库: use databasename; 显示一个数据库的全部表: ...

  8. Android_(控件)动态添加或删除Spinner下拉菜单

    使用ArrayList动态数组的依赖性实现动态增减Spinner下拉菜单选项功能. 设置一个EditText输入框,当用户输入了文字并单击[添加]按钮的同时,就会将输入的值添加Spinner至下拉菜单 ...

  9. Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置

    一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...

随机推荐

  1. Centos压缩与打包

    这个虽然是基础知识,但是有些东西就是这样,久了没用,就会忘记,而且之前有一个坏习惯就是不喜欢做笔记,以后学习了行东西一定要记录在博客,这样以后自己也能时不时的查看一下. 言归正传,在计算机的世界中,数 ...

  2. poj-1703-Find them, Catch them

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41928   Accepted: ...

  3. Git基本使用教程

    1.创建版本库      版本库又可以称为仓库(repository),可以简单理解为一个目录,在这个目录下的所有文件都可以被git管理起来,每个文件的新增.修改.删除Git都可以跟踪,以便在任何时刻 ...

  4. GJM : Unity3D - NetWork - Hight Level API ( HLAPI) [转载]

    介绍在本系列教程中,我们将使用的网络高级API(HLAPI)来构建一个小型的多人网络案例.即使我们的例子很简单,但也会涵盖以下关键概念,这应该可以帮助大家使用HLAPI构建大型游戏项目. 在第一部分, ...

  5. WPF的ComboBox 数据模板自定义

    WPF的ComboBox 有些时候不能满足用户需求,需要对数据内容和样式进行自定义,下面就简要介绍一下用数据模板(DataTemplate)的方式对ComboBox 内容进行定制: 原型设计如下: 步 ...

  6. FROONT – 超棒的可视化响应式网页设计工具

    FROONT 是一个基于 Web 的设计工具,在浏览器中运行,使得各类可视化设计的人员都能进行响应式的网页设计,即使是那些没有任何编码技能的设计师.FROONT 使得响应式网页设计能够可视化操作,能够 ...

  7. css3加载ing动画

    项目中ajax交互成功前总会需要给用户提醒,比如请稍候.正在加载中等等,那个等待的动图以前项目中用的是gif,在移动端画质很渣,有毛边,于是在新项目中用css3展示加载中的动画效果. function ...

  8. HTML标签的嵌套

    随着时间的推移,我们学习html的基础知识有了大概的了解.而我发现,平时在写html文档的时候,发现不太清楚标签之间的嵌套规则,经常是想到什么标签就用那些,然而发现有时的标签嵌套却是错误的.通过网上找 ...

  9. SharePoint 2013 数据库中手动更新用户信息

    在SharePoint的使用过程中,尤其是Windows认证的情况下,而且没有配置用户配置文件服务,经常会出现如果更新AD中的用户信息(包括名字.显示名.邮件等),SharePoint这边站点并不会更 ...

  10. Linux新手扫盲

    一. Linux特点 1.免费/开源: 2.支持多线程/多用户: 3.安全性好: 4.对内存和文件管理优越. Linux最小只需4M ——> 嵌入式开发 二. 文件目录 Linux系统所有软硬件 ...