因为项目需要,最近研究了一下在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. Oracle数据库,用户的创建及表的创建

    安装完成之后,打开浏览器,输入https://127.0.0.1:1158/em 链接至登录数据库界面 用户名:sys     口令为安装时设置的密码(一定牢记) 链接身份为:SYSDBA(以系统管理 ...

  2. Data Structures/Algorithms 小甲鱼99讲笔记系列(1~~15讲)

    参考资料地址: http://www.icoolxue.com/ 1.数据结构中四种逻辑结构. ① 集合 集合中任何两个数据元素之间都没有逻辑关系,组织形式松散. ② 线性结构 线性结构中的 结点按逻 ...

  3. Struct2

    1.MVC思想概述 Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理:然后调用后端javabean来完成实际的逻辑处理: 最后转发到相应的jsp ...

  4. [转载][翻译] IoC 容器和 Dependency Injection 模式

    原文地址:Inversion of Control Containers and the Dependency Injection pattern 中文翻译版本是网上的PDF文档,发布在这里仅为方便查 ...

  5. 编写高性能Javascript代码的若干建议

    多年来,Javascript一直在web应用开发中占据重要的地位,但是很多开发者往往忽视一些性能方面的知识,特别是随着计算机硬件的不断升级,开发者越发觉得Javascript性能优化的好不好对网页的执 ...

  6. Twproject Gantt – 开源的 JavaScript 甘特图组件

    Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是,它是免费开源的. ...

  7. Resumable.js – 基于 HTML5 File API 的文件上传

    Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...

  8. eclipse提示:This tag and its children can be replaced by one <TextView/> and a compound drawable

    今天在学习android开发的时候,写了这样的一段代码: <?xml version="1.0" encoding="utf-8"?> <Li ...

  9. 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  10. c#程序打包大全

    c#程序打包现在分为两种,一种是VS自带的打包方式,还有一种是第三方的打包方式,在VS2013里面是没有自带打包安装部署的,只有第三方的创建. 第三方打包方式很简单,百度Installshield下载 ...