参考文章: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:分区自动创建与删除的更多相关文章

  1. CentOS7 下 swap 分区的创建、删除及相关配置

    一般我们在购买云服务器(例如:阿里云ECS.腾讯云服务器)的时候,选择 CentOS 7 系统之后,登录系统,发现 swap 大小为 0(即没有分配). 如果我们想在该 服务器上安装 Oracle 数 ...

  2. mdev自动创建和删除设备节点

    设备节点的创建有二种方法: 1)手动创建:mknode命令  当insmod后,还需要手动moknod创建设备节点才能被应用层打开,并且使用完成之后还要删除节点. 2) 自动创建:mdev mdev, ...

  3. 使用class 自动创建设备节点

    #include <linux/init.h>// __init __exit #include <linux/module.h> // module_init module_ ...

  4. Hive管理表分区的创建,数据导入,分区的删除操作

    Hive分区和传统数据库的分区的异同: 分区技术是处理大型数据集经常用到的方法.在Oracle中,分区表中的每个分区是一个独立的segment段对象,有多少个分区,就存在多少个相应的数据库对象.而在P ...

  5. MariaDB(MySQL)创建、删除、选择及数据类型使用详解

    一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行 ...

  6. oracle11g interval(numtoyminterval())自动创建表分区

    Oracle11g通过间隔分区实现按月创建表分区 在项目数据库设计过程中由于单表的数据量非常庞大,需要对表进行分区处理.由于表中的数据是历史交易,故按月分区,提升查询和管理. 由于之前对于表分区了解不 ...

  7. EntityFramework SQLiteCodeFirst 自动创建数据库 关闭级联删除

    外键的级联删除: 如A表中有主键idA, B表中设置外键(ForeignKey)为A表中的主键idA, 当A表中的记录被删除时, B表中所有引用此条记录的记录(即所有外键为idA的记录)将自动被删除 ...

  8. sql2008 计划自动创建数据库分区【转】

    本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...

  9. 大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics

    大数据_Kafka_Kafka自动创建不存在的Topics / 删除已存在的Topics 2016年10月11日 18:22:59 高达一号 阅读数:8655   版权声明:本文为博主原创文章,未经博 ...

随机推荐

  1. c/c++gdb下和发布版本下输出地址不同

    相差4字节 相差8个字节 原因: 这4个字节是优化掉了,64位操作系统,函数传参通过寄存器,减少了栈的使用 debug模式下,abc的地址都存下来了.

  2. scoketserver模块(TCP协议 与 udp 协议)

    socketserver模块 ( 基于 TCP 协议 ) import socketserver # 自定义类用来处理通信循环 class MyTCPhanler(socketserver.BaseR ...

  3. 开源框架.netCore DncZeus学习(三)增加一个菜单

    框架运行起来了,先尝试增加一个菜单. 本节增加一个菜单名字:公司管理,需要注意一点,所有的name都要保持一致,注意圈中部分.为了防止手敲代码出错,建议复制已有的代代码进行修改(比如这里用的Role页 ...

  4. 安装软件出现缺少vcruntime140.dll

    安装VC运行库QQ群:616945527 ->VC目录下

  5. C# 常用的工具方法

    1.DateTime 转为Unix的long的时间戳 long orderTime = order.AddTime.ToUnixTimeStamp("Milliseconds"); ...

  6. Docker 容器内存限制 - 八

    Docker 内存限制: centos /bin/bash  查看容器实例 内存限制: 限制容器内存大小:docker run -d -i -t -m 256M --memory-swap 512M ...

  7. Linux之Ubuntu添加/移除个人软件包存档的源[PPA,Personal Package Archives]

    现在很多第三方软件还需要添加PPA软件源到Ubuntu系统当中,但是添加了PPA之后,软件可以直接在软件中心进行安装并会自动提示升级,这就是Ubuntu带来的方便,现在我们就来看看如何添加PPA软件源 ...

  8. python练习题1

    1.使用while循环打印输入 1 2 3 4 5 6 8 9 10 num = 1 while num <= 10: if num == 7: num = num + 1 continue e ...

  9. 分页插件通用处理,以asp.net mvc为例

    Model: public class PaggerModel { public PaggerModel() { BarSize = ; } public PaggerModel(int total, ...

  10. 《一头扎进SpringMvc视频教程》

    第二章 SpringMvc控制器 第三章 Rest风格的资源URL 第四章 SpringMvc上传文件