本文为您罗列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类型。