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语句即可为原表中增加新的字段了。