获取Redshift`stl_load_errors`错误的表信息

时间:2016-06-15 23:01:26

标签: amazon-web-services amazon-redshift

我正在使用Redshift COPY命令将数据从S3加载到Redshift表中。出现问题时,我通常会收到错误ERROR: Load into table 'example' failed. Check 'stl_load_errors' system table for details。我总是可以手动查找stl_load_errors以获取详细信息。现在,我想弄清楚我是如何自动完成的。

documentation看来,以下查询应该能够提供我需要的所有详细信息:

SELECT *
FROM stl_load_errors errors
INNER JOIN svv_table_info info
  ON errors.tbl = info.table_id
    AND info.schema = '<schema-name>'
    AND info.table = '<table-name>'

然而它总是什么都不返回。我也尝试使用stv_tbl_perm代替svv_table_info,但仍然没有。

经过一些故障排除后,我发现了两件我不理解的事情:

  1. 我在stv_tbl_permsvv_table_info中看到了同一个确切表格的多个不同ID。那是为什么?
  2. 我看到tbl上的stl_load_errors提交了stv_tbl_permsvv_table_info中不存在的引用ID。又是为什么?
  3. 感觉我不理解这些表格的结构,但它完全逃脱了我的想法。

3 个答案:

答案 0 :(得分:3)

这是因为tbl和table_id具有不同的类型。第一个是整数,第二个是 iod

当您将iod转换为整数时,列具有相同的值。您可以查看此查询:

SELECT table_id::integer, table_id
FROM SVV_TABLE_INFO

执行

时有结果
SELECT errors.tbl, info.table_id::integer, info.table_id, *
FROM stl_load_errors errors
INNER JOIN svv_table_info info
  ON errors.tbl = info.table_id 

请注意,内部联接为ON errors.tbl = info.table_id

答案 1 :(得分:1)

我终于找到了它的底部,它令人惊讶地无聊,可能对许多人没用......

我有一张现有的桌子。我创建表的代码包含在事务中,它正在将事务中的表删除。查询stl_load_errors的代码在事务之外。所以table_id在事务的外部和内部不同,因为它是一个不同的表。

答案 2 :(得分:0)

您可以尝试按文件名查找。没有真正回答关于加入各种表的问题,但我使用这样的查询来分组属于同一清单文件的文件,并让我将其与maxerror设置进​​行比较:

select min(starttime) over (partition by substring(filename, 1, 53)) as starttime,
    substring(filename, 1, 53) as filename, btrim(err_reason) as err_reason, count(*)
from stl_load_errors where filename like '%/some_s3_path/%' 
group by starttime, filename, err_reason order by starttime desc;

这对我有用,没有任何演员:

schemaz=# select i.database, e.err_code from stl_load_errors e join svv_table_info i on e.tbl=i.table_id limit 5
schemaz-# ;
database  | err_code
-----------+----------
schemaz |     1204
schemaz |     1204
schemaz |     1204
schemaz |     1204
schemaz |     1204