본문 바로가기
카테고리 없음

[MySQL] Global Lock 동작원리 대기시간

by sujupark54 2026. 2. 16.

글로벌 락 이미지

MySQL에서 락(Lock)은 동시성을 제어하기 위한 핵심 메커니즘이다. 그중에서도 Global Lock은 가장 범위가 넓은 락으로, 단일 테이블이나 데이터베이스가 아닌 MySQL 서버 전체에 영향을 준다. 이 락은 주로 백업이나 서버 정합성 확보가 필요한 순간에 사용되지만, 잘못 사용하면 전체 서비스가 멈춘 것처럼 보일 수 있어 주의가 필요하다.


Global Lock 동작 원리 이해

Global Lock은 FLUSH TABLES WITH READ LOCK 명령어로 획득할 수 있다. 이 명령이 실행되면 MySQL 서버는 전체를 읽기 전용 상태로 전환한다. 중요한 점은 SELECT 쿼리는 정상적으로 실행되지만, INSERT, UPDATE, DELETE 같은 DML과 CREATE, ALTER 같은 DDL은 모두 대기 상태에 들어간다는 것이다.

이 락은 MySQL 엔진 레벨에서 동작하기 때문에 InnoDB, MyISAM 등 스토리지 엔진의 종류와 무관하게 모든 데이터베이스와 모든 테이블에 영향을 미친다. 즉 하나의 세션에서 Global Lock을 획득하면, 다른 세션에서 실행되는 쓰기 관련 쿼리는 모두 중단된다.

여러 세션이 동시에 연결된 상태에서 테스트해 보면 조회 쿼리는 문제없이 동작하지만, 쓰기 쿼리는 즉시 수행되지 않고 락 대기열에 쌓이게 된다. 이러한 특성 때문에 Global Lock은 운영 중인 서비스에서는 매우 신중하게 사용해야 한다.

실무에서는 전체 백업을 수행할 때 데이터 변경을 막기 위해 Global Lock을 사용하는 경우가 많다. 하지만 그만큼 영향 범위가 크다는 점을 반드시 인지해야 한다.


Global Lock 대기 시간과 큐 동작

Global Lock이 획득된 상태에서 다른 세션이 쓰기 쿼리를 실행하면 해당 쿼리는 즉시 실패하지 않고 대기 상태로 전환된다. 이때 쿼리들은 내부적으로 락 대기열(Lock Queue)에 쌓이며 FIFO(First In First Out) 방식으로 처리된다.

즉 먼저 대기한 쿼리가 Global Lock 해제 후 가장 먼저 실행된다. 이 특성 때문에 같은 DDL 명령을 여러 세션에서 실행할 경우, 먼저 실행된 쿼리는 성공하고 뒤따르는 쿼리는 이미 반영된 변경 때문에 실패할 수도 있다.

Global Lock의 대기 시간은 MySQL의 세션 타임아웃 설정에 영향을 받는다. 대표적인 설정 값은 wait_timeoutinteractive_timeout이다. 기본값은 28,800초, 즉 8시간으로 설정되어 있다.

대화형 세션(CLI, GUI 툴)에서는 interactive_timeout이, 애플리케이션이나 스크립트에서는 wait_timeout이 적용된다. 따라서 운영 환경에 따라 이 값을 조정하지 않으면, 의도치 않게 수 시간 동안 쿼리가 대기하는 상황이 발생할 수 있다.

필요하다면 글로벌 또는 세션 단위로 타임아웃을 줄여 장시간 대기를 방지할 수 있다.


Global Lock 사용 시 주의사항

Global Lock을 사용할 때 가장 주의해야 할 점은 실행 중인 쿼리가 모두 종료된 이후에야 락을 획득할 수 있다는 것이다. 즉 이미 수행 중인 SELECT 쿼리가 오래 걸린다면, Global Lock을 요청한 세션은 그 쿼리가 끝날 때까지 대기한다.

이 상태에서 또 다른 세션이 쓰기 쿼리를 실행하면, Global Lock이 획득될 때까지 기다린 뒤, 락이 해제될 때까지 다시 한 번 대기하게 된다. 결과적으로 하나의 느린 조회 쿼리가 전체 서버의 쓰기 작업을 장시간 멈추게 만들 수 있다.

특히 SLEEP 함수나 대량 조회처럼 시간이 오래 걸리는 쿼리가 운영 환경에 존재한다면 Global Lock 사용은 매우 위험해진다. 백업이나 점검 작업을 수행하기 전에 현재 실행 중인 쿼리를 반드시 확인해야 하는 이유다.

Global Lock은 강력한 도구이지만, 그만큼 파급력도 크다. 운영 중인 서비스에서는 가능하다면 대체 수단(InnoDB 기반 백업, 온라인 백업)을 우선 고려하고, 정말 필요한 경우에만 짧은 시간 동안 사용하는 것이 바람직하다.


마무리 정리

Global Lock은 MySQL에서 가장 강력한 락 중 하나다. 서버 전체를 보호할 수 있는 대신, 서버 전체를 멈출 수도 있다.

동작 원리와 대기 방식, 타임아웃 설정을 정확히 이해하지 못한 채 사용하면 작은 점검 작업이 장애로 이어질 수 있다. 반대로 특성을 잘 이해하고 사용한다면 데이터 정합성을 안전하게 지킬 수 있는 수단이 된다.

결국 Global Lock은 “알고 쓰면 약, 모르고 쓰면 독”에 가까운 기능이다. 운영 환경에서는 반드시 영향 범위를 계산하고, 필요 최소한의 시간 동안만 사용하는 것이 가장 중요하다.