在mysql中,可以利用alter語句配合「DROP PARTITION」來刪除分割區,「DROP PARTITION」的作用就是用於刪除指定的分割區,語法為「ALTER TABLE '表名' DROP PARTITION '分割區名' 」。
本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
刪除分割區語法為:ALTER TABLE '表名' DROP PARTITION '分割區名'
清理分割區資料為空,保留分割區不刪除,僅僅是清理資料,命令如下
alter table bm_scenes_data_reminder truncate partition p20210104;
刪除分割區
alter table bm_scenes_data_reminder drop partition p20210104;
刪除後執行檢視建表語句,可以看到p20210104分割區沒有了
增加分割區
##如果希望將剛刪除的p20210104分割區重新加回去?怎麼辦。先嚐試直接執行增加分割區命令試試
ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210104 VALUES LESS THAN (738159) ENGINE = InnoDB);
結果如下,說明是不可行的。
mysql> ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210104 VALUES LESS THAN (738159) ENGINE = InnoDB); ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition mysql>
##1步驟中不可行,提示必須是在最後一個分割區的後面才可以這樣增加。
因此如果一定要加回p20210104這個分割區(即需要在中間部分增加分割區),只能將p20210104 後面的分割區先全刪除,再增加p20210104分割區,再後p20210104 後面的分割區重新加回去。操作如下:
##先刪除p20210104分割區後面的所有分割區
ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210105; ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210106; ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210107; ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210108; ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210109; ALTER TABLE bm_scenes_data_reminder drop PARTITION p20210110; ALTER TABLE bm_scenes_data_reminder drop PARTITION future;
##增加p20210104分割區
ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210104 VALUES LESS THAN (738159) ENGINE = InnoDB);
##把p20210104分割區後面的所有分割區重新加回去
ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210105 VALUES LESS THAN (738160) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210106 VALUES LESS THAN (738161) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210107 VALUES LESS THAN (738162) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210108 VALUES LESS THAN (738163) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210109 VALUES LESS THAN (738164) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION p20210110 VALUES LESS THAN (738165) ENGINE = InnoDB); ALTER TABLE bm_scenes_data_reminder ADD PARTITION (PARTITION future VALUES LESS THAN MAXVALUE ENGINE = InnoDB);
最後再檢視一下ddl發現分割區加回去了,但這種操作方式會把p20210104分割區後面的所有分割區資料刪除,在正式線上環境中請慎
案例
系統有作業系統表sys_log,實現每天刪除90天前的分割區並同時建一個4天后的分割區(即每天將4天后的分割區建立表),步驟如下:
##新建普通表,只執行一次
CREATE TABLE `sys_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `begin_time` datetime DEFAULT NULL COMMENT '開始時間', `end_time` datetime DEFAULT NULL COMMENT '結束時間', `spend_mills` int(11) DEFAULT NULL COMMENT '執行時長,單位ms', `username` varchar(100) DEFAULT NULL COMMENT '使用者id', `log_status` int(11) NOT NULL DEFAULT '0' COMMENT '執行狀態,[0]成功[1]失敗', `code` int(11) NOT NULL DEFAULT '0' COMMENT '錯誤碼', `remote_addr` varchar(50) DEFAULT '' COMMENT '遠端地址', `request_uri` varchar(255) DEFAULT NULL COMMENT '請求路徑', `user_agent` text COMMENT '使用者代理', `req_data` text NOT NULL COMMENT '請求引數', `resp_data` longtext NOT NULL COMMENT '返回結果', PRIMARY KEY (`id`) USING BTREE, KEY `idx_log_begintime` (`begin_time`) USING BTREE COMMENT '系統紀錄檔的beginTime欄位索引' ) ENGINE=Innodb DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
##修改成分割區表,只執行一次,留一個當前時間的分割區和將來的future分割區
ALTER TABLE `sys_log` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`,`begin_time`); alter table sys_log partition by RANGE (to_days(begin_time)) ( PARTITION p20210816 VALUES LESS THAN (738383), PARTITION future VALUES LESS THAN MAXVALUE );
##每天執行以下的分割區操作,進行增加一天的分割區,如
ALTER TABLE sys_log drop PARTITION future; ALTER TABLE sys_log ADD PARTITION (PARTITION p20210817 VALUES LESS THAN (738384) ENGINE = InnoDB); ALTER TABLE sys_log ADD PARTITION (PARTITION p20210818 VALUES LESS THAN (738385) ENGINE = InnoDB); ALTER TABLE sys_log ADD PARTITION (PARTITION p20210819 VALUES LESS THAN (738386) ENGINE = InnoDB); ALTER TABLE sys_log ADD PARTITION (PARTITION future VALUES LESS THAN MAXVALUE ENGINE = InnoDB);
##定時任務設定,每天執行一次分割區的清理與建立
30 4 * * * /bin/python /home/testuser/SyslogPartitionClear.py >/dev/null 2>&1
推薦學習:
以上就是mysql怎麼刪除分割區的詳細內容,更多請關注TW511.COM其它相關文章!