Hologres SQL語句的常見問題
本文為您羅列Hologres中常見的錯誤碼,以及對應(yīng)的報錯信息和解決方案,方便業(yè)務(wù)快速定位或者處理問題。
HG_ERRCODE_FDW_ERROR
報錯:failed to import foreign schema from odps: Can't find file system factory
問題原因:Hologres不支持查詢MaxCompute側(cè)的外部表。
解決方法:重新創(chuàng)建MaxCompute內(nèi)部表。
ERRCODE_FDW_ERROR
報錯:failed to import foreign schema from odps: Authorization Failed:xxx
問題原因:沒有對應(yīng)MaxCompute表的權(quán)限。
解決方法:前往MaxCompute為賬號設(shè)置更多的權(quán)限,詳情請參見通過命令管理用戶權(quán)限。
報錯:failed to import foreign schema from odps:Table not found -xxx
問題原因:查詢的表在MaxCompute中不存在。
解決方法:前往MaxCompute確認(rèn)表是否存在。
ERRCODE_UNIQUE_VIOLATION或者pk violates
報錯:Update row with Key (id)=(xxxx) multiple times或者duplicate key value violates unique constraint
問題原因:違反唯一性約束,執(zhí)行UPDATE、INSERT ON CONFLICT或INSERT操作時,主鍵存在重復(fù)數(shù)據(jù)。
解決方法:
若INSERT語法報錯:可以改為
INSERT INTO xx ON CONFLICT
的語法,實現(xiàn)主鍵去重,詳情請參見INSERT ON CONFLICT(UPSERT)。若
INSERT INTO xx ON CONFLICT
語法報錯:為數(shù)據(jù)源存在重復(fù)數(shù)據(jù)導(dǎo)致,可參考常見報錯解決。若以上都不是,可能是因為表設(shè)置了TTL,TTL到期了但數(shù)據(jù)還未被刪除,可以使用hg_remove_duplicated_pk函數(shù)清理,詳情請參見常見報錯。
ERRCODE_CHECK_VIOLATION或者partition constraint
報錯:ERROR: new row for relation violates partition constraint
問題原因:違反檢查約束,分區(qū)表寫入的值與定義的值不一致。例如分區(qū)表定義的值為20240110,但是寫入了其他分區(qū)值,導(dǎo)致分區(qū)沖突。示例如下:
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
解決方法:向分區(qū)表內(nèi)寫入符合分區(qū)約束的分區(qū)值。
ERRCODE_NOT_NULL_VIOLATION或者not-null constraint或者UsageProblem
報錯:null value in column "xxx" violates not-null constraint
問題原因:違反非空約束,NOT NULL的列寫入了NULL值。
解決方法:去掉NULL的臟數(shù)據(jù)后再進行寫入。
ERRCODE_UNDEFINED_TABLE
報錯:Dispatch query failed: Table not found
問題原因:表不存在,一般出現(xiàn)在表剛剛創(chuàng)建未更新元數(shù)據(jù)或者Query執(zhí)行過程中,表執(zhí)行TRUNCATE或DROP操作的場景。
解決方案:可以使用HoloWeb Query洞察排查,在Query執(zhí)行過程中是否同時存在TRUNCATE或DROP的DDL沖突任務(wù),然后重新執(zhí)行Query,詳情請參見Query洞察。后期盡量避免Query執(zhí)行過程中有DDL沖突任務(wù)。
ERRCODE_QUERY_CANCELED或者Query Is Cancelled
報錯:ERROR: canceling statement due to statement timeout
問題原因:客戶端設(shè)置了超時時間,Query運行時間超過了超時時間。
解決方法:優(yōu)化Query使其運行時間更短,或者重新設(shè)置更加合理的超時時間。超時時間設(shè)置詳情請參見Query管理。
報錯:ERROR: Query:[xxx] Get result failed: canceling statement due to user request
問題原因:查詢被取消,通常是因為表被執(zhí)行了DROP或TRUNCATE操作。
解決方法:可以通過HoloWeb Query洞察排查是否有沖突的DDL,詳情請參見Query洞察。后期盡量避免Query執(zhí)行過程中有DDL沖突任務(wù)。
報錯:query is cancelled Cannot find index full ID:xxx (table id: x, index id: x) in storages or it is deleting
問題原因:Query執(zhí)行過程中,涉及到的表存在TRUNCATE或DROP等行為,導(dǎo)致表的table id發(fā)生變化,Query被取消了。
解決方法:使用Query洞察排查當(dāng)前Query是否在同一時間執(zhí)行了TRUNCATE或DROP操作,詳情請參見Query洞察。
ERRCODE_FEATURE_NOT_SUPPORTED或者Unsupported Feature
報錯:Feature not supported: insert into parent table
問題原因:不支持直接寫入數(shù)據(jù)至分區(qū)父表。
解決方法:SQL方式執(zhí)行INSERT時,需要將數(shù)據(jù)寫入指定的分區(qū)子表。詳情請參見CREATE PARTITION TABLE。
報錯:SELECT INTO is not supported now.
問題原因:Hologres不支持使用SELECT INTO語法。
解決方法:您可使用INSERT INTO SELECT方式插入數(shù)據(jù),詳情請參見INSERT。
報錯:ALTER TABLE CHANGE OWNER is not supported in SLPM (Schema-Level Permission Mode)
問題原因:不支持在SLPM模型下使用ALTER TABLE的方式改變表Owner。
解決方法:SLPM權(quán)限模式的表Owner都是用戶組,可以通過將用戶從用戶組中移除的方式來改變用戶的權(quán)限。詳情請參見移除用戶組。
報錯: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
問題原因:不支持在事務(wù)中使用INSERT。示例如下:
BEGIN; INSERT xxx commit; ERROR: INSERT in ddl transaction is not supported now
解決方法:在事務(wù)外使用INSERT,或者開啟DML事務(wù),詳情請參見SQL事務(wù)能力。
報錯:Creating publication with table that without binlog is not supported now
問題原因:對沒有開啟Binlog的表創(chuàng)建了Publication。
解決方法:Publication是用于訂閱Binlog的,只允許對開啟了Binlog的表創(chuàng)建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執(zhí)行UPDATE操作。
解決方法:修改SQL重新執(zhí)行。
報錯:time before 1925 not supported
問題原因:時間相關(guān)的函數(shù)默認(rèn)支持的范圍為1925~2282年,超過該范圍則會報錯。
解決方法:如果是to_char、to_date或to_timestamp等函數(shù),可以在SQL前通過設(shè)置GUC參數(shù)
hg_experimental_functions_use_pg_implementation
以支持更大范圍的時間。詳情請參見日期和時間函數(shù)。
報錯:Group by key is type of imprecise not supported
問題原因:GROUP BY的字段類型是非精確類型,導(dǎo)致出現(xiàn)報錯。
解決方法:GROUP BY中避免非精確數(shù)據(jù)類型,如FLOAT等,建議使用精確的數(shù)據(jù)類型。
報錯:CREATE TABLE is not supported for current instance
問題原因:當(dāng)前實例是共享集群(實例Endpoint以
hgmc
開頭,如hgmc-cn-xxwwwkkk
,可前往Hologres管控臺查看實例Endpoint)或者從實例,共享集群不支持創(chuàng)建內(nèi)部表,只能創(chuàng)建外部表,從實例只能查詢表數(shù)據(jù),不能創(chuàng)建表。解決方法:
如果是共享集群,按照創(chuàng)建外部表的語法創(chuàng)建外部表,詳情請參見CREATE FOREIGN TABLE。或者使用Hologres獨享實例,可支持創(chuàng)建內(nèi)部表。
如果是從實例,需要使用主實例創(chuàng)建表。
報錯:ALTER TABLE ALTER COLUMN SET TYPE is not supported now
問題原因:當(dāng)前不支持通過ALTER TABLE的方式修改列的類型。
解決方法:重新建表并修改列類型。
報錯:ERROR: Currently materialized view does not support aggregate on expressions, only support single column
問題原因:單表物化視圖不支持表達(dá)式,從而出現(xiàn)報錯。
解決方法:單表物化視圖避免使用表達(dá)式,詳情請參見SQL管理物化視圖。
ERRCODE_UNDEFINED_OBJECT
報錯:column xxx does not exist
問題原因:列不存在。
解決方法:重新檢查SQL語句是否錯誤。
報錯:Table group xxx does not exist
問題原因:Table Group不存在。
建表時指定已存在的Table Group,或者提前創(chuàng)建Table Group。
報錯:The specified partition does not exist
問題原因:通常發(fā)生在數(shù)據(jù)寫入或更新時,對應(yīng)的分區(qū)表不存在。
解決方法:提前創(chuàng)建對應(yīng)分區(qū)。
報錯:create binlog reader failed: Fail to find any shards, please check if the table group is in current warehouse
問題原因:該Warehouse上沒有該Table Group。
解決方法:請檢查該Warehouse是否加載了對應(yīng)的Table Group,若沒有加載,請配置加載Table Group。具體操作,請參見計算組Table Group授權(quán)管理。
ERRCODE_INSUFFICIENT_PRIVILEGE或者permission denied
權(quán)限相關(guān)的報錯請參考如下文檔:
ERRCODE_OUT_OF_MEMORY或者OOM
報錯:Total memory used by all existing queries exceeded memory limitation
問題原因:Query由于內(nèi)存超出,導(dǎo)致出現(xiàn)OOM。
解決方法:詳情請參見OOM常見問題排查指南。
ERRCODE_DATATYPE_MISMATCH
報錯:internal error: Datasets has different schema
問題原因:Query的列與表中原有的列對不齊。
解決方法:檢查SQL的列是否匹配。
ERRCODE_DIVISION_BY_ZERO
問題原因:SQL中有除法,分母的數(shù)據(jù)是0,不支持除法中分母為0。
解決方法:
避免分母為0,或者使用CASE WHEN語法繞過。
創(chuàng)建MySQL兼容性插件,開啟允許除以0的開關(guān),詳情請參見遷移MySQL至Hologres。
ERRCODE_STRING_DATA_RIGHT_TRUNCATION
報錯:value too long for type character varying(xxx)
問題原因:字段長度超過了VARCHAR類型的長度限制。
解決方法:處理數(shù)據(jù)或?qū)ARCHAR的長度設(shè)置得更長,或者將字段類型改為TEXT。
ERRCODE_PROGRAM_LIMIT_EXCEEDED或者Exceed Odps Scan Limit
報錯:Exceeds the partition limitation of 512, current match xxx partitions.
問題原因:查詢MaxCompute外部表的分區(qū)數(shù)量超過了512。
解決方法:增加更多的分區(qū)過濾條件,或者使用如下GUC參數(shù)調(diào)整分區(qū)查詢限制,詳情請參見常見問題。
set hg_foreign_table_max_partition_limit =xx;
報錯:Build desc failed: Exceeds the scan limitation of 200 GB, current scan xxx GB.
問題原因:掃描的MaxCompute外部表數(shù)據(jù)量超過200 GB。
解決方法:
增加多個過濾條件,減少掃描數(shù)據(jù)量。
將數(shù)據(jù)導(dǎo)入Hologres內(nèi)部表。內(nèi)部表沒有數(shù)據(jù)量的掃描限制。
ERRCODE_SYNTAX_ERROR
報錯:syntax error at or near "xxxxx"
問題原因:SQL語法錯誤。
解決方法:重新檢查SQL語法并修正。
ERRCODE_UNDEFINED_FUNCTION
報錯:DISTINCT is not implemented for window functions
問題原因:Hologres目前不支持在窗口函數(shù)中使用DISTINCT關(guān)鍵字。
解決方法:窗口函數(shù)中去掉DISTINCT。
報錯:ERROR:function xxx does not exist
問題原因:使用函數(shù)時未創(chuàng)建對應(yīng)的extension,或函數(shù)語法不滿足規(guī)定。
解決方法:按照Hologres的規(guī)定正確使用函數(shù)。
報錯:ERROR: function jsonb_set(json, text[], jsonb, boolean) does not exist
問題原因:JSONB_SET函數(shù)傳入的參數(shù)類型不匹配導(dǎo)致報錯。
解決方法:JSONB_SET函數(shù)第一個參數(shù)需要傳入JSONB類型,詳情請參見JSON和JSONB類型。
ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED
報錯:You have NO privilege 'odps:Select' on xxx
問題原因:當(dāng)前賬號沒有MaxCompute表的查詢權(quán)限。
解決方法:前往MaxCompute為當(dāng)前賬號授予相關(guān)權(quán)限。
報錯:The sensitive label of column 'xxx' is 2, but your effective label is 0
問題原因:當(dāng)前賬號只有MaxCompute表中部分列的查詢權(quán)限。
解決方法:前往MaxCompute為當(dāng)前賬號授予更多權(quán)限,或者只查詢有權(quán)限的列。授權(quán)詳情請參見通過命令管理用戶權(quán)限。
ERRCODE_DUPLICATE_OBJECT
報錯:extension "xxxxx" already exists
問題原因:extension已存在,無需重復(fù)創(chuàng)建。
ERRCODE_INVALID_TEXT_REPRESENTATION或者invalid input
報錯:invalid input syntax for type numeric: \"\"
問題原因:NUMERIC類型的字段有臟數(shù)據(jù),不符合NUMERIC的數(shù)據(jù)規(guī)范。
解決方法:處理臟數(shù)據(jù)。
報錯:invalid input syntax for integer: xxx
問題原因:INT類型的字段有臟數(shù)據(jù),不符合INT的數(shù)據(jù)規(guī)范。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_BAD_COPY_FILE_FORMAT
報錯:missing data for column "xxx". failed to query next
問題原因:執(zhí)行COPY命令時,文件或數(shù)據(jù)的格式不正確,多發(fā)生于數(shù)據(jù)本身就包含了COPY指定的分隔符(例如空格),導(dǎo)致列的數(shù)量對不上。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_UNDEFINED_COLUMN
報錯:ERROR: INSERT has more expressions than target columns
問題原因:INSERT寫入的列與目標(biāo)表的列數(shù)不一致。
解決方法:INSERT寫入的列需要與目標(biāo)表列數(shù)保持一致,一一對應(yīng)。
ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE
報錯:bigint out of range
問題原因:BIGINT類型的數(shù)據(jù)長度超過了限制。
解決方法:處理臟數(shù)據(jù),使其在BIGINT類型的長度范圍內(nèi)。
報錯:numeric field overflow in function round
問題原因:NUMERIC類型的字段超過了精度限制。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_DATETIME_FIELD_OVERFLOW
報錯:InsertOverwrite insert select table data failed : column a.unsign_type does not exist
問題原因:列不存在,或者參數(shù)填寫錯誤。
解決方法:重新檢查SQL語法并修改。
報錯:mismatched properties: table orientation is "column" but storage format is "sst"
問題原因:建表時屬性填寫錯誤,設(shè)置了列存但是存儲模式選擇了SST。
解決方法:檢查SQL語法并修改。
ERRCODE_INVALID_DATETIME_FORMAT
報錯:invalid value "" for "yyyy",Value must be an integer.
問題原因:數(shù)據(jù)不符合類型規(guī)范。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_CHARACTER_NOT_IN_REPERTOIRE
報錯:invalid byte sequence for encoding "UTF8": 0xe9 0x80
問題原因:字符不在編碼范圍內(nèi),常見于出現(xiàn)了UTF8編碼之外的非法字符。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_DUPLICATE_TABLE
報錯:relation "xxxx" already exists
問題原因:表已經(jīng)存在。
解決方法:無需重復(fù)創(chuàng)建表。
ERRCODE_UNTRANSLATABLE_CHARACTER
報錯:character with byte sequence 0xe4 0x9e 0xab in encoding "UTF8" has no equivalent in encoding "GBK"
問題原因:表示UTF8編碼的字符在目標(biāo)GBK格式中無等價項。
解決方法:處理臟數(shù)據(jù)。
ERRCODE_GROUPING_ERROR
報錯:column "xxx" must appear in the GROUP BY clause or be used in an aggregate function
問題原因:列必須出現(xiàn)在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屬性不在一個事務(wù)(transaction)中,導(dǎo)致報錯。
解決方法:建表時CREATE TABLE需要和call屬性放在同一個事務(wù)中,示例如下:
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中存在同名但實際上是不同列的情況時,會出現(xiàn)報錯,例如
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
模棱兩可的函數(shù)。通常指函數(shù)支持多種類型的入?yún)ⅲ珎鲄⒌念愋臀粗付ㄇ宄?/p>
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類型轉(zhuǎn)換為INT類型。
解決方法:重新修改SQL語法。
ERRCODE_UNDEFINED_SCHEMA或者ERRCODE_INVALID_SCHEMA_NAME
報錯:schema "xxxx" does not exist
問題原因:Schema不存在。
解決方法:重新檢查SQL語法是否正常。
ERRCODE_INTERNAL_ERROR
指非預(yù)期內(nèi)的報錯。
報錯:internal error: Connect timeout, err: std_exception: Connection refused
問題原因:通常是由于某種原因?qū)е铝藢嵗礄C,從而出現(xiàn)報錯。
解決方法:提交工單排查Hologres實例宕機原因。
報錯:too many shards in this instance
問題原因:當(dāng)前實例設(shè)置的Shard數(shù)量超過了實例Shard總數(shù)的限制。
解決方法:梳理當(dāng)前實例的Shard數(shù),不建議設(shè)置超過總數(shù)的Shard數(shù),詳情請參見實例規(guī)格概述。
報錯:internal error: Write is not allowed in readonly mode
問題原因:不支持在從實例中執(zhí)行INSERT、UPDATE或DELETE等操作。
解決方法:從實例中只允許執(zhí)行SELECT操作,其余操作請在主實例中執(zhí)行。
報錯:remaining connection slots are reserved for non-replication superuser connections
問題原因:當(dāng)前連接數(shù)已滿,導(dǎo)致非Superuser賬號無法連接。
解決方法:使用Superuser賬號釋放空閑連接,詳情請參見釋放連接。
報錯:Build desc failed: Column type: information_schema.sql_identifier can not translate into hologres type
問題原因:部分系統(tǒng)表的字段類型比較復(fù)雜,當(dāng)前Hologres不支持。
解決方法:不建議將復(fù)雜的系統(tǒng)表數(shù)據(jù)與Hologres表關(guān)聯(lián)查詢。
報錯: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的命令未執(zhí)行完,又開始執(zhí)行下一個命令導(dǎo)致報錯。如:
begin; create xxxx begin;
解決方法:執(zhí)行
rollback;
命令結(jié)束當(dāng)前事務(wù)并回滾所有未提交的更改。
報錯:query length xxxxx exceeded the maximum 102400
問題原因:Query的長度超過了102400字節(jié)的限制。
解決方法:改寫Query,使其長度保持在規(guī)定范圍內(nèi)。
報錯:Modify record by primary key is not on this table
問題原因:通常是通過Flink寫入數(shù)據(jù)時選擇了更新模式,但目標(biāo)表沒有主鍵,導(dǎo)致數(shù)據(jù)無法更新。
解決方法:為目標(biāo)表設(shè)置合適的主鍵,詳情請參見主鍵Primary Key。
報錯:ERROR: xxx for fe ,should not be evaluated
問題原因:通常是使用某個函數(shù)查詢系統(tǒng)表導(dǎo)致的報錯。該函數(shù)運行在Hologres的引擎,但是系統(tǒng)表的計算不會經(jīng)過Hologres引擎。所以在執(zhí)行時,將函數(shù)直接計算而不經(jīng)過Hologres引擎,導(dǎo)致了報錯。
解決方法:不建議使用該函數(shù)操作Hologres系統(tǒng)表。
如何處理數(shù)字開頭的字段?
實時數(shù)倉Hologres兼容PostgreSQL,使用語法同PostgreSQL,不支持?jǐn)?shù)字開頭的字段。
如果您使用Hologres時遇到數(shù)字開頭的字段,查詢時需要為該字段增加雙引號,示例如下。
select bizdate,"1_day_active_users","7_day_active_users" from t_active_users;
報錯:cannot drop table because other objects depend on it
問題原因:待刪除的表存在相關(guān)依賴,例如有視圖使用了該表。
解決方法:先去除相關(guān)依賴,再刪除表。
寫入或查詢命令中含有多表Join時報錯: BinaryArray cannot contain more than 2147483646 bytes
問題原因
Hologres單個字段大小的上限是2 GB,在統(tǒng)計信息未及時更新的情況下,多表Join時生成了不合理的執(zhí)行計劃,從而出現(xiàn)超過2 GB的報錯。
解決方法
對Join的表執(zhí)行如下命令用于更新表的統(tǒng)計信息。
analyze <tablename>;
如果更新表的統(tǒng)計信息后仍然報錯,說明數(shù)據(jù)中有較大字段,在SQL前使用如下命令添加GUC參數(shù)解決。
set hg_experimental_query_batch_size = 1024;
導(dǎo)入或者查詢數(shù)據(jù)時報錯:Cannot reserve capacity larger than 2^31 - 1 for binary
問題原因及解決方法
原因一:Hologres單個字段大小的上限為2 GB,在統(tǒng)計信息未及時更新的情況下,不合理的執(zhí)行計劃,從而出現(xiàn)超過2 GB的報錯。
解決方法:對表執(zhí)行
analyze
命令,用于更新表的統(tǒng)計信息。analyze <tablename>;
原因二:表字段數(shù)據(jù)量超過2 GB,導(dǎo)致報錯。
解決方法:在SQL前面添加以下GUC參數(shù)以降低每次Query讀取的批次大小。
set hg_experimental_query_batch_size = 1024;
執(zhí)行SQL時報錯:internal error: Sequence is used out
問題原因:表中有serial類型,serial類型值超過了取值范圍。
解決方法:
如果是serial類型,建議重新建表,并將類型改為bigserial。
serial類型在寫入時會獲取表鎖,建議避免使用serial類型。