Amazon Redshift 콘솔에 쿼리 상태는 COMPLETED(완료됨)로 표시되지만, 상태가 ABORTED(중단됨)로 변경됩니다. SQL 클라이언트 응답에는 하나 이상의 명령이 완료된 것으로 표시되지만, 이전 세션이나 트랜잭션의 결과를 쿼리하면 테이블의 데이터가 수정되지 않은 것으로 표시됩니다. 이 문제를 해결하려면 어떻게 해야 합니까?

데이터를 조작하거나 데이터베이스 객체를 생성하는 SQL 문은 트랜잭션을 커밋하지 않는 한 지속되지 않습니다 암시적으로 COMMIT가 수행되는 TRUNCATE 문에는 적용되지 않습니다.

SQL 문이 여전히 열린 트랜잭션에 있는 경우 Amazon Redshift 콘솔에서 쿼리 상태는 COMPLETED(완료됨)로 표시됩니다. 트랜잭션이 롤백되면 상태는 다시 ABORTED(중단됨)로 변경됩니다. STL_QUERY 시스템 테이블에서도 SQL 문은 성공적으로 완료되었다고 표시됩니다(중단된 열 = 0).

트랜잭션을 나중에 커밋한 경우 변경 사항이 표시됩니다. 그러나 트랜잭션을 커밋할 수 없으면 Amazon Redshift 콘솔에서 쿼리 상태는 ABORTED(중단됨)로 표시됩니다. 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;

결과에서 BEGIN 문에 대응하는 END 또는 COMMIT 문이 없는 경우 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 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2019년 3월 25일