DBMS: MySQL (no ver.)
Case sensitivity: plain=mixed, delimited=exact
Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
오늘 도커를 좀 공부해보려고 그냥 기본적인 springboot 코드에 도커 연결하고 db를 연결하는 과정에서 다음과 같은 오류 발생했다. 이게 가장 오랜 시간이 걸렸던 문제이다.
오늘 문제가 동시다발적으로 많이 발생해서 정확히 말할 수 는 없지만 새로 만든 db에 root권한이 없었던 점, 포트를 사용 중인 프로그램을 종료시켰는데도 여전히 포트가 사용중이었다는 점이 핵심적인 문제 발생 원인이었던 것으로 추정된다.
mysql 환경변수 설정
사실 저번에 컴퓨터 공장 초기화를 한 뒤로 컴퓨터에 MySQL을 아직 깔지 않아서 설치하는 작업을 1차적으로 했다.
mysql을 가지고 cmd에서 작업을 하려면 환경변수 설정을 해줘야한다.
mysql server 설치후 cmd창에서 mysql에 접근하려고하면
'mysql'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
라는 에러가 뜰 것이다.
시스템 -> 고급시스템 설정에 들어가서 환경변수를 클릭한다.
나는 설치할 때 디렉토리를 다르게 설정하지 않았어서 C:\Program Files\MySQL\MySQL Server 8.0에 mysql이 설치되었기에 Path에 들어가서
이렇게 환경변수를 추가해주었다. 그러면 cmd창에서 자유롭게 mysql을 사용할 수 있다.
3306 포트 충돌
사실 mysql 다운 받을 때부터 포트 충돌은 뜨고 있었고... 그래서 이 포트를 쓰고 있는 시스템들 찾아 작업관리자에 들어가 종료시킨 뒤 깔긴 했었다. 그래서 포트 3306인채로 깔긴 했다. (그런데도 포트가 사용 중인게 문제였다.)
그런나와 상황이 다른 스터디원도 똑같은 문제가 발생했고(이미 mysql 깔려있는 상태) 찾아보니까 윈도우에서 가끔 제대로 종료가 안되어서 포트가 이미 사용중이라는 오류가 뜰 때도 있다고 한다.
나한테 발생했던 상황은 3306를 다른 프로그램이 사용하고 있어서 애초에 intellij에서 docker에서 설정한 포트 연결 설정은 아예 사용도 안되고 있었던 것이다.
이때 port kill(종료)를 해야 해당 번호의 포트로 서버실행이 가능하다. (완전히 삭제시키는 것)
우선 cmd창을 관리자 권한으로 실행한다. netstat -a -o 명령어를 입력해 해당 포트번호에 해당하는 pid 번호를 확인한다.
그리고 taskkill /f /pid 해당번호를 입력해서 포트를 종료시킨다.
mysql connection error
일단 저렇게 port kill을 해준다음에 서비스에 들어가서 mysql을 재시작 시켜줬고
mysql 커넥션을 다음과 같이 바꿔주기도 했다.
처음에 에러코드에 대해 검색했을 때 gpt도 mysql 구성을 검토하여 연결을 허용하는지를 확인하라고 얘기를 했었다.
mysql 구성파일 (my.cnf 또는 my.ini)의 bind-address 매개변수가 응용 프로그램의 IP주소에서의 연결을 허용하도록 설정되어있는지 확인하라는 것이었다.
그 부분은 https://dhan-description.tistory.com/84 이분 블로그에 잘 설명이 되어있는 것 같다.
여기서 더 검색을 추가적으로 해봤을 때 네트워크 문제, 클라이언트와 서버의 버전 호환성 문제, 방화벽 설정에 대한 얘기들도 있었지만 권한을 확실히 설정해주었는지 IP주소에서 연결을 허용하였는지에 대한 이야기가 나와서 여기서부터 건들여봤다. 권한 허용을 제대로 했는지에 대한 의심이 든 것. (실제로 해결되었다)
사실 db 연결이 보통 실패할 때는
- db 서버가 실행중인지
- 포트가 올바르게 하나만 작동중인지
- 사용자에 대한 권한이 주어져있는지
- 버전을 잘 맞는지
이런 문제들을 점검을 해보아야한다.
우리 케이스에서는 3306 포트도 올바르게 하나만 작동되고 있는 상황이 아니었고, 나같은 경우는 사용자인 root에게 권한이 제대로 주어지지도 않았던 것이다.
우선 mysql -u root -p 명령어로 데이터 베이스에 접근했다.
확인해보니 애초에 내가 필요로 했던 db라는 데이터베이스가 안만들어져 있어서 이 부분도 만들어줬다.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.10 sec)
mysql> create DATABASE db;
Query OK, 1 row affected (0.03 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> use db;
Database changed
이제 권한에 대한 변경을 해줬다.
GRANT ALL PRIVILEGES ON db.* TO 'root'@'localhost'; 라는 명령어로 root 사용자가 localhostd에서 db라는 이름의 데이터베이스에 있는 모든 테이블들에 대해 권한을 가지게 해줬다.
변경 사항을 즉시 적용하도록 FLUSH PRIVILEGES; 를 입력했다.
아직 db를 작업을 안했으니 show 테이블을 했을 때 아무것도 없는 것이 맞다.
이후 GRANT SUPER ON *.* TO 'root'@'localhost';라는 명령어를 사용하여 root 사용자에게 super권한을 부여했다.
mysql> GRANT ALL PRIVILEGES ON db.* TO 'root'@'localhost';
Query OK, 0 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> use db;
Database changed
mysql> show tables;
Empty set (0.02 sec)
mysql> GRANT SUPER ON *.* TO 'root'@'localhost';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
포트도 정리하고 사용자 권한 설정까지 해주니 이렇게 db연결에 성공했다!
'Error' 카테고리의 다른 글
[Error] SpringBoot 한글 ?? 깨짐 에러 해결 (mustache 사용) (1) | 2024.10.05 |
---|