doris中的临时分区以及golang删除doris临时分区的操作

分区与临时分区文档

关于doris中的partition与temporary partition参考官方文档说明:

http://doris.apache.org/master/en/getting-started/data-partition.html

http://doris.apache.org/master/en/administrator-guide/alter-table/alter-table-temp-partition.html

问题描述

最近做业务需要扩展一下现有doris数据库中的某张表,增加新的字段。使用如下语句扩展:

ALTER TABLE ad_cost ADD COLUMN account_source varchar(255) REPLACE_IF_NOT_NULL DEFAULT '' COMMENT '广告账号平台'

但是执行后server端上报了错误:

"Number":1064,"Message":"errCode = 2, detailMessage = Can not alter table when there are temp partitions in table"

意思是:当前table中有临时分区,无法执行alter操作。

解决思路

既然有临时分区不能执行alter操作,跟同事确认临时分区已经没有用后,删除临时分区后再alter即可。

使用DDL的解决方法

删除单个分区的操作

首先我们看一下表中的临时分区:

SHOW TEMPORARY PARTITIONS FROM ad_cost;

结果包含业务数据信息就不展示了,最终查出了500多条数据。

官方文档给的删除临时分区的操作如下:

ALTER TABLE tbl1 DROP TEMPORARY PARTITION tp1;

一个一个删的话,500多条数据太麻烦了!

DDL语句批量删除临时分区(会报错)

文档给的批量删除分区的命令执行如下:

TRUNCATE TABLE ad_cost TEMPORARY PARTITION(temp_p1335801600000, temp_p1338480000000);

首先,执行这条语句会报错:

1064 - errCode = 2, detailMessage = Not support truncate temp partitions, Time: 0.009000s

也就是说,不支持我们批量删除临时分区。

另外,这条语句也需要将分区名一个个写进去,并不像MySQL中直接truncate table那样方便。

使用Golang + gorm 删除分区 ***

我这边写了一个简单的代码一次性的删除临时分区:

package time_demo

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "testing"
)

// 接受partition的结构体 type PartitionStruct
struct{ PartitionId string `gorm:"column:PartitionId"` PartitionName string `gorm:"column:PartitionName"` // 其他字段省略 } func TestDeleteTemporaryPartition(t *testing.T){ // 1 连接doris dorisDb, dorisErr := gorm.Open("mysql", "xxx:xxx123@(xx.xx.xx.xxx:xxx)/xxx_data_db?charset=utf8&interpolateParams=true") if dorisErr != nil{ panic(dorisErr) } //fmt.Println("dorisDb>>> ", dorisDb) // 2 获取所有 temporary partitions var temPartitionLst []*PartitionStruct queryStr := "show temporary partitions from ad_cost" ret1 := dorisDb.Table("ad_cost").Raw(queryStr).Scan(&temPartitionLst) if ret1.Error != nil{ fmt.Println("ret1.Error>>> ", ret1.Error) panic(ret1.Error) } fmt.Println("len_temPartitionLst>>> ", len(temPartitionLst)) // 3 遍历得到的列表,删除所有的 temporary partitions for _, parObj := range temPartitionLst{ parName := parObj.PartitionName fmt.Println("parName>>> ", parName) delteStr := fmt.Sprintf("alter table ad_cost drop temporary partition %s", parName) if ret2 := dorisDb.Table("ad_cost").Exec(delteStr); ret2.Error != nil{ fmt.Printf("删除partition %s 发生错误!error: %s \n", parName, ret2.Error.Error()) continue }else{ fmt.Printf("成功删除partition %s \n", parName) } } }

结果

删除临时分区后再执行最上面的DDL语句即可为原表中增加新的字段了。

posted on 2021-01-07 16:43  江湖乄夜雨  阅读(2857)  评论(0编辑  收藏  举报