MySQL DB 접속이 안될 경우 DBA가 확인 해볼만한 것들

"MySQL DB 접속이 안됩니다!!"

이만큼 DBA에게 심쿵하는 말이 있을까. (소-름 😱)
사용자가 MySQL DB에 접속이 안된다고 외칠때, DBA는 무얼 확인해볼 수 있을까?

팁: "MySQL DB 접속이 안됩니다!!"라고 외친 사람에게,
DB 접속 시 어떤 에러를 뱉으며 접속이 안되는지 에러메시지를 먼저 달라고 한다.
의외로 별 일이 아닐지 모른다. (문제 해결 지름길)
MySQL

긴급하게 먼저 확인할 것

DB는 떠있을까

혹시 DB가 죽었을지도 모른다. DB가 떠있는지 확인해본다.

# mysqld 데몬을 확인한다
ps -ef | grep mysqld

떠있더라도 DB님이 방금 내려갔다 오시진 않았는지 꼼꼼히 살펴본다

DB가 내려 갔다가도 스케쥴에 의해 순식간에 다시 살아 올라와서 모른쇠 하고 있을지도 모른다.
DB가 방금 내려갔다 올라오진 않았는지 uptime을 확인한다.

# MySQL에서 아래와 같이 status 커멘드로 uptime을 확인한다
mysql> status
# mysqladmin 유틸리티로 확인할 수도 있다.
mysqladmin -uroot -p status

간혹 서버까지 내려갔다 올라온 경우도 더러 있을 수 있다. 서버 uptime도 한번 확인해보자.

# 서버 uptime 확인
uptime

에러메시지에 특이사항이 없는지 확인한다

mysql 에러메시지에 특이사항이 없는지 확인 해본다.

# 최근 MySQL DB 에러로그에 특이사항이 없는지 확인. 20줄만 잘라보자
tail -20 mysql.err 

커넥션 리밋 확인

혹시 커넥션이 max값까지 모두 사용하여 신규 커넥션을 받지 못하고 있을 수 있다.

해당 파라미터와 현재 접속 커넥션을 확인해보자.

# 커넥션 max값 확인
show variables like 'max_connections';

# 현재 커넥션 수 확인
show status like 'Threads_connected';

# 현재 커넥션 상태 확인 (1)
show processlist

# 현재 커넥션 상태 확인 (2)
select * from information_schema.processlist;

방화벽 확인

혹시 신규 장비에 새로 DB를 설치한 상태라면, 방화벽 오픈이 정상적으로 되었는지 확인해볼 필요가 있다. (의외로 이런 경우 많다.)

접속 시도 시 잠시 돌다가 'Can't connect to MySQL server~' 와 같은 에러를 주로 뱉는다.

이정도 보았는데도 특이사항이 없으면 아무래도 DB엔 특별한 문제가 없는 것 같다.

그럼에도 특이케이스는 존재할 수 있으며, 모든 케이스를 적을 순 없었던 점 양해 부탁 드립니다.
댓글로 경험을 공유해주시면 감사하겠습니다.

사용자의 접속 상태 확인

접속 커멘드/설정 확인

의외로 사용자의 접속 커멘드나 설정 때문에 DB에 접근을 못하고 있는 경우도 많다.
(운영하면서 "MySQL DB 접속이 안됩니다"의 99%는 사실 이 케이스였다. 나머지 1%는... 엣헴...)

사용자가 mysql 접속 시 어떤 설정으로 접속 시도를 했는지를 확인해보자.
단순히 유저명/패스워드 오타 입력으로 접속이 안되기도 한다. (는 당연한 이야기를 대단한 것처럼 적고 있다.)
Port 숫자를 오기입 한 경우도 있을 수 있고, (Default Port: 3306 - 변경 가능)
로컬 접속했다면 Socket 경로를 잘못 지정했을 수도 있겠다. (Default Socket: /tmp/mysql.sock - 변경 가능)

단순 패스워드 오타라면 아래와 같은 에러를 볼 수 있다.

Access denied for user '유저'@'호스트' (using password: YES)

유저 권한 확인

다소 이 주제에서 조금 벗어난듯 하지만, 또 아예 다른 이야기는 아니라서 함께 소개한다.

만일 DB 유저를 이제 막 생성해서 사용자에게 주었는데, 위에 언급한 다른 문제들이 모두 없는 상태임에도 DB 접속이 안되는 상황이라면 DB user 생성을 올바르게 하였는지 확인할 필요가 있다.

# DB user 권한 확인
show grants for '유저명'@'호스트';

호스트는 맞게 부여 했는지(전체? 대역? 등...),
권한범위를 어디까지(전체? 특정 DB에만? 등..) 주었는지 확인을 해보아야 한다.

DB 유저명이나 패스워드에 오타를 내서 생성하진 않았는지도 확인한다.

SSL 사용 여부 확인

MySQL은 SSL 접속을 지원하는데, 이를 강제하는 옵션도 존재한다.
혹은 계정별로 SSL 옵션을 다르게 부여할 수도 있다.

이 부분에서 실제 SSL 설정과 사용자가 접속 시도한 커멘드가 맞지 않는 부분이 있는지 살펴본다.

jdbc 버전 확인

예전에 경험했던 것 중 jdbc 때문에 아예 DB 접속을 못했던 것은 아니지만, 너무 낮은 jdbc 버전으로 MySQL DB 접속 시 에러로그에 어마어마한 Warning 로그를 남기는 경우를 본 적이 있다. jdbc 버전이 적절한지도 확인해볼 필요가 있겠다.

"MySQL DB 접속 안됩니다" 라고 연락 받았을 때 주로 살펴 보았던 내용들을 간략히 정리해 보았다.


위의 내용이 접속이 안되는 이유 였다면 비교적 간단하게 해결할 수 있지만, 큰 장애로 인해(...) DB 커넥션 조차 어려워진 경우라면 이 글에서 모두 적기엔 너무 어렵고 방대한 내용이므로 여기서 내용을 마무리 하겠다.

끝!

날짜 내용
2020.10.15 최초 글 작성
2021.07.23 글 해당 공간으로 복제