MySQL通過存儲過程來添加和刪除分區(qū)的過程(List分區(qū))
1.背景原因
當前MySQL不支持在添加和刪除分區(qū)時,使用IF NOT EXISTS和IF EXISTS。所以在執(zhí)行調(diào)度任務(wù)時,直接通過ADD PARTITION和DROP PARTITION不可避免會報錯。本文通過創(chuàng)建存儲過程來添加和刪除分區(qū),可以避免在分區(qū)存在時添加分區(qū)報錯,或者分區(qū)不存在時刪除分區(qū)報錯的問題。
本文介紹的是關(guān)于LIST分區(qū)的添加和刪除。
2.前提準備
創(chuàng)建List分區(qū)表
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 '響應(yīng)時間', `time_used` int(11) NOT NULL COMMENT '耗時(ms)', `create_by` varchar(48) DEFAULT NULL COMMENT '創(chuàng)建人', `update_by` varchar(48) DEFAULT NULL COMMENT '修改人', `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '創(chuàng)建時間', `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) ) ;
查看表中的分區(qū)信息
select * from information_schema.partitions where table_name like 'list_part_table%' ;
3.添加和刪除分區(qū)語句
(1)添加分區(qū)
alter table list_part_table add partition(partition p202001 values in (202001)); alter table list_part_table add partition(partition p20201201 values in (20201201));
查看表的分區(qū)信息
select * from information_schema.partitions where table_name like 'list_part_table%' ;
(2)刪除分區(qū)
alter table list_part_table drop partition p202001,p20201201 ;
查看表的分區(qū)信息
select * from information_schema.partitions where table_name like 'list_part_table%' ;
說明:當上面的添加分區(qū)和刪除分區(qū)語句執(zhí)行多次時,就會報錯。
4.通過存儲過程添加LIST分區(qū)
(1)添加分區(qū)的存儲過程
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)調(diào)用存儲過程添加分區(qū)
添加分區(qū)
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');
查看表的分區(qū)信息
select * from information_schema.partitions where table_name like 'list_part_table%' ;
5.通過存儲過程刪除LIST分區(qū)
(1)刪除分區(qū)的存儲過程
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)調(diào)用存儲過程刪除分區(qū)
刪除分區(qū)
CALL drop_list_partition(202201, 'test', 'list_part_table'); CALL drop_list_partition(202202, 'test', 'list_part_table');
查看表的分區(qū)信息
select * from information_schema.partitions where table_name like 'list_part_table%' ;
到此這篇關(guān)于MySQL-通過存儲過程來添加和刪除分區(qū)(List分區(qū))的文章就介紹到這了,更多相關(guān)MySQL添加和刪除分區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
64位CentOs7源碼安裝mysql-5.6.35過程分享
本文給大家分享的是在64位CentOs7系統(tǒng)中使用源碼安裝mysql-5.6.35的詳細過程,非常的細致,有需要的小伙伴可以參考下2017-02-02MySQL連接被阻塞的問題分析與解決方案(從錯誤到修復(fù))
在Java應(yīng)用開發(fā)中,數(shù)據(jù)庫連接是必不可少的一環(huán),然而,在使用MySQL時,我們可能會遇到MySQL服務(wù)器由于檢測到過多的連接失敗,自動阻止了來自該主機的連接請求,本文將深入分析該問題的原因,并提供完整的解決方案,需要的朋友可以參考下2025-04-04MySQL插入不了中文數(shù)據(jù)問題的原因及解決
最近發(fā)現(xiàn)新安裝的MySQL數(shù)據(jù)庫不能插入中文字段,所以下面這篇文章主要給大家介紹了關(guān)于MySQL插入不了中文數(shù)據(jù)問題的原因及解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05