本文為您羅列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
問題原因:沒有對應MaxCompute表的許可權。
解決方案:前往MaxCompute為帳號設定更多的許可權,詳情請參見通過命令系統管理使用者許可權。
報錯: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
問題原因:Query由於記憶體超出,導致出現OOM。
解決方案:詳情請參見OOM常見問題排查指南。
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已存在,無需重複建立。
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類型。