【发布时间】:2021-09-27 14:57:38
【问题描述】:
我有一个 S3 存储桶,它几乎在一天中的同一时间接收文件(FILE_A 和 FILE_B)。
我有一个 lambda 函数,当这些文件上传到 S3 时会触发该函数。 lambda 函数将根据文件类型调用两个存储过程之一。
lambda 函数只需使用 Redshift Data API 调用适当的存储过程,然后退出。
IF (FILE_A) {
CALL SP_A(FILE_A.name)
}
ELSE IF (FILE_B) {
CALL SP_B(FILE_B.name)
}
这两个存储过程几乎相同,它们只是对一组不同的表进行操作。随着每个存储过程的进行,它们通过存储过程将状态信息记录到 Redshift 中的共享 LOG 表中。
每个存储过程的结构基本上是……
LOG('sp_a started')
LOG('sp_a truncate table_a_1')
TRUNCATE TABLE TABLE_A_1
LOG('sp_a copy started')
COPY INTO TABLE_A_1 FROM S3 FILE_A
LOG('sp_a insert table_a_2')
INSERT INTO TABLE_A_2 FROM TABLE_A_1
LOG('sp_a delete dupes')
DELETE FROM TABLE_A_3 WHERE SELECT TABLE_A_2
LOG('sp_a insert table_a_3')
INSERT INTO TABLE_A_3 FROM TABLE_A_2
LOG('sp_a finished')
SP_B 的逻辑完全相同。我可以毫无问题地从 lambda 或 Redshift 控制台调用存储过程。每当我单独运行存储过程时,它们都可以正常工作。
当存储过程基本上同时启动时,当 FILE_A 和 FILE_B 在毫秒内上传到 S3 时,就会出现问题。
两个存储过程之一将被 Redshift 中止。另一个将运行到完成。我还没有 100% 验证这一点,但似乎首先启动的存储过程最终被 Redshift 中止。
我没有在存储过程中定义任何事务边界。我依赖于包装调用 CALL SP_A(FILE_A.name) 的隐式事务。
我可以解释为什么同时调用同一个存储过程可能会导致问题,但我不明白为什么调用不同的存储过程会导致一个失败而另一个失败。如果它们不并行运行,我看不到这个问题。
我已经上下搜索,试图找到 Redshift 在哪里记录存储过程中止的原因,但我找不到任何东西。
有谁知道我在哪里可以找到 Redshift 错误,或者知道为什么其中一个存储过程会中止?感谢您的帮助!!!!!!
【问题讨论】:
-
您正在执行删除和插入操作。您最终将在表中删除大量记录,并且所有新记录都将未排序 - 这使得使用 Redshift 完全没有意义;在这种情况下,它的行为会退化为 Postgres 的行为。你在做什么真空,对表进行排序并删除已删除的记录?
-
是的,我明白了。删除是处理一些不良数据的临时解决方法。事实上,其中大部分可能会发生很大变化。但是在继续之前,我想了解发生了什么,以防以我的方式同时运行存储过程存在一些基本缺陷。
-
一个存储过程就是一个事务;程序没有什么特别之处,只是它们作为事务运行。但是,不正确地使用事务肯定有可能遇到问题。
标签: amazon-web-services amazon-redshift