百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Mysql扩展表分区(mysql增加表分区)

wxin55 2024-11-14 18:43 11 浏览 0 评论

由于表分区用完了,程序开始报错

解决方法:增加表分区

ALTER TABLE customeventlabelsum ADD PARTITION ( 

......

PARTITION kvs_s20241209 VALUES LESS THAN (20241209), 
PARTITION kvs_s20241216 VALUES LESS THAN (20241216),
PARTITION kvs_s20241223 VALUES LESS THAN (20241223), 
PARTITION kvs_s20241230 VALUES LESS THAN (20241230)
);

mysql分区表在定义分区时,有时会定义一个maxvalue的分区,相当于一个默认分区,保证所有数据都能被分区表存储。

对于这种情况需要使用一下sql来添加分区

MAXVALUE分区拆分为多个分区

alter table enterprise.userprofile_bak1 REORGANIZE PARTITION pmax INTO(
PARTITION p101 VALUES LESS THAN (1646064000) ENGINE = InnoDB,
PARTITION pmax VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB
);

执行后:


其他分区相关sql

查看每个分区的记录行数和占用大小

SELECT PARTITION_NAME,TABLE_ROWS,DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'userprofile_bak1';

清理分区数据为空,保留分区不删除,仅仅是清理数据,命令如下

alter table bm_scenes_data_reminder truncate partition p20210104; 

删除分区

alter table bm_scenes_data_reminder drop partition p20210104; 

查看所有表的可用分区数量

SELECT
	table_name,
	count(*) 
FROM
	information_schema.`PARTITIONS` 
WHERE
	table_name NOT IN ( 'information_schema', 'performance_schema', 'sys' ) 
	AND partition_name IS NOT NULL 
	AND partition_method IS NOT NULL 
	AND table_rows = 0 
GROUP BY
	table_name;

案例:

系统有操作系统表sys_log,实现每天删除90天前的分区并同时建一个4天后的分区(即每天将4天后的分区创建表),步骤如下:

  1. ##新建普通表,只执行一次
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
  1. ##修改成分区表,只执行一次,留一个当前时间的分区和将来的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
);
  1. ##每天执行以下的分区操作,进行增加一天的分区,如
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);
  1. ##定时任务配置,每天执行一次分区的清理与创建
30 4 * * * /bin/python /home/testuser/SyslogPartitionClear.py >/dev/null 2>&1

脚本:

#!/usr/bin/python
# -*- coding: utf8 -*-

import mysql.connector
import datetime

class SyslogPartitionClear(object):
    'SyslogPartitionClear clearData'
    def clearData(self,deleteTime,afterTime):

        db = None    
        try:
            db = mysql.connector.connect(host='127.0.0.1',port=3306,user='webuser', password='123456', database='icnoclx_webdb',cha
rset="utf8", use_unicode=True)
            
            cursor = db.cursor()
            cursor.execute("select to_days(DATE_ADD(NOW(),INTERVAL 4 DAY))")
            results = cursor.fetchall()
            
            ##
            partitionIntegerValue = 0;
            for row in results: 
                partitionIntegerValue = row[0]
            
            try:
                print "ALTER TABLE sys_log drop PARTITION p"+deleteTime+";"
                cursor.execute("ALTER TABLE sys_log drop PARTITION p"+deleteTime+";")          
            except Exception, e:
                print e
            
            try:
                print "ALTER TABLE sys_log drop PARTITION future;"
                cursor.execute("ALTER TABLE sys_log drop PARTITION future;")          
            except Exception, e:
                print e           
            
            try:
                print "ALTER TABLE sys_log ADD PARTITION (PARTITION p"+afterTime+" VALUES LESS THAN ("+str(partitionIntegerValue)+"
) ENGINE = InnoDB);"
                cursor.execute("ALTER TABLE sys_log ADD PARTITION (PARTITION p"+afterTime+" VALUES LESS THAN ("+str(partitionIntege
rValue)+") ENGINE = InnoDB);")      
            except Exception, e:
                print e             
            
            try:
                print "ALTER TABLE sys_log ADD PARTITION (PARTITION future VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);"
                cursor.execute("ALTER TABLE sys_log ADD PARTITION (PARTITION future VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);")
     
            except Exception, e:
                print e               
            
            db.commit()
            
        except Exception, e: 
            db.rollback()
            print e
        finally:
            db.close()
        
if __name__ == '__main__':

    now=datetime.datetime.now()
    delta=datetime.timedelta(days=-90)
    before_day = now + delta
    deleteTime = before_day.strftime('%Y%m%d')
    
    after_day = now + datetime.timedelta(days=4)
    afterTime = after_day.strftime('%Y%m%d')
    
    obj = SyslogPartitionClear()
    obj.clearData(deleteTime,afterTime) 

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: