经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL-通过存储过程来添加和删除分区(List分区)
来源:cnblogs  作者:业余砖家  时间:2023/9/14 9:53:47  对本文有异议

1.背景原因

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

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

2.前提准备

创建List分区表

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

 查看表中的分区信息

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

 

3.添加和删除分区语句

(1)添加分区

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

查看表的分区信息

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

 

(2)删除分区

  1. alter table list_part_table drop partition p202001,p20201201 ;

查看表的分区信息

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

 

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

 

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

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

  1. DROP PROCEDURE IF EXISTS create_list_partition ;
  2. DELIMITER $$
  3. CREATE PROCEDURE IF NOT EXISTS create_list_partition (par_value bigint, tb_schema varchar(128),tb_name varchar(128))
  4. BEGIN
  5.  
  6. DECLARE par_name varchar(32);
  7. DECLARE par_value_str varchar(32);
  8. DECLARE par_exist int(1);
  9. DECLARE _err int(1);
  10. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
  11. START TRANSACTION;
  12. SET par_value_str = CONCAT('', par_value);
  13. SET par_name = CONCAT('p', par_value);
  14. 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;
  15. IF (par_exist = 0) THEN
  16.  
  17. SET @alter_sql = CONCAT('alter table ', tb_name, ' add PARTITION (PARTITION ', par_name, ' VALUES IN (', par_value_str, '))');
  18. PREPARE stmt1 FROM @alter_sql;
  19. EXECUTE stmt1;
  20. END IF;
  21. COMMIT;
  22. END
  23. $$

 

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

添加分区

  1. CALL create_list_partition(202201, 'test', 'list_part_table');
  2. CALL create_list_partition(202202, 'test', 'list_part_table');
  3. CALL create_list_partition(20230912, 'test', 'list_part_table');
  4. CALL create_list_partition(20230913, 'test', 'list_part_table');

查看表的分区信息

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

 

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

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

  1. DROP PROCEDURE IF EXISTS drop_list_partition ;
  2. DELIMITER $$
  3. CREATE PROCEDURE IF NOT EXISTS drop_list_partition (part_value bigint, tb_schema varchar(128), tb_name varchar(128))
  4. BEGIN
  5.  
  6. DECLARE str_day varchar(64);
  7. DECLARE _err int(1);
  8. DECLARE done int DEFAULT 0;
  9. DECLARE par_name varchar(64);
  10. 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;
  11. DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND SET _err = 1;
  12. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  13. SET str_day = CONCAT('',part_value);
  14. OPEN cur_partition_name;
  15. REPEAT
  16. FETCH cur_partition_name INTO par_name;
  17. IF (str_day = SUBSTRING(par_name, 2)) THEN
  18.  
  19. SET @alter_sql = CONCAT('alter table ', tb_name, ' drop PARTITION ', par_name);
  20. PREPARE stmt1 FROM @alter_sql;
  21. EXECUTE stmt1;
  22. END IF;
  23. UNTIL done END REPEAT;
  24. CLOSE cur_partition_name;
  25. END
  26. $$

 

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

删除分区

  1. CALL drop_list_partition(202201, 'test', 'list_part_table');
  2. CALL drop_list_partition(202202, 'test', 'list_part_table');

查看表的分区信息

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

 

原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/17700338.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号