MySQL通过存储过程来添加和删除分区的过程(List分区)

 更新时间:2023年09月14日 09:01:30   作者:业余砖家  
这篇文章主要介绍了MySQL-通过存储过程来添加和删除分区(List分区),本文通过创建存储过程来添加和删除分区,可以避免在分区存在时添加分区报错,或者分区不存在时删除分区报错的问题,需要的朋友可以参考下

1.背景原因

当前MySQL不支持在添加和删除分区时,使用IF NOT EXISTS和IF EXISTS。所以在执行调度任务时,直接通过ADD PARTITION和DROP PARTITION不可避免会报错。本文通过创建存储过程来添加和删除分区,可以避免在分区存在时添加分区报错,或者分区不存在时删除分区报错的问题。

本文介绍的是关于LIST分区的添加和删除。

2.前提准备

创建List分区表

DROP TABLE  IF  EXISTS `list_part_table` ;
CREATE TABLE  IF  NOT  EXISTS `list_part_table`  (
`id` bigint(32) NOT NULL COMMENT '主键',
`request_time` datetime(0) NOT NULL COMMENT '请求时间',
`response_time` datetime(0) NOT NULL COMMENT '响应时间',
`time_used` int(11) NOT NULL COMMENT '耗时(ms)',
`create_by` varchar(48)  DEFAULT NULL COMMENT '创建人',
`update_by` varchar(48)  DEFAULT NULL COMMENT '修改人',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`, `request_time`) USING BTREE
) PARTITION BY list(TO_DAYS(request_time)) (
PARTITION p0 VALUES IN  (0)
) ;

 查看表中的分区信息

select  *  from  information_schema.partitions  where table_name like 'list_part_table%' ;

3.添加和删除分区语句

(1)添加分区

alter  table  list_part_table  add partition(partition  p202001 values in (202001));
alter  table  list_part_table  add partition(partition  p20201201 values in (20201201));

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

(2)删除分区

alter  table  list_part_table  drop partition  p202001,p20201201 ;

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

说明:当上面的添加分区和删除分区语句执行多次时,就会报错。 

4.通过存储过程添加LIST分区

(1)添加分区的存储过程

DROP  PROCEDURE  IF EXISTS create_list_partition ;
DELIMITER $$
CREATE PROCEDURE  IF  NOT  EXISTS create_list_partition (par_value bigint, tb_schema varchar(128),tb_name varchar(128))
BEGIN
DECLARE par_name varchar(32);
DECLARE par_value_str varchar(32);
DECLARE par_exist int(1);
DECLARE _err int(1);
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
START TRANSACTION;
SET par_value_str = CONCAT('', par_value);
SET par_name = CONCAT('p', par_value);
SELECT  COUNT(1) INTO par_exist  FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = tb_schema AND TABLE_NAME = tb_name AND PARTITION_NAME = par_name;
IF (par_exist = 0) THEN
SET @alter_sql = CONCAT('alter table ', tb_name, ' add PARTITION (PARTITION ', par_name, ' VALUES IN (', par_value_str, '))');
PREPARE stmt1 FROM @alter_sql;
EXECUTE stmt1;
END IF;
COMMIT;
END
$$

(2)调用存储过程添加分区

添加分区

CALL create_list_partition(202201, 'test', 'list_part_table');
CALL create_list_partition(202202, 'test', 'list_part_table');
CALL create_list_partition(20230912, 'test', 'list_part_table');
CALL create_list_partition(20230913, 'test', 'list_part_table');

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

5.通过存储过程删除LIST分区

(1)删除分区的存储过程

DROP PROCEDURE  IF  EXISTS drop_list_partition ;
DELIMITER $$
CREATE PROCEDURE  IF  NOT  EXISTS drop_list_partition (part_value bigint, tb_schema varchar(128), tb_name varchar(128))
BEGIN
DECLARE str_day varchar(64);
DECLARE _err int(1);
DECLARE done int DEFAULT 0;
DECLARE par_name varchar(64);
DECLARE cur_partition_name CURSOR FOR  SELECT  partition_name FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = tb_schema AND table_name = tb_name  ORDER BY partition_ordinal_position;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SET str_day = CONCAT('',part_value);
OPEN cur_partition_name;
REPEAT
FETCH cur_partition_name INTO par_name;
IF (str_day = SUBSTRING(par_name, 2)) THEN
SET @alter_sql = CONCAT('alter table ', tb_name, ' drop PARTITION ', par_name);
PREPARE stmt1 FROM @alter_sql;
EXECUTE stmt1;
END IF;
UNTIL done END REPEAT;
CLOSE cur_partition_name;
END
$$

(2)调用存储过程删除分区

删除分区

CALL drop_list_partition(202201, 'test', 'list_part_table');
CALL drop_list_partition(202202, 'test', 'list_part_table');

查看表的分区信息

select  * from  information_schema.partitions  where table_name like 'list_part_table%' ;

到此这篇关于MySQL-通过存储过程来添加和删除分区(List分区)的文章就介绍到这了,更多相关MySQL添加和删除分区内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 的模块不能安装的解决方法

    MySQL 的模块不能安装的解决方法

    这篇文章主要介绍了MySQL 的模块不能安装的解决方法的相关资料,需要的朋友可以参考下
    2015-07-07
  • mysql实现if语句判断功能的6种使用形式小结

    mysql实现if语句判断功能的6种使用形式小结

    这篇文章主要给大家介绍了关于mysql实现if语句判断功能的6种使用形式,MySQL的IF既可以作为表达式用,也可在存储过程中作为流程控制语句使用,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 关于MySQL外键的简单学习教程

    关于MySQL外键的简单学习教程

    这篇文章主要介绍了关于MySQL外键的简单学习教程,对InnoDB引擎下的外键约束做了简洁的讲解,需要的朋友可以参考下
    2015-11-11
  • phpstudy无法启动MySQL数据库解决方法

    phpstudy无法启动MySQL数据库解决方法

    这篇文章主要给大家介绍了关于phpstudy无法启动MySQL数据库的解决方法,文中通过图文将解决的办法介绍的非常详细,对同样遇到这个问题的同学具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-05-05
  • CentOS下编写shell脚本来监控MySQL主从复制的教程

    CentOS下编写shell脚本来监控MySQL主从复制的教程

    这篇文章主要介绍了在CentOS系统下编写shell脚本来监控主从复制的教程,文中举了两个发现故障后再次执行复制命令的例子,需要的朋友可以参考下
    2015-12-12
  • 设置MySQL中的数据类型来优化运行速度的实例

    设置MySQL中的数据类型来优化运行速度的实例

    这篇文章主要介绍了设置MySQL中索引的数据类型来优化运行速度的实例,主要是适当使用短字节的数据类型来处理短索引,需要的朋友可以参考下
    2015-05-05
  • mysql8.0.18下安装winx64的详细教程(图文详解)

    mysql8.0.18下安装winx64的详细教程(图文详解)

    这篇文章主要介绍了安装mysql-8.0.18-win-x64的详细教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • 通过SqlCmd执行超大SQL文件的方法

    通过SqlCmd执行超大SQL文件的方法

    这篇文章主要介绍了sql server 与 mysql 中常用的SQL语句区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • mysql 5.7.13 安装配置方法图文教程(win10)

    mysql 5.7.13 安装配置方法图文教程(win10)

    这篇文章主要为大家分享了mysql 5.7.13 安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-06-06
  • SQL聚集索引和非聚集索引的区别

    SQL聚集索引和非聚集索引的区别

    本文主要介绍了聚集索引和非聚集索引的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05

最新评论