2013-10-24 3 views
33

Redshift 데이터베이스에서 너무 크지 않은 테이블 (4M 행)을 삭제하거나 자르면 매우 오랜 시간이 걸립니다. 누구도 같은 문제를 경험합니까? 저도 같은 문제가 발생했습니다redshift drop 또는 truncate table 매우 매우 느립니다.

+0

테이블 너비, 클러스터 설정 등과 같은 다른 정보를 줄 수 있습니까? – bstempi

+0

문제가 해결되면 Gerardo의 대답을 받아 들여야합니다. –

답변

5

감사합니다. 다른 곳에서 열린 트랜잭션이 열린 것으로 판명되었습니다.

예를 들어 redshift 쉘로 2 개의 셸을 열면 두 번째 셸에서 열린 트랜잭션에 참여하는 첫 번째 셸에서 테이블을 삭제할 수 없습니다.

두 번째 창에서 커밋/롤백을 수행 한 후 잘린 부분이 완벽하게 작동했습니다.

희망이있었습니다.

58

Redshift는 I/O가 매우 빠르므로 클러스터 유형이나 크기에 따라 작동 시간이 1 초 미만이어야합니다. diemacht가 말한 것처럼 열린 트랜잭션과 다른 연결이 있기 때문에 문제가 발생했습니다.

비슷한 문제가 발생했습니다. 클라이언트에서의 충돌로 트랜잭션이 '열린'상태가되지만 도달 할 수 없습니다. 없음 DB 잠금이 STV_LOCKS 테이블에 나타나지 않았다 : 또한

가 어떤 쿼리가 아직 실행되지 않았다 ( select table_id, last_update, lock_owner, lock_owner_pid from stv_locks; 사용) : (함께 확인 : select pid, trim(user_name), starttime, query , substring(query,1,20), status from stv_recents where status='Running';) : SELECT * FROM STV_SESSIONS 그리고

그래서 솔루션은 사용자 세션을 나열했다 사용하여 죽일 : SELECT pg_terminate_backend(pid)

또는 KILL'EM 모든 버전 :

SELECT pg_terminate_backend(process) FROM STV_SESSIONS where user_name='user_name' and process != pg_backend_pid(); 

주,523을 그작동하지 않았습니다! (쿼리가 취소되었지만 트랜잭션이 아직 열리고 잠금 상태 임).

+4

'SELECT pg_terminate_backend (process) FROM STV_SESSIONS 여기서 user_name = 'user_name'및 프로세스! = pg_backend_pid();'는 지금 작동하지 않습니다. 그것은'INFO : Function "pg_terminate_backend (정수)"not supported.' 메시지를 반환합니다. –

+0

@masashimiyazaki, Redshift 테이블에서 선택할 때'pg_terminate_backend'가 작동하지 않습니다. ' Redshift 테이블에서이 기능을 사용할 수 없다는 메시지가 나타났습니다. pid 목록을 가져 와서 각각 pg_terminate_backend()를 적용하십시오. 아마도 그 부모 게시물 이후 행동이 바뀌었을 것입니다. – Thinkable

+0

WLM에서 사용자 쿼리에 시간 초과를 추가하는 것은 불가능합니까? –

25

내 경험에 의하면 @Gerardo Grignoli는 stv_locks 테이블에 자물쇠가 나타나지 않지만 그들은 pg_locks에 표시됩니다. 환경에 따라 stv_sessions에 나열된 장기 실행 세션을 임의로 종료 할 수 없습니다. 나는 pg_locks 표는 이러한 유형의 잠금을 검출하기위한 매우 신뢰할 수있는 찾을 :

select * from pg_locks where relation = (select oid from pg_class where relname = 'the_table') 
select pg_cancel_backend(pid) 

일반적으로 문제가 테이블을 교착 것 ACCESS EXCLUSIVE 잠금입니다. 따라서 많은 자물쇠가 나열되면 ACCESS EXCLUSIVE을 찾아서 폐기하십시오.

+0

이 나를 위해 일했다. – Merlin

3

IMO AccessShareLock on tables는 또한 DDL 명령이 멈추게합니다. AccessShareLock

select 
    current_time, 
    c.relname, 
    l.database, 
    l.transaction, 
    l.pid, 
    a.usename, 
    l.mode, 
    l.granted 
from pg_locks l 
join pg_catalog.pg_class c ON c.oid = l.relation 
join pg_catalog.pg_stat_activity a ON a.procpid = l.pid 
where l.pid <> pg_backend_pid(); 

의 PID를 파악하기 위해

실행이 쿼리는 확인 select pg_terminate_backend(<pid>);

를 사용하여 프로세스를 죽여 그 모든 읽기 전용 응용 프로그램을 닫고 해제 모든 연결을 따라서 이러한 잠금!