Amazon Redshift 控制台显示查询状态为“已完成”,但该状态随后变为“已中止”。SQL 客户端的响应表明有一个或多个命令已经完成,但在查询上一会话或事务的结果后发现,并未对表中的数据作出任何修改。我如何排查此问题?

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

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

稍后提交事务时将会显示更改。但是,如果无法提交该事务,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;

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

当某个 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 系统表中将有对应的 ROLLBACK 条目。运行以下查询以确定更改是否已经回滚:

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

此查询将返回有关回滚的事务的信息,这意味着事务并未运行至完成,更改未被应用。存在违反可序列化的隔离时,管理员终止会话或取消查询时,或者网络连接超时时,都可能会发生这种情况。对于所有这些情况,客户端都会收到一条包含更多详细信息的错误消息,因此请确保您的客户端 配置为记录错误日志


此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2019 年 3 月 25 日