본문 바로가기
데이터베이스

MySQL 잠금 해결 방법 및 Lock 모니터링

by 데이널 2024. 11. 1.

'데이널'의 컨텐츠에 포함된 정보는?

     

    데이터베이스 운영 중 갑자기 쿼리가 진행되지 않는 것처럼 느려지는 경험을 해보셨을 거예요. 실제로 MySQL 운영 시 발생하는 문제의 약 40%가 잠금 관련 이슈라고 합니다.

     

    오늘은 제가 10년 이상 데이터 관련 일을 하면서 겪은 경험을 바탕으로 MySQL 잠금 문제를 효과적으로 해결하는 방법을 알려드리겠습니다.

     

    MySQL 잠금 해결 방법 및 Lock 모니터링
    MySQL 잠금 해결 방법 및 Lock 모니터링

     

    잠금(Lock)이 발생하는 이유와 문제점

    MySQL에서 잠금이 발생하는 주요 원인은 크게 세 가지입니다. 트랜잭션 충돌, 데이터 구조 변경, 잘못된 쿼리 사용인데요. 여러분도 이 중에 한 가지일 것입니다. 

    1. 트랜잭션 충돌

    • 여러 세션이 동일한 데이터를 수정하려 할 때
    • 트랜잭션이 너무 오래 지속될 때
    • 커넥션 풀 고갈 상황

    2. 테이블 구조 변경

    • ALTER TABLE 작업 수행 시
    • 인덱스 생성/삭제 시
    • 파티션 관리 작업 시

    3. 잘못된 쿼리 사용

    • 인덱스를 사용하지 않는 UPDATE/DELETE
    • 대량 데이터 처리 시 트랜잭션 미분할
    • WHERE 절 없는 UPDATE 문

    실제로 한 테이블의 파티션 작업을 하다가 전체 시스템이 30분 동안 서비스를 할 수 없었던 적이 있었습니다. 원인은 단순히 파티션 작업 동안 락이 발생한 상태였죠.

     

    MySQL 잠금(Lock) 모니터링

    잠금 상황을 모니터링하는 3가지 방법입니다. 만약, innodb_locks, innodb_lock_waits 테이블이 설치되지 않는 경우는 가장 마지막 명령어로 확인할 수 있습니다.

     -- 현재 Lock 확인
    SELECT * FROM information_schema.innodb_locks;

    -- Lock 대기 확인

    SELECT * FROM information_schema.innodb_lock_waits;

    -- 현재 Lock을 걸고 있는 트랜잭션 상태
    information_schema.INNODB_TRX

    -- 프로세스 목록 확인
    SHOW PROCESSLIST;

     

    위 모니터링 SQL에 대한 분석 포인트는 아래 왔습니다. 

    1. 대기 시간: 너무 오래되지 않아야 함

    • INNODB_TRX.trx_wait_started
    • PROCESSLIST.Time

    2. 잠금 유형

    • Record Lock: 특정 레코드에 대한 변경을 보장하기 위해 해당 레코드에 잠금을 거는 것을 의미
    • Gap Lock: InnoDB 엔진에서 사용되는 잠금의 한 종류로, 레코드와 레코드 사이의 간격을 잠그는 것을 의미
    • Next-key Lock: InnoDB 엔진에서 사용되는 잠금의 한 종류로, 레코드 락과 갭 락이 결합된 형태

    3. 관련 테이블

    • 잠금이 발생한 테이블 정보
    • 인덱스 사용 여부
    • 트랜잭션 상태

     

    MySQL 잠금(Lock) 해제

    MySQL 잠금 해제 잠금 상황이 발생했을 때의 해결 방법입니다:

     

    1. 트랜잭션 강제 종료

    -- 해당 트랜잭션 ID 확인 후 종료
    KILL QUERY process_id;
    KILL process_id;

     

    2. 롤백 강제 실행

    -- 특정 트랜잭션 롤백
    XA RECOVER;
    XA ROLLBACK 'xid';


    3. 테이블 락 확인

    -- 테이블 락 확인
    SHOW OPEN TABLES WHERE In_use > 0;


    4. 테이블 락 해제

    -- 테이블 락 해제
    UNLOCK TABLES;

     

    마치며

    실제 운영 환경에서는 문제 세션 식별 → 잠금 유형 확인 → 영향도 분석 →  해결 방안 실행 → 재발 방지 대책 수립으로 진행해야 합니다. 

     

    MySQL 잠금은 데이터베이스 성능에 직접적인 영향을 미치는 중요한 문제입니다. 위 글을 통해 MySQL 잠금이 발생하는 원인과 문제점, 그리고 효과적인 해결 방법에 대해 학습하셨기를 바랍니다.