• 技术文章 >数据库 >mysql教程

    mysql怎么删除分区

    长期闲置长期闲置2022-03-09 15:59:45原创127

    在mysql中,可以利用alter语句配合“DROP PARTITION”来删除分区,“DROP PARTITION”的作用就是用于删除指定的分区,语法为“ALTER TABLE '表名' DROP PARTITION '分区名' ”。

    本教程操作环境:windows10系统、mysql8.0.22版本、Dell G3电脑。

    mysql怎么删除分区

    删除分区语法为: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视频教程

    以上就是mysql怎么删除分区的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:mysql
    上一篇:mysql嵌套查询语句是什么 下一篇:mysql中的不等于怎么表示
    PHP编程就业班

    相关文章推荐

    • MySQL数据库基础知识点储备(整理总结)• 归纳详解MySQL知识点之表结构• mysql怎么查询表的大小• MySQL学习之explain用法详解• MySQL详细解析之Clone插件

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网