mariadb:分区自动创建与删除
参考文章:https://blog.csdn.net/xlxxcc/article/details/52486426
1.以日自动创建与删除分区
调用示例:CALL proc_day_partition('t_base_log_abnormal',180,1);
删除180天之前的分区
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_day_partition`(
IN `v_tablename` VARCHAR(50),
IN `v_drop_interval` INT,
IN `v_add_interval` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE v_add_interval_1 int;
DECLARE flag int default 0;
SET v_add_interval_1=v_add_interval+1;
START TRANSACTION;
-- 自动创建今日分区
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(NOW(),'%Y%m%d'));
if flag = 0 then
SET @t=CONCAT('alter table ',v_tablename,' add partition ','(','partition ',
CONCAT('p',DATE_FORMAT(now(),'%Y%m%d')),
' VALUES LESS THAN (TO_DAYS (''',DATE_FORMAT(date_add(now(),interval v_add_interval day),'%Y%m%d'),''')))');
SELECT @t;
PREPARE stmt FROM @t;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end if;
-- 删除过期分区
if v_drop_interval > 0 then
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(DATE_SUB(NOW(),INTERVAL v_drop_interval DAY),'%Y%m%d'));
if flag = 1 then
SET @s=CONCAT('alter table ',v_tablename,' drop partition ', CONCAT('p',DATE_FORMAT(DATE_SUB(NOW(),INTERVAL v_drop_interval DAY),'%Y%m%d')));
SELECT @s;
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end IF;
end if;
-- 自动创建明天分区
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(DATE_ADD(NOW(),INTERVAL v_add_interval DAY),'%Y%m%d'));
if flag = 0 then
SET @t=CONCAT('alter table ',v_tablename,' add partition ','(','partition ',
CONCAT('p',DATE_FORMAT(DATE_ADD(NOW(),INTERVAL v_add_interval DAY),'%Y%m%d')),
' VALUES LESS THAN (TO_DAYS (''',DATE_FORMAT(date_add(now(),interval v_add_interval_1 day),'%Y%m%d'),''')))');
SELECT @t;
PREPARE stmt FROM @t;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end IF;
COMMIT;
END
上述脚本,在原文的基础上做了优化,主要是判断分区是否存在,删除一个不存在的分区会发生错误;自动创建今日的分区;判断是否要删除分区等等。
CREATE DEFINER=`root`@`localhost` EVENT `event_partition`
ON SCHEDULE
EVERY 1 DAY STARTS '2018-09-17'
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT ''
DO BEGIN
CALL proc_add_drop_partition('t_base_log',0,1);
CALL proc_add_drop_partition('t_gps',60,1);
END
创建事件,执行存储过程。
2.以月自动创建和删除分区
调用示例:CALL proc_month_partition('t_base_log_abnormal',0,1);
不删除分区
CREATE DEFINER=`root`@`%` PROCEDURE `proc_month_partition`(
IN `v_tablename` VARCHAR(50),
IN `v_drop_interval` INT,
IN `v_add_interval` INT
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
-- 创建月分区
-- v_tablename:分区表名
-- v_drop_interval:过期天数,为0表示不删除分区
-- v_add_interval :创建分区间隔,以月单位 DECLARE v_add_interval_1 int;
DECLARE flag int default 0;
SET v_add_interval_1=v_add_interval+1;
START TRANSACTION;
-- 自动创建当月分区
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(NOW(),'%Y%m'));
if flag = 0 then
SET @t=CONCAT('alter table ',v_tablename,' add partition ','(','partition ',
CONCAT('p',DATE_FORMAT(now(),'%Y%m')),
' VALUES LESS THAN (TO_DAYS (''',DATE_FORMAT(date_add(now(),interval v_add_interval MONTH),'%Y%m%d'),''')))');
SELECT @t;
PREPARE stmt FROM @t;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end if;
-- 删除过期分区
if v_drop_interval > 0 then
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(DATE_SUB(NOW(),INTERVAL v_drop_interval DAY),'%Y%m01'));
if flag = 1 then
SET @s=CONCAT('alter table ',v_tablename,' drop partition ', CONCAT('p',DATE_FORMAT(DATE_SUB(NOW(),INTERVAL v_drop_interval DAY),'%Y%m')));
SELECT @s;
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end IF;
end if;
-- 自动创建下月分区
select count(0) into flag from INFORMATION_SCHEMA.partitions
WHERE TABLE_SCHEMA = schema() AND TABLE_Name=v_tablename
and partition_name=CONCAT('p',DATE_FORMAT(DATE_ADD(NOW(),INTERVAL v_add_interval MONTH),'%Y%m'));
if flag = 0 then
SET @t=CONCAT('alter table ',v_tablename,' add partition ','(','partition ',
CONCAT('p',DATE_FORMAT(DATE_ADD(NOW(),INTERVAL v_add_interval DAY),'%Y%m')),
' VALUES LESS THAN (TO_DAYS (''',DATE_FORMAT(date_add(now(),interval v_add_interval_1 MONTH),'%Y%m01'),''')))');
SELECT @t;
PREPARE stmt FROM @t;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
end IF;
COMMIT;
END
mariadb:分区自动创建与删除的更多相关文章
- CentOS7 下 swap 分区的创建、删除及相关配置
一般我们在购买云服务器(例如:阿里云ECS.腾讯云服务器)的时候,选择 CentOS 7 系统之后,登录系统,发现 swap 大小为 0(即没有分配). 如果我们想在该 服务器上安装 Oracle 数 ...
- mdev自动创建和删除设备节点
设备节点的创建有二种方法: 1)手动创建:mknode命令 当insmod后,还需要手动moknod创建设备节点才能被应用层打开,并且使用完成之后还要删除节点. 2) 自动创建:mdev mdev, ...
- 使用class 自动创建设备节点
#include <linux/init.h>// __init __exit #include <linux/module.h> // module_init module_ ...
- Hive管理表分区的创建,数据导入,分区的删除操作
Hive分区和传统数据库的分区的异同: 分区技术是处理大型数据集经常用到的方法.在Oracle中,分区表中的每个分区是一个独立的segment段对象,有多少个分区,就存在多少个相应的数据库对象.而在P ...
- MariaDB(MySQL)创建、删除、选择及数据类型使用详解
一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行 ...
- oracle11g interval(numtoyminterval())自动创建表分区
Oracle11g通过间隔分区实现按月创建表分区 在项目数据库设计过程中由于单表的数据量非常庞大,需要对表进行分区处理.由于表中的数据是历史交易,故按月分区,提升查询和管理. 由于之前对于表分区了解不 ...
- EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除
外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...
- sql2008 计划自动创建数据库分区【转】
本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...
- 大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics
大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics 2016年10月11日 18:22:59 高达一号 阅读数:8655 版权声明:本文为博主原创文章,未经博 ...
随机推荐
- bzoj千题计划319:bzoj2865: 字符串识别(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #inc ...
- 自学python 8.
1.有如下文件,a1.txt,里面的内容为:LNH是最好的培训机构,全心全意为学生服务,只为学生未来,不为牟利.我说的都是真的.哈哈分别完成以下的功能:a,将原文件全部读出来并打印.b,在原文件后面追 ...
- Silverlight用户无法注册之MySql.Data.dll不一致
本篇博文记录本人解决一个"用户无法注册"的问题的过程 1 问题描述: 用户可以删除:但不能注册,也不能修改权限: 图 1用户注册失败 图 2修改用户权限出错 2 解决过程 1)粗暴 ...
- vue 组件动态 循环
组件可以是动态的,记录如下 <div v-for="item in arrComponent"> <component v-bind:is="item. ...
- IScroll5要防止重复加载
增加一个判断条件,ajax未返回前,设置为true,返回前设置为false,只有为false下才能够出发加载数据事件效果好很多.
- CC2541设置中断输入模式
//P0.0 /* SW_6 is at P0.1 */#define HAL_KEY_SW_6_PORT P0#define HAL_KEY_SW_6_BIT BV(0)#define HAL_KE ...
- 一个简单至极的PHP缓存类代码
https://www.jb51.net/article/73836.htm 直接看代码吧!使用说明:1.实例化$cache = new Cache(); 2.设置缓存时间和缓存目录$cache = ...
- LinkedStack的底层实现
package zy813ture; import java.util.EmptyStackException; public class MyLinkedStack1 { private Node ...
- xgboost安装 win10 64位 annaconda
重点参考三个网站: https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anacon ...
- python函数解释
实现某个功能的一些代码提高代码的复用性函数必须被调用才会执行函数里面定义的变量都叫局部变量,只要一出了函数就不能用了函数里面如果调用时需要拿到结果但是最后没写return(不必须写,如读取文件时就需要 ...