Hologres SQL语句的常见问题

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

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类型。