본문 바로가기
정보관리(데이터베이스, DB)/MySQL

[MySQL] [08S01] Communications link failure

by 3604 2023. 8. 1.
728x90

[MySQL] [08S01] Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. java.net.ConnectException: Connection timed out: connect.

출처: [MySQL] [08S01] Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. java.net.ConnectException: Connection timed out: connect. (tistory.com)

!! 이 글은 Linux 인스턴스 기반입니다 !!

 

문제

[MySQL] [08S01]  Communications link failure   The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. java.net.ConnectException: Connection timed out: connect.

IntelliJ에 EC2 인스턴스를 연결하려는데 연결 실패가 계속되었다. MySQL 워크벤치로 실행하니 연결 권한이 없다고 해서 권한 설정을 위해 인스턴스를 실행했다. 

 

EC2 인스턴스의 MySQL을 원격 접속하는 가이드는 검색하면 꽤 많이 나온다.

우분투 기반 리눅스에서는 mysql.conf.d 설정 파일에서 bind-address에 localhost가 할당되어있는 부분을

주석처리하면 일반적으로 원격 접속이 가능하다. 이는 localhost에서만 접속할 수 있던 상태에서 주석처리함으로써 그 외의 ip도 접속할 수 있게 되기 때문이다.

인스턴스를 다른 팀원이 만들었고 보통 우분투 기반을 하기 때문에 당연히 설정파일이 있을 줄 알았는데 아무리 찾아도 없었다.

 

 

별 옵션 다 주면서 검색했는데도 맞는 설정파일이 없었다.

이쯤되어 다른 의심이 생겨서 일단 MySQL 버전을 확인했다.

 

mysql --version

for Linux on x86_64 버전? 다른 가이드와 비교했더니 다른 버전이었다.

없는 설정파일을 마음대로 만들어도 서버에서 잡아줄지 모르겠어서 일단 다른 방법을 찾아보았다.

 


해결

가장 간단한 방법은 MySQL에서 외부 호스트에서도 접속할 수 있도록 권한을 주는 것이다.

그래서 root에 권한을 주도록 커맨드를 입력했다.

GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH  GRANT OPTION;

 

그리고 다음과 같은 에러 메시지를 받았다.

ERROR 1410 (42000): You are not allowed to create a user with GRANT

 

 

루트 계정인데도 권한을 줄 수가 없다.

그래서 1) 루트 계정을 만들고 2) 루트 계정에 권한을 주는 방식을 사용했다.

 

CREATE USER 'root'@'%' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

권한 설정 후에는 flush privileges; 를 입력하여 권한을 적용한다. 


결과 및 새로운 문제

이 방식으로 해결은 했다.

IntelliJ에서도 연결했더니 테스트도 성공했다.

 

그런데 여기서 문제가 생기는데, root권한을 가진 유저를 만드는 방식이기 때문에

보안에 상당히 취약하다는 점이다.

나는 개인 프로젝트에서 쓰는 용도지만 그 외에는 이런 방식을 사용하면 보안 이슈가 생길 수 있다.

 

root권한을 생성하고 다른 유저를 만들어 필요한 권한만 부여하고 root 계정은 삭제하는 방식을 해야할 것 같은데, 정확히 이 방법으로 제대로 동작할지는 모르겠다. 우선 현재까지의 진행을 보면 

 

localhost에서만 접속 가능한 root가 있고 새로 만든 원격 접속 가능한 root가 있다.

보안을 위해서 일반 사용자를 두고 root는 삭제하는게 맞을 것 같다. 

728x90