MySQL에게 모든 "진행 중인" 트랜잭션을 완료하도록 지시하지만 ZFS 또는 LVM 스냅샷을 찍을 때까지(1초 미만 소요) 새 트랜잭션 시작을 지연(클라이언트 종료 없이)하도록 어떻게 해야 합니까?
예를 들어
- MySQL을 일시 중지하고 "진행 중인" 트랜잭션이 완료될 때까지 기다립니다.
- 디스크에 동기화
- ZFS/LVM 스냅샷 만들기
- MySQL 복원 이 작업의 목적은 백업용으로 일관된 스냅샷을 얻는 것입니다. 2단계는 1초도 채 걸리지 않습니다.
1단계에서 클라이언트 오류가 발생해서는 안 되며, 4단계에 도달할 때까지 잠시 일시 중지하면 됩니다.
1과 4를 수행할 수 있는 MySQL 명령이 있습니까? 이것들은 무엇입니까?
답변1
현명한 접근 방식은 트랜잭션이 완료될 때까지 기다리는 것입니다.
mysql> FLUSH LOCAL TABLES; Query OK, 0 rows affected (11.31 sec)
그런 다음 읽기 잠금을 획득합니다.
mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (22.55 sec)
이제 세션이 종료될 때까지 모든 쿼리가 차단됩니다(즉, 잠금이 해제될 때까지 기다립니다). 참고하세요. 모든 거래가 완료될 때까지 기다려야 합니다. 작업 부하에 따라 시간이 걸릴 수 있습니다(수백만 행 업데이트...).
원하는 스크립트 언어로 코딩할 수 있습니다.
하지만 진지하게 - 왜 사용하지 않습니까?슈퍼 백업? 이는 mysql의 일관된 스냅샷을 처리하며 이를 파일 시스템에 덤프한 다음 zfs/lvm 스냅샷을 생성할 수 있습니다.
답변2
다음은 전역 잠금을 유지하면서 ZFS 스냅샷을 생성하여 MyISAM 및 InnoDB 데이터 파일의 일관성을 유지하는 방법에 대한 솔루션입니다.
mysql << EOF
FLUSH TABLES WITH READ LOCK;
system zfs snapshot data/db@snapname
UNLOCK TABLES;
EOF