--single-transaction
의 옵션을 사용 mysqldump
하지 DO가 FLUSH TABLES WITH READ LOCK
이전에 백업 작업을 시작하기 만 특정 조건 하에서. 이러한 조건 중 하나는 --master-data
옵션을 지정할 때 입니다.
mysql-5.6.19/client/mysqldump.c
5797 행 의 소스 코드 :
if ((opt_lock_all_tables || opt_master_data ||
(opt_single_transaction && flush_logs)) &&
do_flush_tables_read_lock(mysql))
goto err;
반복 가능한 읽기 트랜잭션을 시작하기 전에 정확한 binlog 좌표에 고정 잠금을 설정하려면 --master-data
이 잠금을 획득 한 다음 binlog 좌표가 확보되면이 잠금이 트리거됩니다.
사실, mysqldump
않는 FLUSH TABLES
a로 이어 FLUSH TABLES WITH READ LOCK
모두 일을하는 읽기 잠금이 초기 세척 시간이 좀 걸리는 경우 더 빨리 얻을 수 있기 때문이다.
...하나...
binlog 좌표를 얻 자마자 명령문을 mysqldump
발행 UNLOCK TABLES
하므로 시작한 플러시로 인해 차단되는 것이 없어야합니다. 보류 Waiting for table flush
중인 트랜잭션의 결과로 스레드가 없어야합니다 mysqldump
.
당신이에 스레드를 볼 때 Waiting for table flush
상태, 즉 해야 것을 의미 FLUSH TABLES [WITH READ LOCK]
문이 발행 된 여전히 실행중인 쿼리가 테이블 높이 기다려야합니다, 그래서 그것을 실행하기 전에 - 쿼리가 시작했을 때. 게시 한 프로세스 목록의 mysqldump
경우이 동일한 테이블을 읽고 쿼리가 잠시 실행되었지만 차단 쿼리는 오랫동안 차단되지 않았습니다.
이것은 모두 다른 일이 일어 났음을 암시합니다.
내부적 으로 작동 하는 방식과 함께 버그 # 44884에 설명 된 오랜 문제가 FLUSH TABLES
있습니다. 문제가 계속 지속되면 놀라지 않을 것입니다.이 문제가 해결이 매우 복잡한 문제이기 때문에이 문제가 "수정"된 경우 놀라 울 것입니다. 그것을 고치면 다른 것을 깨뜨 리거나 새롭고 다르며 여전히 바람직하지 않은 행동을 일으킬 위험이 있습니다.
이것이 당신이보고있는 것에 대한 설명 일 것 같습니다.
구체적으로 특별히:
당신은 테이블 및 문제에 대해 실행중인 장기 실행 쿼리가있는 경우 FLUSH TABLES
, 다음은 FLUSH TABLES
장기 실행 쿼리 완료 될 때까지 차단합니다.
또한 FLUSH TABLES
발행 후 시작된 모든 쿼리 FLUSH TABLES
는 완료 될 때까지 차단 됩니다.
당신이 죽이면 추가, FLUSH TABLES
쿼리를 차단하는 쿼리는 것이다 여전히 차단 , 원래 쿼리를 장기 실행에 차단 된 하나의 FLUSH TABLES
살해에도 불구하고 있기 때문에, 쿼리를 FLUSH TABLES
쿼리가 완료되지 않았습니다, 해당 테이블 (하나, 또는 더 많이, 장기 실행 쿼리 관련) 여전히 플러시되고 있으며 장기 실행 쿼리가 완료 되 자마자 보류중인 플러시가 발생하지만 이전은 아닙니다.
아마도 다른 프로세스, 아마도 다른 mysqldump, 잘못 된 쿼리 또는 잘못 작성된 모니터링 프로세스가 테이블을 플러시하려고 시도했을 것입니다.
이 쿼리는 알 수없는 메커니즘으로 인해 종료되거나 시간 초과되었지만 해당 mysqldump
테이블에서 읽은 후에는 그 영향이 남아 있었습니다.
FLUSH TABLES
장기 실행 쿼리가 처리되는 동안 시도하여이 조건을 복제 할 수 있습니다 . 그런 다음 다른 쿼리를 시작하면 차단됩니다. 그런 다음 FLUSH TABLES
쿼리를 종료하면 최신 쿼리의 차단이 해제되지 않습니다. 그런 다음 첫 번째 쿼리를 종료하거나 완료하면 최종 쿼리가 성공적으로 실행됩니다.
나중에 생각할 때, 이것은 관련이 없습니다.
Trx read view will not see trx with id >= 1252538405, sees < 1252538391
는 mysqldump --single-transaction
문제가 START TRANSACTION WITH CONSISTENT SNAPSHOT
발생하여 덤프가 진행되는 동안 변경된 데이터를 덤프하지 못하도록 하기 때문에 정상 입니다. 그것이 없다면, 시작시 얻은 binlog 좌표는 의미가 없을 것이기 때문에 의미 --single-transaction
가 없습니다. 이 Waiting for table flush
트랜잭션은 분명히 잠금을 보유하지 않기 때문에 어떤 의미로도 문제 와 관련해서는 안됩니다 .