MySQL Workbench를 통해 스키마를 수정하거나, 조회를 할 때 종종 이런 에러가 발생한다.
Error Code: 2013. Lost connection to MySQL server during query
원인은 2가지 정도로 보인다.
- `쿼리 수행 시간`이 `제한 시간`보다 초과되서 강제로 연결이 끊어짐
- 특정 쿼리에서 `교착상태`가 발생
이번 글은 `교착상태`가 원인일 때 해결하는 방법이다.
프로세스 확인
show processlist;
여기서 팁스토리님의 글을 참고하여, 각 컬럼의 뜻을 보자.
ID : 클라이언트의 프로세스 ID (스레드 번호)
USER : 프로세스와 관련된 사용자 이름 (스레드에 접속하고 있는 MySQL 유저명)
HOST : 클라이언트가 연결된 호스트 (유저가 접속하고 있는 호스트명 및 IP주소)
DB : 프로세스의 기본 데이터베이스 (기본값이 없으면 NULL)
COMMAND : 명령 유형 (스레드 명령 값 참조)
TIME : 프로세스가 현재 상태에 있었던 동작 시간 (초)
STATE : 스레드 상태 (스레드 상태 참조)
INFO : 실행중인 명령문(SQL) *최대 100자까지 표시됨, 전부 표시하려면 SHOW FULL PROCESSLIST; 사용
PROGRESS : 프로세스의 총 진행률 (0-100 %) (진행률 보고 참조)
(추가) 프로세스 실시간 LOCK 확인
SELECT * FROM information_schema.INNODB_TRX;
위의 쿼리를 실행하면 현재 어떤 쿼리가 실행 중이고 LOCK 상태인지 확인할 수 있다.
LOCK 상태인 프로세스 id 를 찾으려면 "trx_mysql_thread_id" 컬럼에 있는 값을 보면된다.
프로세스 죽이기
# KILL [죽일 프로세스 아이디];
# 사용 예시
kill 94031;
# 만약 AWS RDS를 사용중이라면 아래의 명령어를 사용한다.
call mysql.rds_kill(94031);
글을 마치며
특정 프로세스들을 죽이는 행위는 임시 방편으로 급할 때만 사용한다.
근본 원인을 해결하기 위해서, 왜 이런 문제가 발생했는지 확인해야한다.
'Database > MySQL' 카테고리의 다른 글
[스터디] Real MySQL 8.0 1권 - 5장 트랜잭션과 잠금 정리 (0) | 2024.09.23 |
---|---|
[MySQL] INSERT 할 때, 마지막 PK 값에서 1씩 증가시키는 방법 (0) | 2023.04.27 |
[MySQL] AUTO_INCREMENT 초기화하는 방법 (0) | 2023.04.27 |
[MySQL] 테이블 내 중복 데이터 삭제 (0) | 2023.04.27 |
[MySQL] 계정 조회, 계정 생성, 계정 삭제, 권한 조회, 권한 부여, 권한 삭제 (0) | 2022.09.30 |