Lock 이란?
: 간단하게 설명하자면, 데이터의 일관성을 보장하기 위한 방법입니다. (= 잠금 / 데이터를 동시에 사용하게 해주는 기능)
그럼 Lock 의 종류는?
Shared Lock (공유 Lock 또는 Read Lock)
: 보통 데이터를 읽을 때 사용합니다. 내가 보고 있는 데이터를 다른 사용자 또한 볼 수 있지만, 변경할 수는 없습니다.
> Select 명령어
Exclusive Lock (배타적 Lock 또는 Write Lock)
: 보통 데이터를 변경할 때 사용합니다. 해당 Lock 이 해제되기 전까지는, 다른 사용자가 읽기 또는 쓰기가 불가능합니다.
> Insert / Update / Delete 명령어
Blocking 이란?
: Blocking 은 Lock 들의 경합이 발생하여 특정 세션이 작업을 진행하지 못하고 멈춰 선 상태를 말합니다.
> 이를 해결하는 방법은 Transaction commit 또는 Rollback 뿐입니다.
> 먼저 Lock 을 설정한 트랜잭션을 기다려야 하기 때문에, 이런 현상 발생 시 빠른 서비스를 제공할 수 없습니다.
그럼 Dead Lock이란?
: Dead Lock 은 트랜잭션간의 교착상태를 의미합니다.
> 두개의 트랜잭션 간에 각각의 트랜잭션이 가지고 있는 리소스의 Lock 을 획득하려고 할 때 발생합니다.
*. 예를 들면, 두 세션이 각각 Lock 을 설정한 리소스를 서로 접근하려고 마주보며 진행하는 상황,,,,
둘 중 하나가 뒤로 물러나지 않으면 영영 풀릴 수 없다는 점...
> Dead Lock 을 인지하면, 교착상태를 해결하기 위하여 하나의 트랜잭션을 취소시켜야 합니다.
Lock / Blocking / Dead Lock 에 대한 더 자세한 설명은 구글링!!! (Googling)
↓↓↓ 본론 START
[DB LOCK 해결 방법]
DBMS 동작 여부 확인.
: DB 연결이 잘되어 있는지 확인합니다.
> SSMS 로 해당 DB 서버에 연결하여 DB 목록이나 쿼리가 실행되는 지 확인합니다.
프로세스 확인.
: 해당 DB 서버에서 SP_WHO2 명령어를 실행합니다.
> 접근하고 있는 세션 수를 확인합니다. (SPID 가 50번 이 후 부터가 일반 세션)
: 세션 수가 300개 이상으로 다수 발생한다면, 단순 접속이 많아서 느려짐이 발생 할 수 있습니다.
> 이 때 [HostName] 컬럼에 다수 발견되는 사용자를 확인하여, 원인 파악 및 해결할 수 있는 지 확인합니다.
> 특정 사용자의 컴퓨터 명일 경우, 해당 사용자의 쿼리 창을 닫게 하거나, SSMS 재실행을 요청합니다. (접근중인 세션 수↓)
: SELECT 된 SPID 중 [Status] 컬럼 값이 RUNNABLE (실행중) 또는 suspended (지연중) 상태인 세션을 집중 확인합니다.
> [BlkBy] 컬럼에 SPID 가 있으면 해당 부분 세션이 어떤 다른 세션에 의해 블록 당하고 있는 것 입니다.
*. 많은 쿼리가 동시에 실행되기에 응답이 느린 쿼리가 실행 중일 땐, 다른 쿼리의 응답이 지연 또는 블록이 자연스러운 현상입니다.
(다만, 블록 상황이 오래되어 멈춤 상태가 지속되는 것이 문제입니다)
LOCK 잠김 확인.
: 해당 DB 서버에서 SP_LOCK 명령어를 실행합니다.
> LOCK 걸린 잠금 SPID 의 상태를 확인합니다.
↑↑↑
: 컬럼 값 설명
> SPID : 잠금을 요청하는 프로세스의 세션 ID
> DBID : 데이터베이스의 식별 번호
> OBID : 개체의 식별 번호
> INDLD : 인덱스의 식별 번호
> TYPE : 잠금 유형
> RESOURCE : 리소스 식별 값
> MODE : 잠금 종류
> STATUS : 잠금 요청 상태
: [MODE] 컬럼 값 설명
> S : 공유 잠금
> U : 업데이트 잠금
> X : 독점 잠금
> IS : 의도 공유
> IU : 의도 업데이트
> IX : 독점 의도
> BU : 대량 업데이트
문제의 세션 실행 구문 확인.
: 해당 DB 서버에서 DBCC INPUTBUFFER ([해당 SPID]) 명령어를 실행합니다.
> [EventInfo] 컬럼에서 해당 SPID 가 실행하고 있는 쿼리 내용을 알 수 있습니다.
해당 프로세스 KILL.
: 쿼리로 인한 문제이거나 해당 쿼리가 LOCK 을 발생시켜 느려진 원인이며,
자연스레 종료되지 않고 오랜 시간이 걸린다면 해당 프로세스를 강제로 KILL 합니다.
> 해당 DB 서버에서 KILL [해당 SPID] 명령어를 실행합니다.
최종 KILL 을 실행 한 후 해당 세션이 사라졌음을 확인하고, 교착 상태가 사라졌는 지 확인합니다.
이상, Database Lock? 주제로 한 짧은 글을 마칩니다. 감사합니다.
'DataBase > Maria DB' 카테고리의 다른 글
[DB/AWS] MariaDB Mariabackup을 이용한 백업 스케쥴 설정 2 (0) | 2023.02.09 |
---|---|
[DB/AWS] MariaDB Mariabackup을 이용한 백업 스케쥴 설정 (0) | 2023.02.09 |
[DB] MariaDB 시스템 튜닝 (0) | 2023.02.08 |
[DB/AWS] 리눅스2 MARIA DB 설치 - 3) MariaDB의 Data 위치 변경하기 (0) | 2023.02.08 |
[DB/AWS] 리눅스2 MARIA DB 설치 - 2) MariaDB 설치 (0) | 2023.02.08 |