FLUSH TABLES WITH READ LOCK 얼마나 빠 른 지 (회전)
5677 단어 mysql
최근 에 MySQL 한 대가 라 이브 러 리 에서 지연 되 었 습 니 다. 관찰 한 결과: FLUSH TABLES WITH READ LOCK 은 4 시간 넘 게 막 혔 고 또 다른 SQL 문장 select 도 있 습 니 다. 현상 적 으로 는 select 가 flush tables with read lock 을 막 았 습 니 다.
* 8195: 8195: flush tables with read lock, 모든 열 린 시 계 를 닫 는 동시에 모든 데이터베이스 에 있 는 시 계 를 읽 기 자 물 쇠 를 추가 합 니 다. unlock tables 를 표시 할 때 까지 이 작업 은 데이터 백업 에 자주 사 용 됩 니 다.즉, 모든 더러 운 페이지 를 디스크 에 새로 고치 고 모든 시계 에 읽 기 자 물 쇠 를 추가 하 는 것 이다. 그래서 이 럴 때 데이터 파일 을 직접 복사 하 는 것 이 안전 하 다.하지만 flush tables with read lock 명령 을 내 릴 때 다른 작업 이 있 습 니 다. 시간 이 많이 걸 리 는 작업 입 니까?먼저 쓰기 동작 을 말하자면, 이 FTWRL 은 틀림없이 기 다 려 야 하 며, 쓰기 동작 이 완성 되 어야 FTWRL 을 실행 할 수 있다 는 것 은 이해 하기 쉽다.그럼 다른 읽 기 동작 은 요?예 를 들 어 FLWRL 이 보 내기 전에 query: select count () from tb 가 있 으 면 FTWRL 도 기 다 려 야 합 니 다 (show processlist 에서 waiting for table flush 를 볼 수 있 습 니 다).my sql 에서 읽 고 읽 는 것 은 배척 하지 않 는 다 고 말 할 수 있 습 니 다. 왜 기 다 려 야 합 니까?FTWRL 은 flush 더러 운 페이지 를 원 하기 때문에 그래 야 데이터 의 일치 성 을 확보 할 수 있 습 니 다 (예 를 들 어 xtrabackup 에서 my isam 표를 백업 할 때). select count () from tb 가 실 행 될 때 모든 작업 이 메모리 에서 작 동 되 기 때문에 이 때 는 완전히 flush 가 되 지 않 기 때문에 FTWRL 은 기 다 려 야 합 니 다.혹시 라 도 select 페이지 는 더러 운 페이지 가 아 닌 데 왜 FTWRL 이 기 다 려 야 하 는 지 의문 이 있 을 수 있 습 니 다.my sql 좀 더 완벽 하 게 하면 안 돼 요?나 는 my sql 이 이렇게 간단 하지 않 을 것 이 라 고 생각 합 니 다. 기다 리 는 이 유 는 이 시계 가 매우 커서 모든 페이지 를 한꺼번에 메모리 에 읽 을 수 없 기 때 문 입 니 다. query 는 원자 성 을 가지 고 있 기 때문에 일반적으로 막 힐 수 없 기 때 문 입 니 다. 그 러 니 순 순 히 실행 시 켜 야 합 니 다. 그래서 FTWRL 은 기 다 려 야 합 니 다.
『 8195 』 flush tables with read lock 은 테스트 할 때 몇 밀리초 만 에 완성 할 수 있 습 니 다. 제 가 만난 상황 처럼 생산 환경 에서 도 몇 시간 이 걸 릴 수 있 습 니 다.그 동안 MySQL 서 비 스 는 read - only 뿐만 아니 라 완전히 차단 되 었 습 니 다.flush tables with read lock 이 동작 을 하기 때 문 입 니 다.
요청 잠 금
flush tables with read lock 전역 read lock 요청.이런 상황 이 발생 하면 다른 프로 세 스 가 수정 동작 이 있 으 면 막 힐 것 이다.이론 적 으로 볼 때 이런 상황 은 결코 나 쁘 지 않다. 왜냐하면 flush tables with read lock 은 read lock 만 필요 하고 다른 명령 (read lock 만 필요 함) 은 flush tables with read lock 과 병존 할 수 있 기 때문이다.그러나 사실상 대부분의 수 표 는 자 물 쇠 를 읽 고 써 야 한다.예 를 들 어 첫 번 째 문 구 는 이 전체적인 읽 기 자물쇠 에 의 해 막 히 고 하위 조 회 는 첫 번 째 문장 에 의 해 막 히 기 때문에 진정 으로 효과 적 인 것 은 열 쇠 를 사용 하 는 것 이다. 모든 새로운 요청 이 막 히 고 조회 문 구 를 읽 는 것 을 포함한다.
대기 자물쇠
flush tables with read lock 이 잠 금 을 성공 적 으로 얻 기 전에 모든 구문 이 실 행 될 때 까지 기 다 려 야 합 니 다 (SELECT 포함).따라서 느 린 조회 가 실행 되 거나 열 린 업무 가 있 거나 다른 프로 세 스 가 시계 자 물 쇠 를 들 고 있 으 면 flush tables with read lock 은 모든 자물쇠 가 풀 릴 때 까지 막 힙 니 다.아래 의 예 를 보십시오.
mysql> show processlist;
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
| 4 | root | localhost | test | Query | 80 | Sending data | select count(*) from t t1 join t t2 join t t3 join t t4 where t1.b=0 |
| 5 | root | localhost | test | Query | 62 | Flushing tables | flush tables with read lock |
| 6 | root | localhost | test | Field List | 35 | Waiting for table | |
| 7 | root | localhost | test | Query | 0 | NULL | show processlist |
+----+------+-----------+------+------------+------+-------------------+----------------------------------------------------------------------+
4 rows in set (0.00 sec)
스 레 드 6 이 연결 되 지 않 은 것 을 볼 수 있 습 니 다. MySQL 의 클 라 이언 트 가 연결 되 었 을 때 - A 를 지정 하지 않 았 기 때문에 현재 라 이브 러 리 에 있 는 모든 표 와 열 을 가 져 오 려 고 합 니 다.스 레 드 5 도 flush tables 가 없습니다. 스 레 드 4 에서 자 물 쇠 를 풀 기 를 기다 리 고 있 기 때 문 입 니 다.
새로 고침 표
flush tables with read lock 이 자 물 쇠 를 가 져 오 면 반드시 flush data.MyISAM 엔진 에 대해 서 는 자신의 data 뿐만 아니 라 운영 체제 의 data 도 disk 에 새로 고 칩 니 다 (MyISAM relies on the filesystem block cache for caching reads to the data rows and indexes, while InnoDB does this within the engine itself, combining the row caches with the index caches).그래서 MyISAM 시계 라면 시간 이 오래 걸 릴 수도 있 습 니 다.
소지 자물쇠
잠 금 을 풀 려 면 unlock tables 나 다른 명령 을 사용 할 수 있 습 니 다.
결론.
하나의 백업 시스템 은 일반적으로 생산 환경 에서 사용 되 기 때문에 우 리 는 flush tables with read lock 이 곧 실 행 될 것 이 라 고 간단하게 생각 할 수 없다.어떤 경우 에는 집행 이 느 린 것 은 피 할 수 없다.그러나 이러한 global lock 을 피하 기 위해 백업 시스템 을 설정 할 수 있 습 니 다.
mysqlperformanceblog
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.