gpload 抛出异常“错误:用于编码“UTF8”的无效字节序列:0xe5b82e”

Posted

技术标签:

【中文标题】gpload 抛出异常“错误:用于编码“UTF8”的无效字节序列:0xe5b82e”【英文标题】:gpload throws exception with "ERROR: invalid byte sequence for encoding "UTF8": 0xe5b82e" 【发布时间】:2019-08-19 12:22:46 【问题描述】:

当我使用 gpload 将一些数据转储到 greenplum 时,由于一个错误而失败:“错误:用于编码“UTF8”的无效字节序列:0xe5b82e”。

我做了一些搜索。我的greenplum是5.18.0,“show client_encoding”显示“UTF8”,当我用“file”命令检查数据文件时,它也显示:text/plain;字符集=utf-8。这让我很困惑:数据文件是utf8,客户端也是utf8,为什么会抛出这样的错误?我未能在此字符串中找到一些 \x0 或 \u0000 字符,这是某些帖子中同一问题的关键问题。

我发现一个链接似乎与此问题有关:https://jira.pentaho.com/browse/PDI-6191 真的是这个greenplum版本的bug吗?

关于数据文件还有一件事,它是带有“|”的文本文件作为分隔符,其内容如下:

|Hibernate operation: could not insert: [net.xiaofei.apps.wbps.channel.entity.IntSoapContent]; uncategorized SQLException for SQL [insert into int_soap_content (case_id, casetype, channel, content, create_time, handle_flag, handle_time, srccaseid, subcasetype) values (?, ?, ?, ?, ?, ?, ?, ?, ?)]; SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\xA1\x8D\xB2\xE5\xB8...' for column 'content' at row 1; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\xA1\x8D\xB2\xE5\xB8...' for column 'content' at row 1|20190818

感谢任何帮助!

我不想为这篇文章创建一个新线程,所以我在这里显示步骤:

    在 greenplum db 中创建表:`

CREATE TABLE 测试(id bigint,结果文本) WITH(appendonly=true, compresstype=quicklz,orientation=column) 分发者 (id);

`

    将以下内容写入数据文件:`

5661083|休眠操作:无法插入: [net.xiaofei.apps.wbps.channel.entity.IntSoapContent];未分类 SQL 的 SQLException [插入 int_soap_content (case_id, casetype, 频道、内容、create_time、handle_flag、handle_time、srccaseid、 子案例类型)值(?,?,?,?,?,?,?,?,?)]; SQL状态[HY000]; 错误代码[1366];不正确的字符串值: '\xF0\xA1\x8D\xB2\xE5\xB8...' 用于第 1 行的列“内容”;嵌套的 异常是 java.sql.SQLException:不正确的字符串值: '\xF0\xA1\x8D\xB2\xE5\xB8...' 用于第 1 行的列 'content'

`

    编写yaml文件如下:
VERSION: 1.0.0.1
DATABASE: test
USER: userXXX
PASSWORD: passYYY
HOST: ip1.ip2.ip3.ip4
PORT: 3421
GPLOAD:
    INPUT:
        - SOURCE:
            LOCAL_HOSTNAME:
                - ip1.ip2.ip3.ip4
            PORT: 6006
            FILE:
                - /tmp/gpdb_test/test/*
        - COLUMNS:
               - id:  integer
               - result:  text
        - FORMAT: text
        - DELIMITER: '|'
        - ESCAPE: OFF
        - NULL_AS: '\N'
        - ERROR_LIMIT: 0
    OUTPUT:
        - TABLE: test
        - MODE: INSERT
    PRELOAD:
        - TRUNCATE: true
    SQL:
        - BEFORE: "INSERT INTO gpload_audit VALUES(nextval('gpload_audit_seq'), 'start', 'insert', 'test', current_timestamp)"
        - AFTER: "INSERT INTO gpload_audit VALUES(nextval('gpload_audit_seq'), 'end', 'insert', 'test', current_timestamp)"
    运行“gpload -f test.yaml”,会报错:
2019-08-20 10:27:14|INFO|gpload session started 2019-08-20 10:27:14
2019-08-20 10:27:14|INFO|setting schema 'public' for table 'test'
2019-08-20 10:27:19|INFO|started gpfdist -p 6006 -P 6007 -f "/home/work/gpdb_test/test/*" -t 30
2019-08-20 10:27:20|ERROR|ERROR:  invalid byte sequence for encoding "UTF8": 0xe5b82e  (seg9 slice1 10.136.173.8:33001 pid=339845)
DETAIL:  External table ext_gpload_05bdc0fe_c2f2_11e9_bb6b_246e9677a1f0, line 1 of  gpfdist://10.136.157.44:6006//home/work/gpdb_test/test/*:  "5661083|Hibernate operation: could not insert:  [net.xiaofei.apps.wbps.channel.entity.IntSoapContent]..."       encountered while running INSERT INTO public."test" ("id","result") SELECT "id","result" FROM ext_gpload_05bdc0fe_c2f2_11e9_bb6b_246e9677a1f0

2019-08-20 10:27:20|INFO|rows Inserted          = 0
2019-08-20 10:27:20|INFO|rows Updated           = 0
2019-08-20 10:27:20|INFO|data formatting errors = 0
2019-08-20 10:27:20|INFO|gpload failed

【问题讨论】:

请在发帖前提取minimal reproducible example,否则您的问题将偏离主题。 @UlrichEckhardt,很抱歉这篇不专业的帖子。我在本文末尾添加了重现此问题的步骤。你可以看看吗?谢谢。 首先,您可以随时编辑您的问题以澄清它,这非常好。现在,请确保您可以按照您的说明在没有任何其他信息的情况下重现该问题。使用您的步骤,我无法执行“将以下内容写入数据文件”,除了因为它包含错误消息而感到困惑。 将内容与 |作为文本文件的分隔符,您可以将其转储到 greenplum db 中而不会出现上述错误? 【参考方案1】:

首先,确定您的源文件是什么编码。 其次,如果您有权访问该文件,请运行“locale;grep -axv file.txt”。如果它返回某些内容,则意味着您的文件包含无效的字节序列或您的文件已损坏。 第三,您可以使用 iconv 修复/跳过无效的序列字节或返回源以获得正确的编码。

【讨论】:

grep -axv 我的文件继续运行,没有任何结果。我在不同的文件上进行了尝试,但结果相同。你能在你的机器上运行同样的命令吗?

以上是关于gpload 抛出异常“错误:用于编码“UTF8”的无效字节序列:0xe5b82e”的主要内容,如果未能解决你的问题,请参考以下文章

基于windows测试gpload时出错

greenplum 中的 gpload 实用程序

MySQL抛出Incorrect string value异常分析

GreenPlum数据的装载与卸载之gpload的使用

如何使用 gpload 实用程序?

发生 gpload 控制文件处理错误。条目必须是 YAML 序列