全部產品
Search
文件中心

Hologres:Hologres SQL語句的常見問題

更新時間:Aug 07, 2024

本文為您羅列Hologres中常見的錯誤碼,以及對應的報錯資訊和解決方案,方便業務快速定位或者處理問題。

HG_ERRCODE_FDW_ERROR

報錯:failed to import foreign schema from odps: Can't find file system factory

  • 問題原因:Hologres不支援查詢MaxCompute側的外部表格。

  • 解決方案:重新建立MaxCompute內部表。

ERRCODE_FDW_ERROR

報錯:failed to import foreign schema from odps: Authorization Failed:xxx

報錯:failed to import foreign schema from odps:Table not found -xxx

  • 問題原因:查詢的表在MaxCompute中不存在。

  • 解決方案:前往MaxCompute確認表是否存在。

ERRCODE_UNIQUE_VIOLATION或者pk violates

報錯:Update row with Key (id)=(xxxx) multiple times或者duplicate key value violates unique constraint

  • 問題原因:違反唯一性限制式,執行UPDATE、INSERT ON CONFLICT或INSERT操作時,主鍵存在重複資料。

  • 解決方案:

    • 若INSERT文法報錯:可以改為INSERT INTO xx ON CONFLICT的文法,實現主鍵去重,詳情請參見INSERT ON CONFLICT(UPSERT)

    • INSERT INTO xx ON CONFLICT文法報錯:為資料來源存在重複資料導致,可參考常見報錯解決。

    • 若以上都不是,可能是因為表設定了TTL,TTL到期了但資料還未被刪除,可以使用hg_remove_duplicated_pk函數清理,詳情請參見常見報錯

ERRCODE_CHECK_VIOLATION或者partition constraint

報錯:ERROR: new row for relation violates partition constraint

  • 問題原因:違反檢查約束,分區表寫入的值與定義的值不一致。例如分區表定義的值為20240110,但是寫入了其他分區值,導致分區衝突。樣本如下:

    CREATE TABLE public.tbl_20240110 PARTITION OF public.tbl FOR VALUES IN('20240110');
    
    INSERT INTO public.tbl_20240110 SELECT * FROM odps_tbl where sale_date >'20240110';
    
    
    error: new row for relation "tbl_20240110" violates partition constraint
    
  • 解決方案:向分區表內寫入符合分區約束的分區值。

ERRCODE_NOT_NULL_VIOLATION或者not-null constraint或者UsageProblem

報錯:null value in column "xxx" violates not-null constraint

  • 問題原因:違反非空約束,NOT NULL的列寫入了NULL值。

  • 解決方案:去掉NULL的髒資料後再進行寫入。

ERRCODE_UNDEFINED_TABLE

報錯:Dispatch query failed: Table not found

  • 問題原因:表不存在,一般出現在表剛剛建立未更新中繼資料或者Query執行過程中,表執行TRUNCATE或DROP操作的情境。

  • 解決方案:可以使用HoloWeb Query洞察排查,在Query執行過程中是否同時存在TRUNCATE或DROP的DDL衝突任務,然後重新執行Query,詳情請參見Query洞察。後期盡量避免Query執行過程中有DDL衝突任務。

ERRCODE_QUERY_CANCELED或者Query Is Cancelled

報錯:ERROR: canceling statement due to statement timeout

  • 問題原因:用戶端設定了逾時時間,Query已耗用時間超過了逾時時間。

  • 解決方案:最佳化Query使其已耗用時間更短,或者重新設定更加合理的逾時時間。逾時時間設定詳情請參見Query管理

報錯:ERROR: Query:[xxx] Get result failed: canceling statement due to user request

  • 問題原因:查詢被取消,通常是因為表被執行了DROP或TRUNCATE操作。

  • 解決方案:可以通過HoloWeb Query洞察排查是否有衝突的DDL,詳情請參見Query洞察。後期盡量避免Query執行過程中有DDL衝突任務。

報錯:query is cancelled Cannot find index full ID:xxx (table id: x, index id: x) in storages or it is deleting

  • 問題原因:Query執行過程中,涉及到的表存在TRUNCATE或DROP等行為,導致表的table id發生變化,Query被取消了。

  • 解決方案:使用Query洞察排查當前Query是否在同一時間執行了TRUNCATE或DROP操作,詳情請參見Query洞察

ERRCODE_FEATURE_NOT_SUPPORTED或者Unsupported Feature

報錯:Feature not supported: insert into parent table

  • 問題原因:不支援直接寫入資料至分區父表。

  • 解決方案:SQL方式執行INSERT時,需要將資料寫入指定的分區子表。詳情請參見CREATE PARTITION TABLE

報錯:SELECT INTO is not supported now.

  • 問題原因:Hologres不支援使用SELECT INTO文法。

  • 解決方案:您可使用INSERT INTO SELECT方式插入資料,詳情請參見INSERT

報錯:ALTER TABLE CHANGE OWNER is not supported in SLPM (Schema-Level Permission Mode)

  • 問題原因:不支援在SLPM模型下使用ALTER TABLE的方式改變表Owner。

  • 解決方案:SLPM許可權模式的表Owner都是使用者組,可以通過將使用者從使用者組中移除的方式來改變使用者的許可權。詳情請參見移除使用者組

報錯:Feature not supported: INSERT ON CONFLICT RETURNING

  • 問題原因:Hologres暫不支援INSERT ON CONFLICT RETURNING文法。

  • 解決方案:去掉RETURNING,僅使用INSERT ON CONFLICT文法,詳情請參見INSERT ON CONFLICT(UPSERT)

報錯:ERROR: INSERT in ddl transaction is not supported now

  • 問題原因:不支援在事務中使用INSERT。樣本如下:

    BEGIN;
    INSERT xxx
    commit;
    ERROR: INSERT in ddl transaction is not supported now
  • 解決方案:在事務外使用INSERT,或者開啟DML事務,詳情請參見SQL事務能力

報錯:Creating publication with table that without binlog is not supported now

  • 問題原因:對沒有開啟Binlog的表建立了Publication。

  • 解決方案:Publication是用於訂閱Binlog的,只允許對開啟了Binlog的表建立Publication,詳情請參見通過JDBC消費Hologres Binlog

報錯:Feature not supported: INSERT on conflict contains un-unique column

  • 問題原因:INSERT ON CONFLICT中的conflict條件使用了非主鍵欄位。

  • 解決方案:INSERT ON CONFLICT中的conflict條件只能使用主鍵。

報錯:Feature not supported: UPDATE with shard keys

  • 問題原因:Hologres不支援對主鍵或Distribution Key執行UPDATE操作。

  • 解決方案:修改SQL重新執行。

報錯:time before 1925 not supported

  • 問題原因:時間相關的函數預設支援的範圍為1925~2282年,超過該範圍則會報錯。

  • 解決方案:如果是to_char、to_date或to_timestamp等函數,可以在SQL前通過設定GUC參數hg_experimental_functions_use_pg_implementation以支援更大範圍的時間。詳情請參見日期和時間函數

報錯:Group by key is type of imprecise not supported

  • 問題原因:GROUP BY的欄位類型是非精確類型,導致出現報錯。

  • 解決方案:GROUP BY中避免非精確資料類型,如FLOAT等,建議使用精確的資料類型。

報錯:CREATE TABLE is not supported for current instance

  • 問題原因:當前執行個體是共用叢集(執行個體Endpoint以hgmc開頭,如hgmc-cn-xxwwwkkk,可前往Hologres管控台查看執行個體Endpoint)或者從執行個體,共用叢集不支援建立內部表,只能建立外部表格,從執行個體只能查詢表資料,不能建立表。

  • 解決方案:

    • 如果是共用叢集,按照建立外部表格的文法建立外部表格,詳情請參見CREATE FOREIGN TABLE。或者使用Hologres獨享執行個體,可支援建立內部表。

    • 如果是從執行個體,需要使用主執行個體建立表。

報錯:ALTER TABLE ALTER COLUMN SET TYPE is not supported now

  • 問題原因:當前不支援通過ALTER TABLE的方式修改列的類型。

  • 解決方案:重建立表並修改列類型。

報錯:ERROR: Currently materialized view does not support aggregate on expressions, only support single column

  • 問題原因:單表物化視圖不支援運算式,從而出現報錯。

  • 解決方案:單表物化視圖避免使用運算式,詳情請參見SQL管理物化視圖

ERRCODE_UNDEFINED_OBJECT

報錯:column xxx does not exist

  • 問題原因:列不存在。

  • 解決方案:重新檢查SQL語句是否錯誤。

報錯:Table group xxx does not exist

  • 問題原因:Table Group不存在。

  • 建表時指定已存在的Table Group,或者提前建立Table Group。

報錯:The specified partition does not exist

  • 問題原因:通常發生在資料寫入或更新時,對應的分區表不存在。

  • 解決方案:提前建立對應分區。

報錯:create binlog reader failed: Fail to find any shards, please check if the table group is in current warehouse

  • 問題原因:該Warehouse上沒有該Table Group。

  • 解決方案:請檢查該Warehouse是否載入了對應的Table Group,若沒有載入,請配置載入Table Group。具體操作,請參見計算群組Table Group授權管理

ERRCODE_INSUFFICIENT_PRIVILEGE或者permission denied

許可權相關的報錯請參考如下文檔:

ERRCODE_OUT_OF_MEMORY或者OOM

報錯:Total memory used by all existing queries exceeded memory limitation

ERRCODE_DATATYPE_MISMATCH

報錯:internal error: Datasets has different schema

  • 問題原因:Query的列與表中原有的列對不齊。

  • 解決方案:檢查SQL的列是否匹配。

ERRCODE_DIVISION_BY_ZERO

  • 問題原因:SQL中有除法,分母的資料是0,不支援除法中分母為0。

  • 解決方案:

    • 避免分母為0,或者使用CASE WHEN文法繞過。

    • 建立MySQL相容性外掛程式,開啟允許除以0的開關,詳情請參見遷移MySQL至Hologres

ERRCODE_STRING_DATA_RIGHT_TRUNCATION

報錯:value too long for type character varying(xxx)

  • 問題原因:欄位長度超過了VARCHAR類型的長度限制。

  • 解決方案:處理資料或將VARCHAR的長度設定得更長,或者將欄位類型改為TEXT。

ERRCODE_PROGRAM_LIMIT_EXCEEDED或者Exceed Odps Scan Limit

報錯:Exceeds the partition limitation of 512, current match xxx partitions.

  • 問題原因:查詢MaxCompute外部表格的分區數量超過了512。

  • 解決方案:增加更多的分區過濾條件,或者使用如下GUC參數調整分區查詢限制,詳情請參見常見問題

    set hg_foreign_table_max_partition_limit =xx;

報錯:Build desc failed: Exceeds the scan limitation of 200 GB, current scan xxx GB.

  • 問題原因:掃描的MaxCompute外部表格資料量超過200 GB。

  • 解決方案:

    • 增加多個過濾條件,減少掃描資料量。

    • 將資料匯入Hologres內部表。內部表沒有資料量的掃描限制。

ERRCODE_SYNTAX_ERROR

報錯:syntax error at or near "xxxxx"

  • 問題原因:SQL語法錯誤。

  • 解決方案:重新檢查SQL文法並修正。

ERRCODE_UNDEFINED_FUNCTION

報錯:DISTINCT is not implemented for window functions

  • 問題原因:Hologres目前不支援在視窗函數中使用DISTINCT關鍵字。

  • 解決方案:視窗函數中去掉DISTINCT。

報錯:ERROR:function xxx does not exist

  • 問題原因:使用函數時未建立對應的extension,或函數文法不滿足規定。

  • 解決方案:按照Hologres的規定正確使用函數。

報錯:ERROR: function jsonb_set(json, text[], jsonb, boolean) does not exist

  • 問題原因:JSONB_SET函數傳入的參數類型不符導致報錯。

  • 解決方案:JSONB_SET函數第一個參數需要傳入JSONB類型,詳情請參見JSON和JSONB類型

ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED

報錯:You have NO privilege 'odps:Select' on xxx

  • 問題原因:當前帳號沒有MaxCompute表的查詢許可權。

  • 解決方案:前往MaxCompute為當前帳號授予相關許可權。

報錯:The sensitive label of column 'xxx' is 2, but your effective label is 0

  • 問題原因:當前帳號只有MaxCompute表中部分列的查詢許可權。

  • 解決方案:前往MaxCompute為當前帳號授予更多許可權,或者只查詢有許可權的列。授權詳情請參見通過命令系統管理使用者許可權

ERRCODE_DUPLICATE_OBJECT

報錯:extension "xxxxx" already exists

  • 問題原因:extension已存在,無需重複建立。

  • 解決方案:無需建立已經存在的extension。

ERRCODE_INVALID_TEXT_REPRESENTATION或者invalid input

報錯:invalid input syntax for type numeric: \"\"

  • 問題原因:NUMERIC類型的欄位有髒資料,不符合NUMERIC的資料規範。

  • 解決方案:處理髒資料。

報錯:invalid input syntax for integer: xxx

  • 問題原因:INT類型的欄位有髒資料,不符合INT的資料規範。

  • 解決方案:處理髒資料。

ERRCODE_BAD_COPY_FILE_FORMAT

報錯:missing data for column "xxx". failed to query next

  • 問題原因:執行COPY命令時,檔案或資料的格式不正確,多發生於資料本身就包含了COPY指定的分隔字元(例如空格),導致列的數量對不上。

  • 解決方案:處理髒資料。

ERRCODE_UNDEFINED_COLUMN

報錯:ERROR: INSERT has more expressions than target columns

  • 問題原因:INSERT寫入的列與目標表的列數不一致。

  • 解決方案:INSERT寫入的列需要與目標表列數保持一致,一一對應。

ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE

報錯:bigint out of range

  • 問題原因:BIGINT類型的資料長度超過了限制。

  • 解決方案:處理髒資料,使其在BIGINT類型的長度範圍內。

報錯:numeric field overflow in function round

  • 問題原因:NUMERIC類型的欄位超過了精度限制。

  • 解決方案:處理髒資料。

ERRCODE_DATETIME_FIELD_OVERFLOW

報錯:InsertOverwrite insert select table data failed : column a.unsign_type does not exist

  • 問題原因:列不存在,或者參數填寫錯誤。

  • 解決方案:重新檢查SQL文法並修改。

報錯:mismatched properties: table orientation is "column" but storage format is "sst"

  • 問題原因:建表時屬性填寫錯誤,設定了列存但是儲存模式選擇了SST。

  • 解決方案:檢查SQL文法並修改。

ERRCODE_INVALID_DATETIME_FORMAT

報錯:invalid value "" for "yyyy",Value must be an integer.

  • 問題原因:資料不符合類型規範。

  • 解決方案:處理髒資料。

ERRCODE_CHARACTER_NOT_IN_REPERTOIRE

報錯:invalid byte sequence for encoding "UTF8": 0xe9 0x80

  • 問題原因:字元不在編碼範圍內,常見於出現了UTF8編碼之外的非法字元。

  • 解決方案:處理髒資料。

ERRCODE_DUPLICATE_TABLE

報錯:relation "xxxx" already exists

  • 問題原因:表已經存在。

  • 解決方案:無需重複建立表。

ERRCODE_UNTRANSLATABLE_CHARACTER

報錯:character with byte sequence 0xe4 0x9e 0xab in encoding "UTF8" has no equivalent in encoding "GBK"

  • 問題原因:表示UTF8編碼的字元在目標GBK格式中無等價項。

  • 解決方案:處理髒資料。

ERRCODE_GROUPING_ERROR

報錯:column "xxx" must appear in the GROUP BY clause or be used in an aggregate function

  • 問題原因:列必須出現在GROUP BY欄位中。

  • 解決方案:重新修改SQL文法。

ERRCODE_INVALID_TRANSACTION_STATE

報錯:SET_TABLE_PROPERTY and CREATE TABLE statement are not in the same transaction for table

  • 問題原因:建表時CREATE TABLE和call屬性不在一個事務(transaction)中,導致報錯。

  • 解決方案:建表時CREATE TABLE需要和call屬性放在同一個事務中,樣本如下:

    begin;
    CREATE TABLE tbl (
     xxxx
    );
    call set_table_property('tbl', 'orientation', 'xx');
    call set_table_property('tbl', 'distribution_key', 'xxx');
    commit;

ERRCODE_AMBIGUOUS_COLUMN

報錯:column reference "xxx" is ambiguous

  • 問題原因:一般是SQL中存在同名但實際上是不同列的情況時,會出現報錯,例如SELECT id FROM t1 INNER JOIN t2 ON t1.id=t2.id中,SELECT後的id欄位沒有指明屬於t1還是t2。

  • 解決方案:重新修改SQL文法。

ERRCODE_DUPLICATE_COLUMN

報錯:column "xxx" specified more than once

  • 問題原因:建表時,一個欄位聲明了多次。

  • 解決方案:重新修改SQL文法。

ERRCODE_AMBIGUOUS_FUNCTION

模稜兩可的函數。通常指函數支援多種類型的入參,但傳參的類型未指定清楚。

ERRCODE_INVALID_COLUMN_DEFINITION

報錯:invalid definition of a numeric type

  • 問題原因:建表時,NUMERIC或DECIMAL類型欄位未指定精度。

  • 解決方案:重新修改SQL文法,並為NUMERIC或DECIMAL類型欄位指定精度。

ERRCODE_CANNOT_COERCE

報錯:cannot cast type date to integer

  • 問題原因:無法將DATE類型轉換為INT類型。

  • 解決方案:重新修改SQL文法。

ERRCODE_UNDEFINED_SCHEMA或者ERRCODE_INVALID_SCHEMA_NAME

報錯:schema "xxxx" does not exist

  • 問題原因:Schema不存在。

  • 解決方案:重新檢查SQL文法是否正常。

ERRCODE_INTERNAL_ERROR

指非預期內的報錯。

報錯:internal error: Connect timeout, err: std_exception: Connection refused

  • 問題原因:通常是由於某種原因導致了執行個體宕機,從而出現報錯。

  • 解決方案:提交工單排查Hologres執行個體宕機原因。

報錯:too many shards in this instance

  • 問題原因:當前執行個體設定的Shard數量超過了執行個體Shard總數的限制。

  • 解決方案:梳理當前執行個體的Shard數,不建議設定超過總數的Shard數,詳情請參見執行個體規格概述

報錯:internal error: Write is not allowed in readonly mode

  • 問題原因:不支援在從執行個體中執行INSERT、UPDATE或DELETE等操作。

  • 解決方案:從執行個體中只允許執行SELECT操作,其餘操作請在主執行個體中執行。

報錯:remaining connection slots are reserved for non-replication superuser connections

  • 問題原因:當前串連數已滿,導致非Superuser帳號無法串連。

  • 解決方案:使用Superuser帳號釋放空閑串連,詳情請參見釋放串連

報錯:Build desc failed: Column type: information_schema.sql_identifier can not translate into hologres type

  • 問題原因:部分系統資料表的欄位類型比較複雜,當前Hologres不支援。

  • 解決方案:不建議將複雜的系統資料表資料與Hologres表關聯查詢。

報錯:ERROR: commit ddl phase1 failed: DDLWrite is not allowed on replica

  • 問題原因:不支援在從執行個體中修改IP白名單。

  • 解決方案:需要在主執行個體中修改IP白名單。

報錯:current transaction is aborted, commands ignored until end of transaction block

  • 問題原因:通常是由於上一個Transaction的命令未執行完,又開始執行下一個命令導致報錯。如:

    begin;
    create xxxx
    
    begin;
  • 解決方案:執行rollback;命令結束當前事務並復原所有未認可的變更。

報錯:query length xxxxx  exceeded the maximum 102400

  • 問題原因:Query的長度超過了102400位元組的限制。

  • 解決方案:改寫Query,使其長度保持在規定範圍內。

報錯:Modify record by primary key is not on this table

  • 問題原因:通常是通過Flink寫入資料時選擇了更新模式,但目標表沒有主鍵,導致資料無法更新。

  • 解決方案:為目標表設定合適的主鍵,詳情請參見主鍵Primary Key

報錯:ERROR: xxx for fe ,should not be evaluated

  • 問題原因:通常是使用某個函數查詢系統資料表導致的報錯。該函數運行在Hologres的引擎,但是系統資料表的計算不會經過Hologres引擎。所以在執行時,將函數直接計算而不經過Hologres引擎,導致了報錯。

  • 解決方案:不建議使用該函數操作Hologres系統資料表。

如何處理數字開頭的欄位?

即時數倉Hologres相容PostgreSQL,使用文法同PostgreSQL,不支援數字開頭的欄位。

如果您使用Hologres時遇到數字開頭的欄位,查詢時需要為該欄位增加雙引號,樣本如下。

select bizdate,"1_day_active_users","7_day_active_users" from t_active_users;

報錯:cannot drop table because other objects depend on it

  • 問題原因:待刪除的表存在相關依賴,例如有視圖使用了該表。

  • 解決方案:先去除相關依賴,再刪除表。

寫入或查詢命令中含有多表Join時報錯: BinaryArray cannot contain more than 2147483646 bytes

  • 問題原因

    Hologres單個欄位大小的上限是2 GB,在統計資訊未及時更新的情況下,多表Join時產生了不合理的執行計畫,從而出現超過2 GB的報錯。

  • 解決方案

    對Join的表執行如下命令用於更新表的統計資訊。

    analyze <tablename>;

    如果更新表的統計資訊後仍然報錯,說明資料中有較大欄位,在SQL前使用如下命令添加GUC參數解決。

    set hg_experimental_query_batch_size = 1024;

匯入或者查詢資料時報錯:Cannot reserve capacity larger than 2^31 - 1 for binary

  • 問題原因及解決方案

    • 原因一:Hologres單個欄位大小的上限為2 GB,在統計資訊未及時更新的情況下,不合理的執行計畫,從而出現超過2 GB的報錯。

      解決方案:對錶執行analyze命令,用於更新表的統計資訊。

      analyze <tablename>;
    • 原因二:表欄位資料量超過2 GB,導致報錯。

      解決方案:在SQL前面添加以下GUC參數以降低每次Query讀取的批次大小。

      set hg_experimental_query_batch_size = 1024;

執行SQL時報錯:internal error: Sequence is used out

  • 問題原因:表中有serial類型,serial類型值超過了取值範圍。

  • 解決方案:

    • 如果是serial類型,建議重建立表,並將類型改為bigserial。

    • serial類型在寫入時會擷取表鎖,建議避免使用serial類型。