开发者学堂课程【PolarDB-X 开源分布式数据库进阶课程 :PolarDB-X 数据 TTL 过期删除(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1202/detail/18333
PolarDB-X 数据 TTL 过期删除
二、实验演示
我们先创建一一个实验室的资源,稍等一下啊,在等待实验室资源创建的过程中可以先给大家看一下有哪些功能,首先是会演示如何去创建 ttl 表,ttl 其实是 local 盘的,限制的就是 ttl 表,然后以及如何去查看 tl 表的一些元数据,然后其如何去管理这一些要表的分区。然后第二块的话就是因因为我们 ttl 表需要定时的创建新分区,以及是除了分区的这个过程的话,可以我们去跑的 ddx 内核提供了一些定时任务的能力,当然如果是需要更灵活的自己来控制的话,也可以禁用掉这一个定时任务,然后自己根据业务的需要,来自己实现一个定时人物或者甚至是手动得来进行这个操作,这一块是 tlt 表跟普通的 ttl 表之间的一个互相转换。
看到实验室已经创建好了,那我们根据实验的手册,我们可以先安装一下 docker 的环境,然后启动一下 docker。然后安装一个 macal 安装到权限组中。等待的过程中,讲解一下 ttl 表的语法。那首先 ttl 表,他在 dx 的 database 其实有两个模式,一个是 ttl 下表的话,只能在 auto 表中使用,他创建的方式很简单,其实就是你在正常的 create table 的后面跟上t的特有的语法。Ttl 的语法其实含了很多的参数,右图所示就可以指定一共可以指定七个参数,但是它并不是所有的参数都要指定的。那默认情况下你需要指定的最好的其实就是两个一,一个是你希望用哪一个字段,用哪一列来做 t 的分区链,另一个是你时间的间隔周期,这边的话就是一个用 gp modify 来按每个月划分一个分区,我们继续等一下实验室,我们然后当然还有一些比较关键的参数,这边最关键的其实就是一个 interval 这一个的时间力度以及这个 after,刚刚已经解释了,在前面的 PPT中已经解释了这两个的意思,然后我们可以看一下表格,这一次刚刚也解释过了,这里有个 schedule,他的意思就是创建表的时候不要默认自动创建定时任务,但如果这一个 disable 不加的话,他就是会默认自动创建的然后这边还有一个加上一个日期的一个参数,他的意思是你表创建的时候,第一个分区的初始时间,所以你有些系统其实有一些历史数据。
但是他并不希望这些历史数据放到底下表中的时候,一下子就被删除掉,或者说很多历史数据归档到都会都路由到同一个分区,这样的话你直接创建出来一个t表,那他的第一个分区就会包含非常多的数据,那如果提供了这个的话,你就可以把很多很早期的历史数据都也按照一个时间的力度来做一个路由,我们实验室这个已经启动了,我可以看一下之前集群的状态,继续创建为 polar-x,创建一个命名空间,安装有 operator 等待一下,组建的启动应该差不多60秒左右就能自动好。然后我们可以编辑一下这个样文件,让文件也在这个实验手册里有直接把它就好了,rc 进入命令模式,然后它保存,他现在已经正在创建我们的 Polor-X 集群。
创建中我们可以再开一个 terminal,右上角有一个加号,点击加号可以重新开一个 terminal,然后看看 Polar- x 的创建进度,这个操作可能会需要一个好几分钟的时间,那我们还是继续来讲解我们的功能,刚刚这个表中的参数其实都是给我们建表的时候,这个表的时候使用的,那我们建完的表之后,其实我们关心的他表的一个原数据,就是我们分的哪些分区,我们希望知道这件事情,那关于这个功能的话,ttl 其实其中的一个视图里,所以我们可以直接使用的新 from local 系统,系统表这是一个系统的视图表,我们告诉他表明跟在哪个库中就能看到这张表所有的T7分区要注意这个分区跟你数据的那个分区是不一样的。
select * from infornation_schena.Local_partitions where table_name t_create_Lxok"and table_schema='local_partition'\G;
TABLE_SCHEMA:Local_partition
TABLE_NAME:t_create_Lxok
PARTITION_NAME:p20211101
PARTITION_METHOD:RANGE COLUMNS
PARTITION_EXPRESSION: gmt_modified
PARTITION_DESCRIPTION:‘2021-11-01
PARTITION_COMMENT:expire:2022-11-01
2.row
TABLE_SCHEMA:Local_partition
TABLE_NAME:t_create_lxok
PARTITION_NAHE:p20211201
PARTITION_METHOD:RANGE COLUMNS
PARTITION_EXPRESSION:*gmt_modified
PARTITION_DESCRIPTION:‘2021-12-01
PARTITION_COMMENT:exp1re:2022-12-01
3. row **林*林**************
TABLE_SCHEMA:Local_partition
TABLE_NAME:t_create_Lxok
PARTITION_NAME:pmax
PARTITION_METHOD:RANGECOLUMNS
PARTITION_EXPRESSION: gmt_modified
PARTITION_DESCRIPTION:MAXVALUE
PARTITION_COMMENT:
-- 分配新分区的语法
ALTER TABLE <table_name> ALLOCATE LOCAL PARTITION;
-- 示例
ALTER TABLE t_order ALLOCATE LOCAL PARTITION;
-- 删除过期分区的语法
ALTER TABLE <table_name> EXPIRE LOCAL PARTITION [<local_partition_name>];
-- 可以指定分区名
ALTER TABLE t_order EXPIRE LOCAL PARTITION p20210401;
-- 未失效分区不允许删除,会报错
ALTER TABLE t_order EXPIRE LOCAL PARTITION p20221101;
-- 不指定分区名时,删除所有已过期的分区
ALTER TABLE t_order EXPIRE LOCAL PARTITION;
-- 校验 TTL 分区一致性
CHECK TABLE <table_name> WITH LOCAL PARTITION;
数据分区是按哈希分区或者是其他,但是 ttl 表分区主要是按时间来分区,这个系统表中的信息主要是我所有的 ttl 的分区,这边的话就会发现有三个,然后分别是数据小于2021 11月1号的会路由到第一个分析,然后小于12月1号的回来,然后其他的数据大于小于一起到这个 NEX 的分局。然后这里也显示了他每个分区的失效时间,那到了这个失效时间之后,我们可以通过右边的这些命令去把这个分区删掉,或者说如果有定时任务的话,定时任务会自动把这个删掉,然后这边的话其实主要是两个命令,一个是 ate,那个是 x local party,那如果有一个分区它没有过期的话,但是我们去执行这个 local partition,他是这这个可以放心的是他数据是不会被删掉的,只有已经过期的分区,我们调用这个命令,他才会把这个数据删掉,同样的,我们多次的调用这个命令,他也不会无限的创建新的分区出来,他只会按照我们建表的时候定义的,比如说我们希望提前三个月创建分区,让他最多就会提前创建三个分区,实验室已经创建成功了叉集群,通过这一个命令,我们可以获取一下 io 的密码,然后我们再开一个窗口来连接,他数据节点已经准备成功了,但是他西安节点还没有准备成功,就可能还得等一下,他时间节点在创建中,是要在可能还需要再等两分钟。
那还是继续来讲我们的 ttl 的命令,这边还有一个 check,指定是 check table,然后加上表明后面是 with local partition,因为前面前面解释过啊,他ttl的功能是跟 polar-bx 分区表的功能是正交的每个分区,其实他在数据节点上都是一个物理表。其实就是给物理表上再做一个分区,这也是为什么它叫 local partition,那我们其实这个命令的作用就是去校验他的 dx 所有的分区的物理表的物理分区是否是相同。
默认的话,具体要所有的功能都是会保证这个的一致性的。一般也不用担心抛开时间节点,创建成功了可以开启一下端口的转发,然后在新的村民里,我们可以去直接连上我们的 polar-db 节点密码的话,密码的话放到在这里,我们已经连上了,可以 version 看一下说现在还没有数据库,那我们可以去创建一个数据库他刚解释过了,那条表功能只有在 mod 等于的数据的库存,可以使用然后我们成功的创建的数据库,那我们现在再来创建一个 ttl 表。
详细的文档的话,在实验室的手册里也有,大家可以打开这个详细文档,在阿里云的 polar-bx 的官网上看一下这些所有的参数,自己看创建表的时候可以根据这一个参考手册来创建。那我们创建一个这样的表我们上面一个70秒,他一共只有两个字段 ID,然后我们按照 gt modify 的做时间的分区,第一个分区的时间是2021年,2021年的1月1号,然后每个周期是一个月,然后过期时间12个月,那所以我们可以想一下,第一个分区是2021年的1月1号,那他其实他第一份去的过期时间其实是2022年的1月1号。然后会提前创建三个分区,那我们预期其实是第一个分区是2022,2021年的1月1号,最后一个分区是当前时间加上三个周期,现在是11月份,所以11+3,那就是可能是一个2月份的一个时间,那我们可以先看一下穿出来的表结构,表结构没问题,没有这一个 information 去可以查看它,物理表的分区这个表,这所有的物理表一共都有二十七八个分区,可以看到他最小的一个分区确实是2021年的1月1号,这就是那个参数规定的第一个分区,它是要的时间也符合预期,2021年1月1号加上12个月就是2022年1月1号,那我们来看一下最后一个分区,因为是现在是11月份,那不加上三个,三个分区范围其实就是明年的二月份,明年的2月份,再过12个月过期,那其实就是后年的二月份。
那所有的表都有一个 max 的分区,这个 max 分区可以用来承载一些时间特别大的分区都会路由到这个 max 中,然后这个是这个命令是用来创建新的分区的,比如说现在比如说现在又过了一个月,现在现在假设已经是12月份了,但我们这时候在调用这个命令的话,他就会去检查我们所有物理表的一个最新的分区,看看一下是否需要给所有的物理表在创建一个新的分区,但是因为这个表示刚刚创建出来的,所以这个命令是其实相当于不会做任何事情,但是我们有很多的老的分区,其实是已经过期了,那这个 X8 local partition 就可以去把这些老的分区给删掉我们看,之后再去看一下这个的原数据 K 最现在只剩下16个分区的,前面的话应该是有27的分区,所以有很多个老的分区已经删掉了,然后现在的最老的数据是2021年的12月11号的数据。
那他过期的时间是2022年的12月1号,今天是11月25号,那其实这个分区再过几天如果再跳一遍这个命令的话,这个分区也会被删掉,那除了我们手动的掉这两个低调命令可以控制这一个分区,其实就是本质上类似于一个时间,滑动窗口一样的结构去不断的滚动我们之外,我们还有一个定时任务的功能,能够帮助我们做这件事情,能够自动的画着做这件事情,那我们先现在先把这个表重建一下。Job 之后我们再创建一遍创建成功之后,我们再通过这个语法创建一个定时任务,这个定时任务的意思就是 schedule for local partition 这些都是关键词,这个后面跟的是数据库的名字,就跟表的名字,然后这边后面可以接一个 Pro 表达式来以及一个摊中的参数啊,这个表达式的含义,这边有一个视图分别是你现在给这个视图可以查看这个数据库中所有的定时任务,那这一定时任务的表达式是这样的一个字符串,它的含义就是每隔五天之后再中午的12点执行,然后他下一次执行的时间是11月26号的12点,然后是去加800,那因为这是他第一次调度,所以他会立刻调度一下12月26号下一次之后那就是26+5天,那就是三月,三月初会再继续执行,但是但是这个太晚了,我们可以手动的触发一下这一个定时任务,手动出的触发,让他执行一下。其实定时任务还有一个运维窗口,那运维窗口的话其实可以在 polar-dbx 控制台页面上来进行设置,那默认的话它是
一个在凌晨的业务低峰期允许你执行这些运维指令,但是我们可以通过
这个现在的命令来允许我们现在就执行 Fire Schedule 加上定时任务就可以手动触发他一下。Show schedule result 的意思是可以查看一下目前所有将要执行的定时任务以及他的执行的状态,可以看到,他在等待被调度这个等待应该不会很久,一分钟左右它就会开始调度这个定时任务好,他已经进入一个 running 状态了。现在已经是一个 success的状态,然后他开始时间跟结束时间是这个 time,然后这边 mark 中有一个信息。可以发现他后面有很多个日期,这些日期其实是指的这是我们 ttl 的时间分区,哪些时间分区被删除掉了。所以这边一共删除的大概十个分区左右,然后这个的表一开始创建的时候应该还是27个分区,那我们现在可以看看他的元数据,现在剩下多少个分区的,他现在只剩下了16个分区了,那最早的分区是一号过期,这就是天天配套的一个定时任务的功能,当然这个定时任务其实如果不想要的话,也可以把它删掉。这时候再去查那个定时任务的视图的话,就会发现已经没有定时任务在这里,介绍完了那条表的如何创建?如何去做一个分区的管理以及定时任务自动的来帮我们做件这件事情之后。
我们最后介绍一下 gl 表如何去跟普通的表做一个互相之间的转换,这个转换其实也很简单,他他要做的其实就是 alter table 后面跟上 to 的语法,这个表的语法跟你 table 的时候的语法是一模一样的。然后所有的体检表跟补充表以及表跟他自身都是可以进行任意的转换的,他那比如说现在通过这个语法 the order remove local partition,他就可以把这个提调表变成一个普通的表,就是他执行完之后,他就不再按照我们时间分区来进行一个物理掉的划分了,说 for table to order 可以看到他后面已经没有 t 表的那一套有后缀了,那我们就像刚刚说的,可以通过这一个 table 的指令重新把它变成一个人先去掉。
然后我们把它变成一个 ttl 表之后,我们再看一下它的元数据,看到这边其实他又按照了我的定义所描述的,按照时间做为一个划分了,那 ttl 表的主要功能就是这些。