TIDB 如何根据月份去分区

【 TiDB 使用环境】生产环境
【 TiDB 版本】 6.5.0
我想通过月份对数据表进行分区,有没有一种办法自动按照每个月去分区,我看到现在的教程按理都是需要每个月都单独的配置,如:
ADD PARTITION (
PARTITION p202001 VALUES LESS THAN ( UNIX_TIMESTAMP(‘2020-02-01 00:00:00’) ),
PARTITION p202002 VALUES LESS THAN ( UNIX_TIMESTAMP(‘2020-03-01 00:00:00’) ),

PARTITION p202006 VALUES LESS THAN ( UNIX_TIMESTAMP(‘2020-07-01 00:00:00’) ),
如果要如上这么配置,要是到了8月,我又需要手动去增加分区了

没有 写程序自己加吧。

2 个赞

写个脚本做个计划任务,每月末定时加分区呗

https://github.com/pingcap/tidb/issues/20848

给这个需求点点赞吧。

好消息是,现在支持range-interval-分区。添加/删除分区并不复杂。

https://docs.pingcap.com/zh/tidb/stable/partitioned-table#range-interval-分区

在 Range 分区中,可以基于 timestamp 列的值分区,并使用 unix_timestamp() 函数,例如:

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

对于 timestamp 列,使用其它的分区表达式是不允许的。
https://docs.pingcap.com/zh/tidb/stable/partitioned-table

CREATE TABLE monthly_report_status (
report_id int NOT NULL,
report_status varchar(20) NOT NULL,
report_date date NOT NULL
)
PARTITION BY RANGE COLUMNS (report_date)
INTERVAL (1 MONTH) FIRST PARTITION LESS THAN (‘2000-01-01’) LAST PARTITION LESS THAN (‘2025-01-01’)
这样建呗

1 个赞

官方可以参考参考隔壁doris的自动分区

CREATE TABLE `${tblDate}` (
    `TIME_STAMP` datev2 NOT NULL COMMENT '采集日期'
) ENGINE=OLAP
DUPLICATE KEY(`TIME_STAMP`)
AUTO PARTITION BY RANGE date_trunc(`TIME_STAMP`, 'month')
(
)
DISTRIBUTED BY HASH(`TIME_STAMP`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

还是提前建好吧,就算有自动加分区的功能也没认为控制靠谱,tidb的ddl不能并发,而且执行多了总会遇到执行卡住问题,尤其分区表操作容易出问题

程序里try catch是不是一种好的方式

交给应用层去处理吧,DBA解决不了的,就丢给程序员 :yum:

1 个赞

这个可以有,哈哈

不是,最好是通过系统表去确认有没有这个分区,没有就添加。

dba提前建也有好处,tidb分区的dll有时候会卡住,选择一个适当时候做

提前建好是不是会提前占用空间?只能根据自己的应用场景,选择最合适的。

1 个赞

手动执行分区,偷懒就自己写个定时计划,实在不行就让开发处理

写程序实现

脚本实现,参数有规律