【发布时间】:2016-08-04 14:36:18
【问题描述】:
我有一个每天晚上都会启动的 cronjob,它涉及建立一个临时表,将当前表放到 Redshift 上,然后将临时表换成旧表。超过一半的时间,当删除现有表并表现得好像有一些挂起的事务正在阻止删除通过时,这个特定的作业会卡住。
这只是使用完全相同的脚本在一夜之间运行的数十个作业之一,没有一个曾经遇到过这个问题;但是,有一些细微差别:
- 运行此特定作业的机器与所有其他生产作业不同,因为该机器目前处于测试状态。
- 本机使用的 S3 密钥与其他机不同。
除了我从未在任何其他工作中看到此问题外,此问题很难解决,原因如下:
- 我无法通过在当前正在运行的同一机器上手动运行脚本来重现此问题;脚本按预期执行,表删除仅在几秒钟内发生。我在这里能想到的唯一区别是我以
ubuntu执行脚本,而cronjob 是从root执行的。 - 我没有成功识别或终止导致
drop停止的会话;我在 Stack Overflow(这是最适用的问题,有答案 - redshift drop or truncate table very very slow)、Redshift 文档和其他方面都看过很多次,但我没有找到任何答案。当我看到作业停止时,我在 Redshift 上检查了以下表格,通常发现事情处于以下状态:- 临时表已创建,但旧版本的目标表仍然存在。
-
stv_locks表显示有三个进程在运行,lock_status分别为“Holding write lock”、“Holding delete lock”和“Holding insert lock”。与这些关联的进程 ID 不是与当前作业相关的 ID。 -
stv_tr_conflict表没有显示任何内容。 -
stv_recents表显示drop的状态为Running。 - 上面描述的应该创建锁的查询在
svl_qlog中显示为已完成,因此这似乎与stv_locks表相矛盾。 - 在查询
stv_sessions时,使用pg_terminate_backend停止关联进程实际上并不会删除会话,但确实会释放一些允许作业完成的东西。
任何帮助弄清楚这里到底发生了什么,我们将不胜感激!
【问题讨论】:
-
这与 SQL 命令的来源无关。我不确定“此框中使用的 S3 密钥”是什么意思,但如果这是指
COPY命令中使用的凭据,那不应该影响请求——它要么有效,要么无效工作。我建议使用 AWS Support 来协助诊断问题。订阅支持可以节省时间! -
听起来你确实在模式的某处有一个锁,这可能是由另一个连接/事务创建的,它阻止了其他命令的执行。如果您并行运行脚本,或者为每个命令创建新连接,我建议将它们组合起来以确保一切都是串行的和/或使用相同的连接。
标签: amazon-redshift