2009-10-03 5 views
2

나는 이것과 비슷한 다른 게시물을 발견했지만 mysqldump의 이러한 옵션에 대한 약간의 추가 정보를 원했습니다. --single-transaction과 -lock-tables는 상호 배타적 인 연산이라는 것을 이해했습니다. 다음은 이러한 옵션에 관한 나의 질문입니다.--single-transaction - mysqldump의 --lock-tables 옵션 - 내부적으로 어떤 일이 발생합니까?

a) --lock-tables 옵션을 사용한다고 가정하십시오. 이 경우 mysqldump는 모든 테이블에 대해 읽기 잠금을 획득한다. 따라서 테이블에 쓰려고하는 다른 프로세스는 차단 된 (대기) 상태가됩니다. 그러나 mysqldump가 정말로 오랜 시간이 걸린다면 대기중인 프로세스는 무기한으로 계속 기다리고 있을까?

예를 들어이 테스트를 시도했습니다. MY_TEST라는 mysql 데이터베이스 테이블에 Java (JDBC) 프로그램을 작성했습니다. 나는 mysql 콘솔에 로그인하여 "LOCK TABLES MY_TEST READ;" 명령을 수동으로 실행하십시오. 따라서 Java 프로세스는 잠금이 해제 될 때까지 대기하는 것을 차단합니다. 내 질문은 읽기 잠금이 오랜 시간 동안 릴리스되지 않는 경우 거기에 연결 시간이나 같은 문제가있을 것입니다? 나는 2 분 동안 기다렸다가 어떤 에러도 발견하지 못했고 자바 프로세스는 "UNLOCK 테이블"명령을 사용하여 잠금이 해제되면 정상적으로 계속 진행되었습니다. 이 동작은 java mysql 드라이버와 관련이 있습니까? 아니면 mysql 드라이버를 사용하는 C 프로그램에서 동일한 것을 기대할 수 있습니까?

b) 두 번째 질문은 --single-transaction 옵션입니다. 필자는 10 개의 InnoDB 테이블을 가지고 있다고 가정하고, 그 중 3 개의 테이블은 서로 관련되어 있고 (FK 사용) 나머지는 독립적이지만 여전히 InnoDB 엔진을 사용하고 있습니다. 단일 거래는 FK를 사용하여 상호 관련이있는 3 개의 테이블에만 적용됩니까? 또는 세 독립 테이블의 상태가 3 개의 상호 종속 테이블을 덤프 할 때의 상태와 정확히 일치 할 것으로 기대할 수 있습니다.

답변

3

대답.) 대답은 그렇습니다. mysql 수준에서 연결은 mysqldump가 테이블 잠금을 해제 할 때까지 무기한 대기합니다. 잠겨있는 테이블에 대해 쿼리하고 검색 시간 제한을 원하는 값으로 설정하는 유효성 검사 쿼리와 함께 연결 풀을 사용하여 응용 프로그램 수준에서 약간 제어 할 수 있습니다. 이것은 예를 들어 c3p0에서 꽤 쉽게 할 수 있습니다. 그러나 다른 정보가 없으면이 접근법을 권장하지 않습니다. 그것은 꽤 kludgey 보인다. 나는 그렇게 확신 할 수 없기 때문에 mysql C 드라이버를 사용하지 않았지만 자바와 유사한 동작을 가정 할 것이다. 이 모든 것이 mysqldump가 사소한 양의 데이터와 활동이있는 시스템의 라이브 백업에 좋은 옵션이되지 않는 이유이다.

b. 덤프 된 모든 테이블은 단일 트랜잭션의 일부로 덤프되므로 덤프에 참여하는 모든 테이블에 대해 일관된 스냅 샷을 생성합니다. 1 차 - 외래 키 관계는 트랜잭션에 영향을 미치지 않습니다. 단일 트랜잭션을 사용하면 핫 백업에 대한 실행 가능한 옵션입니다.

관련 문제