2017-11-09 9 views
1

pt-archiver에서이를 표현하는 방법은 무엇입니까?MySQL 쿼리를 Percona pt-archiver 문자열로 바꿈

DELETE * FROM Table1 JOIN ON Table1.id=Table2.id WHERE Table2.id>=1; 

pt-archiver 문자열 내에서 Table1 및 Table2에 참여할 가능성을 찾을 수 없습니다. 이 시도했지만 Table2 가입 문자열이 누락되었습니다.

pt-archiver --source h=127.0.0.1,D=db,t=Table1 --purge --where 'Table2.id >= 1' 

나에게 몇 가지 아이디어를 제공해주십시오.

+0

pt-archiver가 다중 테이블 케이스를 지원하지 않는 것 같습니다. 쿼리를 최적화하고 싶다면 큰 DELETE를 작은 쿼리로 분할하는 것이 좋습니다. 'Table2.id> = 20000000' ... 그런 다음'Table2.id> = 1000000' .. – AnouarZ

+0

예, 작동 할 수 있음을 알고 있지만이 방법을 사용하면 서버가 수동으로 오버로드 문제를 해결하고 조정해야합니다 응급 상황에서. 나는 다음과 같이 Percona 홈페이지에서 몇 가지 해결책을 발견했다 :'pt-archiver -source h = host, D = db, t = child-purge \ -where 'EXISTS (SELECT * FROM parent WHERE col = child.col 및 child.col> = 1) '' 이 작업을 할 수 있지만 부모 테이블을 선언 할 방법과 위치를 확신하지 못합니다. 몇 가지 아이디어? – Eric

+0

아마도 이걸 좋아합니까 ?? '존재하는 (선택 *에서 Table2 WHERE id = Table1.id와 Table2.id> = 1)'' – Eric

답변

0

필자가 설명하는 것과 같은 작업을 수행했습니다. 여기서 pt-archiver를 사용하여 다른 테이블에 조인해야하는 행을 보관합니다.

pt-archiver --source h=host,D=db,t=child --purge \ 
--where 'EXISTS(SELECT * FROM parent WHERE col=child.col AND child.col>=1)'. 

이 일할 수있는,하지만 난 방법과 장소 부모 테이블을 선언하는 것입니다 확신 아닙니다. 몇 가지 아이디어?

pt-archiver의 원본 DSN에 정확히 하나의 테이블을 선언합니다. 이 예에서 테이블은 child입니다.

pt-archiver 옵션에서 parent 테이블을 선언하지 마십시오. 위의 예에서와 같이 정확하게 --where 옵션에서 지정한 하위 쿼리에서만 참조됩니다.