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 版权声明:本文为博主原创文章,未经博 ...
随机推荐
- Spark源码剖析 - SparkContext的初始化(十)_Spark环境更新
12. Spark环境更新 在SparkContext的初始化过程中,可能对其环境造成影响,所以需要更新环境,代码如下: SparkContext初始化过程中,如果设置了spark.jars属性,sp ...
- Spark常见问题汇总
原文地址:https://my.oschina.net/tearsky/blog/629201 摘要: 1.Operation category READ is not supported in st ...
- elementUi模态框使用baiduMap错误记录
报错如下,可能是因为目标div还没生成 elementUi文档说明 在dom生成后再调用,正常 buildMap(){ let map = new BMap.Map("allmap" ...
- linux下有名管道进程通信
一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo ...
- 关于JSON CSRF的一些思考
CSRF作为常见漏洞,一直受到关注和研究,JSON是一种应用广泛的轻量级数据交换格式,当CSRF去POST一段JSON,情况可能会变得有些不一样:此次就一种特殊情况下的CSRF进行分析,权当抛砖引玉. ...
- luogu P3767 膜法
传送门 这题如果没有删除操作,可以直接使用可持久化并查集 注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有 ...
- CSS面试复习(一):HTML强化
1. HTML常见元素和理解 head类 meta:字符集.base:路径. a[href,target] img[src,alt] table td[colspan,rowspan] form[ta ...
- synchronized与Lock的区别与使用
1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象obj的锁定,假设A获取了对象obj锁,B将等待A ...
- 51nod1693 水群 最短路
若A=K*B,若仅通过操作二:将B变换为A需要K步, 由算数基本定理可知:k=p1*p2*……pn(p为素数,且可能重复) 那么:将B转化为p1*B需要p1步,将p1*B转化为p1*p2*B需要p2步 ...
- 极客时间|AI技术内参
学习进度: 014 | 精读AlphaGo Zero论文