参考文章: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. asp.net上传图片,上传图片

    想必很多人工作中经常需要实现上传图片的功能. 先引用此插件 http://files.cnblogs.com/files/hmYao/jquery-form.js. 前台代码 <form dat ...

  2. Express 体验 路由、模板引擎、中间件

    http://expressjs.com/en/4x/api.html#req.method http://expressjs.com/en/guide/routing.html [Route pat ...

  3. 第26月第26天 Domain=AVFoundationErrorDomain Code=-11850

    1. curl -voa http://119.29.108.104:8080/inweb01/kotlin.mp4 -H "Range:bytes=0-1" https://al ...

  4. [ASP.net教程]IIS服务器 远程发布(Web Deploy)配置

    asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的文件到服务器硬盘上.打包成安装程序到服务器上安装.通过Visual Studio 开发平台远程发布到服务器. 在asp.net网站的 ...

  5. NPOI 设置样式为粗体

    CellStyle style = hssfworkbook.CreateCellStyle(); Font f = hssfworkbook.CreateFont(); f.Boldweight = ...

  6. Expression知识

    http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html#!comments

  7. java包装类型的坑

    开发中有遇到Long类型比较是否相等,比如Long A和Long B判断是否相等,当时习惯性的直接A==B: 自测的话确实么有问题,但是测试那边测试就有问题,当时郁闷了一下然后换成了A.equals( ...

  8. timestamp的妙用

    代码 -- 卖家(登录后台使用, 卖家登录之后可能直接采用微信扫码登录,不使用账号密码) create table `seller_info` ( `id` varchar(32) not null, ...

  9. 【节点-添加标签】【节点-删除标签】【显示年-月-日-星期】【math算数】【正则表达式】

    1.节点-添加标签 <body><div id="div1"><p id="p1">这是一个段落.</p>< ...

  10. Springboot(一)概念

    一.概念 Spring boot 用来简化新Spring应用的初始搭建和开发配置. 二.特性 1.创建独立的Spring应用程序,不是对spring功能增强,而是提快速使用Spring的功能: 2.嵌 ...