mysql 分区处理数据
记录一下分区代码:
1.建立存储过程,将原表按照时间转化为分区表,并建立当天分区
#alter table to partition table
DELIMITER $$
USE `dc_log`$$
DROP PROCEDURE IF EXISTS `create_partition_today`$$
CREATE PROCEDURE `create_partition_today`(IN_SCHEMANAME VARCHAR(), IN_TABLENAME VARCHAR())
BEGIN
DECLARE BEGINTIME TIMESTAMP;
DECLARE ENDTIME TIMESTAMP;
DECLARE DAYS_ENDTIME INT;
DECLARE PARTITIONNAME VARCHAR();
SET BEGINTIME = NOW();
SET ENDTIME = BEGINTIME + INTERVAL DAY;
SET PARTITIONNAME = DATE_FORMAT(BEGINTIME, 'p%Y%m%d');
SET DAYS_ENDTIME = TO_DAYS(ENDTIME);
SET @SQL = CONCAT('ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`',
' PARTITION BY RANGE (to_days(create_time))
(PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', DAYS_ENDTIME, '))');
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END$$
DELIMITER ;
2.建立存储过程,负责检查第二天的分区是否存在,如果不存在则建立
#procedure of build partition of today and next day
DELIMITER $$
USE `dc_log`$$
DROP PROCEDURE IF EXISTS `create_partition_by_day`$$
CREATE PROCEDURE `create_partition_by_day`(IN_SCHEMANAME VARCHAR(), IN_TABLENAME VARCHAR())
BEGIN
DECLARE ROWS_CNT INT UNSIGNED;
DECLARE BEGINTIME TIMESTAMP;
DECLARE ENDTIME TIMESTAMP;
DECLARE DAYS_ENDTIME INT;
DECLARE PARTITIONNAME VARCHAR();
SET BEGINTIME = NOW() + INTERVAL DAY;
SET PARTITIONNAME = DATE_FORMAT(BEGINTIME, 'p%Y%m%d');
SET ENDTIME = BEGINTIME + INTERVAL DAY;
SET DAYS_ENDTIME = TO_DAYS(ENDTIME);
SELECT COUNT(*)
INTO ROWS_CNT
FROM information_schema.partitions
WHERE table_schema = IN_SCHEMANAME AND table_name = IN_TABLENAME AND partition_name = PARTITIONNAME;
IF ROWS_CNT =
THEN
SET @SQL = CONCAT('ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`',
' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', DAYS_ENDTIME, '))');
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
ELSE
SELECT CONCAT("partition `", PARTITIONNAME, "` for table `", IN_SCHEMANAME, ".", IN_TABLENAME,
"` already exists") AS result;
END IF;
END$$
DELIMITER ;
3.为了避免数据无限量扩大,建立存储过程,负责清除30天前的分区表数据
DELIMITER $$
USE `dc_log`$$
DROP PROCEDURE IF EXISTS `clear_partition_by_day`$$
CREATE PROCEDURE `clear_partition_by_day`(IN_SCHEMANAME VARCHAR(), IN_TABLENAME VARCHAR())
BEGIN
DECLARE NOWDAYS INT;
DECLARE Done INT;
DECLARE part VARCHAR();
DECLARE descr INT;
DECLARE rs CURSOR FOR SELECT
partition_name part,
partition_description descr
FROM information_schema.partitions
WHERE
table_schema = IN_SCHEMANAME
AND table_name = IN_TABLENAME;
/* 异常处理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET Done = ;
OPEN rs;
SET NOWDAYS = TO_DAYS(NOW());
FETCH rs into part,descr;
while Done is null DO
IF NOWDAYS - descr >
THEN
select descr AS cc;
SET @SQL = CONCAT('ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`',
' DROP PARTITION ', part);
select descr AS aa;
SELECT @SQL AS result;
select descr AS bb;
PREPARE STMT FROM @SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
FETCH rs into part,descr;
end WHILE;
CLOSE rs;
END$$
DELIMITER ;
4.这时候创建两个事件,负责按周期去执行建立分区和删除分区
#invoke event to create future partitions
#hour event of checking partition existed or not(invoke procedure every day)
DELIMITER $$
USE `dc_log`$$
CREATE EVENT IF NOT EXISTS `e_part_manage`
ON SCHEDULE EVERY HOUR #every minute
STARTS '2018-05-01 18:27:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Creating partitions'
DO BEGIN
CALL dc_log.create_partition_by_day('dc_log', 'business_log');
END$$
DELIMITER ;
#event of clear data which out of date of days
DELIMITER $$
USE `dc_log`$$
CREATE EVENT IF NOT EXISTS `clear_data`
ON SCHEDULE EVERY DAY #every minute
STARTS '2018-05-01 18:27:30'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'clearing data'
DO BEGIN
CALL clear_partition_by_day('dc_log', 'business_log');
END$$
DELIMITER ;
5.如果事件没有运行,则可能是事件开关未开启
#turn event_scheduler on
SET GLOBAL event_scheduler = 'ON'; #打开
6.加入另外一张表操作,修改事件内容
#service_push #same steps of table business_log
ALTER TABLE dc_system.service_push DROP PRIMARY KEY;
CALL create_partition_today('dc_system', 'service_push');
ALTER EVENT e_part_manage
DO BEGIN
CALL dc_log.create_partition_by_day('dc_log', 'business_log');
CALL dc_log.create_partition_by_day('dc_system', 'service_push');
END ;
ALTER EVENT clear_data
DO BEGIN
CALL dc_log.clear_partition_by_day('dc_log', 'business_log');
CALL dc_log.clear_partition_by_day('dc_system', 'service_push');
END ;
done
mysql 分区处理数据的更多相关文章
- MySQL 已有大数据量表进行分区踩坑
一.背景mysql 表中已有 4 亿数据,为提高查询效率,需创建分区,一开始计划是创建 HASH 分区,结果报错:ERROR 1659 (HY000): Field 'partno' is of a ...
- Atitit 分区后的查询 mysql分区记录的流程与原理
Atitit 分区后的查询 mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...
- MySQL分区总结
MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...
- mysql分区交换exchange partition
在表和分区间交换数据 mysql5.6开始支持alter table..exchange partition语法,该语句允许分区或子分区中的数据与另一个非分区的表中的数据进行交换,如果非分区表中的数据 ...
- mysql分区及实例演示
一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元 在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名 ...
- mysql分区
<?php /* 分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. ...
- mysql分区研究
表分区学习 1. 概述 1.1. 优点: l 将表分区比一个表在单个磁盘或者文件系统存储能够存储更多数据 l 可以通过drop分区删除无用数据,也可以通过增加分区添加数据 l 查询可以通过分区裁剪进行 ...
- 十五、mysql 分区之 分区管理
1.mysql分区处理分区字段NULL值的方式 1.range分区null被当作最小值处理 2.list分区null值必须被枚举出来,否则将出错 3.hash/key分区 null值当作0处理 2.R ...
- MySQL分区技术 (一)
4:MySQL 分区技术(是mysql 5.1以版本号后開始用->是甲骨文mysql技术团队维护人员以插件形式插入到mysql里面的技术) 眼下,针对海量数据的优化主要有2中方法: 1:大表拆成 ...
随机推荐
- 微软牛津项目人脸识别API初探
按照董子的这篇博客中的介绍,到微软牛津项目的网站申请到测试用的人脸识别Key,按照官方文档的介绍,把wpf项目建好之后,按照一步步的流程下来就可以完成example中的功能了.但是这仅仅是个examp ...
- WPF中动态改变控件显示位置
转自 http://blog.csdn.net/lassewang/article/details/6928897 测试环境: Windows XP/Windows 7 开发环境: Microsoft ...
- jQuery学习笔记(DOM操作)
DOM操作的分类 一般来说,DOM操作分为3个方面,即DOM Core.HTML-DOM和CSS-DOM. 1. DOM Core DOM Core并不专属于JavaScript,任何一种支持DOM的 ...
- RSA算法 JS加密 JAVA解密
有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...
- ios7新特性--1
1.用户界面的扁平化 2.UIKit 动态行为支持 应用程序可以设置UIView 对象和其他对象(遵从UIDynamicItem 协议)的动态行为属性.遵从UIDynamicItem协议的对象被称为d ...
- NLog自定义字段写入数据库表,示例
//自定义字段写入NLog日志 private void saveNLog(InvokeLogModel model) { LogEventInfo ei = new LogEventInfo(); ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- dom4j: 用dom4j生成xml后第二行空行的问题
只需要指定: format.setNewLineAfterDeclaration(false); 即可. 例: OutputFormat format = OutputFormat.createPre ...
- cmd命令操作Oracle数据库
//注意cmd命令执行的密码字符不能过于复杂 不能带有特殊符号 以免执行不通过 譬如有!@#¥%……&*之类的 所以在Oracle数据库设置密码是不要太复杂 /String Database ...
- git无法提交,存在未提交的修改,在重新合并前或者撤销更改
其实我没有修改.但是却无法同步. 解决方法: 1.在vs里, 打开git的命令提示符 2.输入一下命令: git stashgit stash pop 3.然后再git checkout试试,然后提示 ...