zoukankan      html  css  js  c++  java
  • 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 ", parName, ret2.Error.Error()) continue }else{ fmt.Printf("成功删除partition %s ", parName) } } }

    结果

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

  • 相关阅读:
    字符,字符串,字节
    111
    串口通信
    字符编码
    枚举和结构体
    参数数组
    .Net垃圾回收机制
    try{ } catch{ } finally{ }
    LVS 工作原理图文讲解
    自动化运维工具—Ansible常用模块二
  • 原文地址:https://www.cnblogs.com/paulwhw/p/14247217.html
Copyright © 2011-2022 走看看