MySQL通過(guò)存儲(chǔ)過(guò)程來(lái)添加和刪除分區(qū)的過(guò)程(List分區(qū))
1.背景原因
當(dāng)前MySQL不支持在添加和刪除分區(qū)時(shí),使用IF NOT EXISTS和IF EXISTS。所以在執(zhí)行調(diào)度任務(wù)時(shí),直接通過(guò)ADD PARTITION和DROP PARTITION不可避免會(huì)報(bào)錯(cuò)。本文通過(guò)創(chuàng)建存儲(chǔ)過(guò)程來(lái)添加和刪除分區(qū),可以避免在分區(qū)存在時(shí)添加分區(qū)報(bào)錯(cuò),或者分區(qū)不存在時(shí)刪除分區(qū)報(bào)錯(cuò)的問(wèn)題。
本文介紹的是關(guān)于LIST分區(qū)的添加和刪除。
2.前提準(zhǔn)備
創(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 '請(qǐng)求時(shí)間', `response_time` datetime(0) NOT NULL COMMENT '響應(yīng)時(shí)間', `time_used` int(11) NOT NULL COMMENT '耗時(shí)(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)建時(shí)間', `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時(shí)間', 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ū)語(yǔ)句
(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%' ;
說(shuō)明:當(dāng)上面的添加分區(qū)和刪除分區(qū)語(yǔ)句執(zhí)行多次時(shí),就會(huì)報(bào)錯(cuò)。
4.通過(guò)存儲(chǔ)過(guò)程添加LIST分區(qū)
(1)添加分區(qū)的存儲(chǔ)過(guò)程
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)用存儲(chǔ)過(guò)程添加分區(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.通過(guò)存儲(chǔ)過(guò)程刪除LIST分區(qū)
(1)刪除分區(qū)的存儲(chǔ)過(guò)程
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)用存儲(chǔ)過(guò)程刪除分區(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-通過(guò)存儲(chǔ)過(guò)程來(lái)添加和刪除分區(qū)(List分區(qū))的文章就介紹到這了,更多相關(guān)MySQL添加和刪除分區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql實(shí)現(xiàn)if語(yǔ)句判斷功能的6種使用形式小結(jié)
這篇文章主要給大家介紹了關(guān)于mysql實(shí)現(xiàn)if語(yǔ)句判斷功能的6種使用形式,MySQL的IF既可以作為表達(dá)式用,也可在存儲(chǔ)過(guò)程中作為流程控制語(yǔ)句使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
關(guān)于MySQL外鍵的簡(jiǎn)單學(xué)習(xí)教程
這篇文章主要介紹了關(guān)于MySQL外鍵的簡(jiǎn)單學(xué)習(xí)教程,對(duì)InnoDB引擎下的外鍵約束做了簡(jiǎn)潔的講解,需要的朋友可以參考下2015-11-11
phpstudy無(wú)法啟動(dòng)MySQL數(shù)據(jù)庫(kù)解決方法
這篇文章主要給大家介紹了關(guān)于phpstudy無(wú)法啟動(dòng)MySQL數(shù)據(jù)庫(kù)的解決方法,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的同學(xué)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-05-05
CentOS下編寫(xiě)shell腳本來(lái)監(jiān)控MySQL主從復(fù)制的教程
這篇文章主要介紹了在CentOS系統(tǒng)下編寫(xiě)shell腳本來(lái)監(jiān)控主從復(fù)制的教程,文中舉了兩個(gè)發(fā)現(xiàn)故障后再次執(zhí)行復(fù)制命令的例子,需要的朋友可以參考下2015-12-12
設(shè)置MySQL中的數(shù)據(jù)類型來(lái)優(yōu)化運(yùn)行速度的實(shí)例
這篇文章主要介紹了設(shè)置MySQL中索引的數(shù)據(jù)類型來(lái)優(yōu)化運(yùn)行速度的實(shí)例,主要是適當(dāng)使用短字節(jié)的數(shù)據(jù)類型來(lái)處理短索引,需要的朋友可以參考下2015-05-05
mysql8.0.18下安裝winx64的詳細(xì)教程(圖文詳解)
這篇文章主要介紹了安裝mysql-8.0.18-win-x64的詳細(xì)教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
通過(guò)SqlCmd執(zhí)行超大SQL文件的方法
這篇文章主要介紹了sql?server?與?mysql?中常用的SQL語(yǔ)句區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
mysql 5.7.13 安裝配置方法圖文教程(win10)
這篇文章主要為大家分享了mysql 5.7.13 安裝配置方法圖文教程,感興趣的朋友可以參考一下2016-06-06

