

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 解决数据加载问题
<a name="t_Troubleshooting_load_errors"></a>

在将数据加载到 Amazon Redshift 表时，可能会遇到来自 Amazon S3 的错误、无效的输入数据和 COPY 命令错误。以下各节提供了有关识别和解决数据加载错误的信息。

**Topics**
+ [对 S3 事件集成和 COPY JOB 错误进行故障排除](s3-integration-troubleshooting.md)
+ [S3ServiceException 错误](s3serviceexception-error.md)
+ [用于解决数据加载问题的系统表](system-tables-for-troubleshooting-data-loads.md)
+ [多字节字符加载错误](multi-byte-character-load-errors.md)
+ [加载错误参考](r_Load_Error_Reference.md)

# 对 S3 事件集成和 COPY JOB 错误进行故障排除
<a name="s3-integration-troubleshooting"></a>

使用以下信息来排查与 Amazon S3 事件集成和 Amazon Redshift 的 COPY JOB 相关的常见问题。

## S3 事件集成创建失败
<a name="s3-integration-troubleshooting-creation"></a>

如果 S3 事件集成创建失败，则集成的状态为 `Inactive`。请确保 Amazon Redshift 数据仓库在以下方面正确无误。
+ 您为 Amazon Redshift 中的目标命名空间添加了正确的已授权主体和集成源。请参阅[创建 S3 事件集成的先决条件](loading-data-copy-job.md#loading-data-copy-job-prerequisites)。
+ 您已将基于资源的正确策略添加到源 Amazon S3 存储桶。请参阅[创建 S3 事件集成的先决条件](loading-data-copy-job.md#loading-data-copy-job-prerequisites)。

## Amazon S3 数据未出现在目标数据库中
<a name="s3-integration-troubleshooting-missing-data"></a>

如果来自 COPY JOB 的数据未出现，请检查以下各项。
+ 查询 SYS\$1COPY\$1JOB\$1DETAIL 以查看 Amazon S3 文件是否已加载，是否等待摄取，或者是否存在错误。有关更多信息，请参阅 [SYS\$1COPY\$1JOB\$1DETAIL](SYS_COPY_JOB_DETAIL.md)。
+ 如果 Amazon S3 文件不存在或等待时间不符合预期，请参阅 STL\$1ERROR 或 SYS\$1COPY\$1JOB\$1INFO。查找凭证错误或任何表明集成处于非活动状态的内容。有关更多信息，请参阅[STL\$1ERROR](r_STL_ERROR.md)和[SYS\$1COPY\$1JOB\$1INFO](SYS_COPY_JOB_INFO.md)。

# S3ServiceException 错误
<a name="s3serviceexception-error"></a>

最常见的 s3ServiceException 错误由以下原因导致：凭证字符串的格式有误或凭证字符串不正确，将集群和桶放在不同的 AWS 区域中以及 Amazon S3 权限不足。

本节提供了每种类型的错误的排查信息。

## 凭证字符串无效
<a name="invalid-credentials-string-error"></a>

如果凭证字符串的格式不正确，您将收到以下错误消息：

```
ERROR: Invalid credentials. Must be of the format: credentials 
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>
[;token=<temporary-session-token>]'
```

请验证凭证字符串不包含任何空格或换行符，并且括在单引号中。

## 访问密钥 ID 无效
<a name="invalid-access-key-id-error"></a>

如果您的访问密钥 ID 不存在，您将收到以下错误消息：

```
[Amazon](500310) Invalid operation: S3ServiceException:The AWS Access Key Id you provided does not exist in our records.
```

这通常是复制和粘贴错误。请验证是否正确输入了访问密钥 ID。此外，如果您使用的是临时会话密钥，请检查是否已设置 `token` 的值。

## 秘密访问密钥无效
<a name="invalid-secret-access-key-error"></a>

如果您的秘密访问密钥不正确，您将收到以下错误消息：

```
[Amazon](500310) Invalid operation: S3ServiceException:The request signature we calculated does not match the signature you provided. 
Check your key and signing method.,Status 403,Error SignatureDoesNotMatch
```

这通常是复制和粘贴错误。请验证是否正确输入了秘密访问密钥，并验证它是否为访问密钥 ID 对应的正确密钥。

## 桶位于不同的区域
<a name="bucket-in-different-region"></a>

COPY 命令中指定的 Amazon S3 桶必须位于集群所在的 AWS 区域。如果 Amazon S3 桶和集群位于不同的区域中，则会收到类似于以下内容的错误：

```
ERROR: S3ServiceException:The bucket you are attempting to access must be addressed using the specified endpoint.
```

您可以通过以下方式在特定区域中创建 Amazon S3 桶：在使用 Amazon S3 管理控制台创建桶时选择该区域，或者在使用 Amazon S3 API 或 CLI 创建桶时指定端点。有关更多信息，请参阅 [将文件上传到 Amazon S3 以与 COPY 结合使用](t_uploading-data-to-S3.md)。

有关 Amazon S3 区域的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[访问桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html#access-bucket-intro)。

或者，您也可以在 COPY 命令中使用 [REGION](copy-parameters-data-source-s3.md#copy-region) 选项以指定区域。

## 访问被拒绝
<a name="s3-access-denied-error"></a>

如果用户没有足够的权限，您将收到以下错误消息：

```
ERROR: S3ServiceException:Access Denied,Status 403,Error AccessDenied
```

一个可能的原因是，凭证标识的用户没有对 Amazon S3 桶的 LIST 和 GET 访问权限。有关其他原因，请参阅《Amazon Simple Storage Service 用户指南》**中的[排查 Amazon S3 中的拒绝访问（403 禁止）错误](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshoot-403-errors.html)。

有关管理用户对桶的访问权限的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 中的身份和访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)。

# 用于解决数据加载问题的系统表
<a name="system-tables-for-troubleshooting-data-loads"></a>

以下 Amazon Redshift 系统表可能有助于排查数据加载问题：
+ 查询 [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) 以发现在特定加载期间发生的错误。
+ 查询 [STL\$1FILE\$1SCAN](r_STL_FILE_SCAN.md) 以查看特定文件的加载时间或了解是否甚至读取了某个特定文件。
+ 查询 [STL\$1S3CLIENT\$1ERROR](r_STL_S3CLIENT_ERROR.md) 以查找有关从 Amazon S3 传输数据时遇到的错误的详细信息。

**查找和诊断加载错误**

1. 创建视图或定义返回有关加载错误的详细信息的查询。以下示例将 STL\$1LOAD\$1ERRORS 表联接到 STV\$1TBL\$1PERM 表以将表 ID 与实际表名称进行匹配。

   ```
   create view loadview as
   (select distinct tbl, trim(name) as table_name, query, starttime,
   trim(filename) as input, line_number, colname, err_code,
   trim(err_reason) as reason
   from stl_load_errors sl, stv_tbl_perm sp
   where sl.tbl = sp.id);
   ```

1. 将 COPY 命令中的 MAXERRORS 选项设置为足够大的值，以使 COPY 能够返回有关您的数据的有用值。如果 COPY 遇到错误，则会出现一条错误消息，指示您参阅 STL\$1LOAD\$1ERRORS 表以了解详细信息。

1. 查询 LOADVIEW 视图以查看错误详细信息。例如：

   ```
   select * from loadview where table_name='venue';
   ```

   ```
     tbl   | table_name | query |         starttime          
   --------+------------+-------+----------------------------
    100551 | venue      | 20974 | 2013-01-29 19:05:58.365391 
   
   |     input      | line_number | colname | err_code |       reason
   +----------------+-------------+---------+----------+--------------------
   | venue_pipe.txt |           1 |       0 |     1214 | Delimiter not found
   ```

1. 根据视图返回的信息修复输入文件或加载脚本中的问题。要观察的一些典型加载错误包括：
   + 表中的数据类型与输入数据字段中的值不匹配。
   + 表中的列数与输入数据中的字段数不匹配。
   + 引号不匹配。Amazon Redshift 支持单引号和双引号；但是，必须适当平衡这些引号。
   + 输入文件中的日期/时间数据的格式不正确。
   + 输入文件中的值超出范围（对于数字列）。
   + 某个列的不同值的数量超出了对其压缩编码的限制。

# 多字节字符加载错误
<a name="multi-byte-character-load-errors"></a>

带有 CHAR 数据类型的列仅接受单字节 UTF-8 字符（字节值最大为 127，即十六进制的 7F），它也是 ASCII 字符集。VARCHAR 列接受多字节 UTF-8 字符，最多四个字节。有关更多信息，请参阅 [字符类型](r_Character_types.md)。

如果加载数据中的某一行包含对列数据类型无效的字符，则 COPY 将返回一个错误并在 STL\$1LOAD\$1ERRORS 系统日志表中记录一行，错误编号为 1220。ERR\$1REASON 字段包含无效字符的十六进制字节序列。

修复加载数据中的无效字符的替代方法是在加载过程中替换无效字符。要替换无效的 UTF-8 字符，请在 COPY 命令中指定 ACCEPTINVCHARS 选项。如果设置了 ACCEPTINVCHARS 选项，那么指定的字符将替换代码点。如果未设置 ACCEPTINVCHARS 选项，Amazon Redshift 会接受这些字符作为有效的 UTF-8。有关更多信息，请参阅 [ACCEPTINVCHARS](copy-parameters-data-conversion.md#acceptinvchars)。

以下代码点列表是有效的 UTF-8，如果未设置 ACCEPTINVCHARS 选项，COPY 操作不会返回错误。但是，这些代码点是无效字符。您可以使用 [ACCEPTINVCHARS](copy-parameters-data-conversion.md#acceptinvchars) 选项用指定的字符替换代码点。这些代码点的值范围为 `0xFDD0` 到 `0xFDEF`，最高值为 `0x10FFFF`，以 `FFFE` 或 `FFFF` 结尾：
+ `0xFFFE`, `0x1FFFE`, `0x2FFFE`, …, `0xFFFFE`, `0x10FFFE`
+ `0xFFFF`, `0x1FFFF`, `0x2FFFF`, …, `0xFFFFF`, `0x10FFFF`

以下示例显示了 COPY 尝试将 UTF-8 字符 `e0 a1 c7a4` 加载到 CHAR 列中时的错误原因。

```
Multibyte character not supported for CHAR 
(Hint: Try using  VARCHAR). Invalid char: e0 a1 c7a4
```

如果错误与 VARCHAR 数据类型相关，则错误原因将包含错误代码和无效的 UTF-8 十六进制序列。以下示例显示了 COPY 尝试将 UTF-8 `a4` 加载到 VARCHAR 字段中时的错误原因。

```
String contains invalid or unsupported UTF-8 codepoints. 
Bad UTF-8 hex sequence: a4 (error 3)
```

下表列出了 VARCHAR 加载错误的描述和建议解决方法。如果出现了以下错误之一，请将该字符替换为有效的 UTF-8 代码序列或删除该字符。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/multi-byte-character-load-errors.html)

# 加载错误参考
<a name="r_Load_Error_Reference"></a>

如果在从文件中加载数据时出现任何错误，请查询 [STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md) 表以识别错误并确定可能的解释。下表列出了在数据加载期间可能出现的所有错误代码：

## 加载错误代码
<a name="r_Load_Error_Reference-load-error-codes"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/redshift/latest/dg/r_Load_Error_Reference.html)