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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM