mysql 动态新建以及删除分区表
因为项目需要,最近研究了一下在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 动态新建以及删除分区表的更多相关文章
- MySQL添加用户、删除用户与授权
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...
- MySql安装与MySQL添加用户、删除用户与授权
1.安装MySql 目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的.msi格式的直接点击setup.exe就好,按照步骤进行.但是很多人下了zip格式的解压发现没有s ...
- MySql中添加用户/删除用户
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...
- Unity NGUI中动态添加和删除sprite
(以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链 ...
- 转载:mysql添加用户、删除用户、授权、修改密码
mysql添加用户.删除用户.授权.修改密码等 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码1.新建用户. //登录MYSQL @>mysql -u root -p @> ...
- 【转】【Mysql】MySQL添加用户、删除用户与授权
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...
- linux mysql添加用户,删除用户,以及用户权限
一些主要的命令: 登录: mysql -u username -p 显示全部的数据库: show databases; 使用某一个数据库: use databasename; 显示一个数据库的全部表: ...
- Android_(控件)动态添加或删除Spinner下拉菜单
使用ArrayList动态数组的依赖性实现动态增减Spinner下拉菜单选项功能. 设置一个EditText输入框,当用户输入了文字并单击[添加]按钮的同时,就会将输入的值添加Spinner至下拉菜单 ...
- Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置
一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...
随机推荐
- 优化JavaScripe 提升首页加载速度的几种方案解析
优化目的: 1. 减少load量. 2. 优化js,加快页面加载速度. 网站中最影响网站打开速度的是什么?我会告诉是网站中的javascript,简称JS.模板中引用的JS文件越多,打开速度越慢,细读 ...
- 关于JAVA数据储存
关于JAVA数据储存: 在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register) 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以 ...
- C语言范例学习04
第三章 算法 前言:许多人对算法的看法是截然不同的,我之前提到过了.不过,我要说的还是那句话:算法体现编程思想,编程思想指引算法. 同时,有许多人认为简单算法都太简单了,应当去学习一些更为实用的复杂算 ...
- Java经典实例:在文本中匹配换行符
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...
- quartz TRIGGER_STATE变为ERROR解决方法
今天,项目组一个同事说开发环境一直正常quartz定时任务今天不跑了,因为异常已经封装了,所以应该不是没有捕获异常导致.也检查了JobDetail肯定没有重复的任务,最后检查qrtz_triggers ...
- http gzip 解压缩
var sContentEncoding = httpRespone.Headers["Content-Encoding"]; if(sContentEncoding == &qu ...
- 初探百度F.I.S — 由工具到解决方案
1. 前言 阅兵放假三天,我哪儿也没去,宅着看了一些东东:git命令行.svn命令以及下面的主角——百度FIS.对看过的git.svn的命令也做了一些总结,请参见:<git命令学习笔记>和 ...
- jQuery+fullPage.js演示10种全屏滚动
基本演示 背景演示 循环演示 回调函数演示 绑定菜单演示 项目导航演示 自动滚动 slide自动滚动 响应式 下载地址 实例代码 <!DOCTYPE html> <html lang ...
- iOS 程序报错:reason: [NSArrayI addObject:]: unrecognized selector sent to instance
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI ad ...
- Emacs学习心得之 基础操作
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ...