为什么我的 Amazon Redshift 查询状态在未进行更改的情况下从“已完成”变成“已中止”?

上次更新日期:2020 年 10 月 5 日

Amazon Redshift 控制台显示查询状态为“已完成”,但该状态随后变为“已中止”。但是,当我查询上一个会话或事务的结果时,没有对表进行更新。为什么会发生这种情况?

简短描述

操作数据或创建数据库对象的 SQL 语句在事务提交前不会持续。 这不适用于 TRUNCATE 语句,这种语句会隐式执行 COMMIT

如果 SQL 语句仍处于尚未完成的事务中,Amazon Redshift 控制台会显示查询的状态为“已完成”。事务回滚时状态将会变为“已中止”。当中止的列值为 0 时,STL_QUERY 系统表还会显示 SQL 语句已成功完成。

如果稍后提交事务,将会显示更改。但是,如果无法提交该事务,Amazon Redshift 控制台将显示查询已中止。要确定无法提交事务的原因,请检查 STL 系统表。

解决方法

请运行以下查询以检查 SVL_STATEMENTTEXT 系统表并使用 SQL 语句的事务 ID (xid) 来进行筛选:

SELECT * FROM SVL_STATEMENTTEXT WHERE xid IN (SELECT xid FROM STL_QUERY WHERE query = [QUERY ID]) ORDER BY starttime, sequence;

如果结果是没有对应 ENDCOMMITBEGIN 语句,则说明 SQL 客户端或驱动程序的 AUTO COMMIT 设置为禁用。根据 SQL 客户端或驱动程序,您可以启用 AUTO COMMIT 设置。或者,您可以在事务完成时手动发出显式 COMMITEND 语句。

当某个 SQL 语句提交其更改时,对应的条目将添加到 STL_COMMIT_STATS 系统表中。运行以下查询以确认更改已提交:

SELECT q.query, q.xid, NVL2(cs.endtime, cs.endtime::text, 'NO COMMIT') AS commit_endtime
FROM STL_QUERY q LEFT JOIN STL_COMMIT_STATS cs ON q.xid = cs.xid AND cs.node = -1
WHERE q.query = [QUERY ID];

如果某个 SQL 语句无法提交更改并且事务结束,则 STL_UNDONE 系统表中将出现一个用于回滚的条目。运行以下查询以确定更改是否已经回滚:

SELECT *
FROM STL_UNDONE
WHERE xact_id_undone IN (SELECT xid from STL_QUERY where query = [QUERY ID]);

此查询将返回有关回滚的事务的信息,这意味着事务并未运行至完成,更改未被应用。存在可序列化隔离冲突时,或者当管理员终止会话或取消查询时,会发生回滚。回滚也可能是由任何网络连接中的超时引起的。如果发生回滚,客户端会收到一条包含更多详细信息的错误消息。因此,请确保您的客户端配置为记录错误


这篇文章对您有帮助吗?


您是否需要账单或技术支持?