집에서 개발용 데스크탑으로 MySQL 돌리고, 밖에서는 노트북으로 작업하고 싶었다. 그냥 IP만 바꾸면 될 줄 알았는데... 세상에 이렇게 빡셀 줄이야.
DataGrip에서 데스크탑 IP 넣고 연결 시도.
Connection refused
당연히 안 되더라. 아 맞다 방화벽.
Windows 방화벽에서 3306 포트 열어줌.
Connection timed out
여전히 안 됨. 뭐지?
찾아보니 MySQL이 기본적으로 localhost에서만 접속 받는다고 함.
my.ini
파일 찾아서 수정:
[mysqld]
bind-address = 0.0.0.0
port = 3306
MySQL 재시작하고 다시 시도.
Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server
오 뭔가 진전이 있다! 이제 연결은 되는데 권한이 없다는 뜻.
이 부분에서 좀 헤맸다. MySQL에 루트로 접속해서:
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
여기서 %
가 모든 IP를 허용한다는 뜻이었다. 처음엔 몰랐음.
한번 테스트해보자.
C:\Users\me>ping xxx.xxx.xxx.xxx
핑은 잘 됨.
C:\Users\me>telnet xxx.xxx.xxx.xxx 3306
여기서 이상한 게 나왔다:
8.0.37w,y-Qp
;*^S,]Sj7K
caching_sha2_password !#08S01Got packets out of order
연결이 끊어짐
뭐지 이게? 에러인가?
찾아보니 이게 정상이었다. MySQL 서버가 응답하는 거라고. telnet은 텍스트 기반인데 MySQL은 바이너리 프로토콜을 쓰니까 이상하게 보이는 것뿐.
중요한 건 연결이 된다는 것!
이제 DataGrip에서 연결해보자.
Host: xxx.xxx.xxx.xxx
Port: 3306
Database: mydatabase
User: myuser
Password: mypassword
Test Connection 클릭... 또 에러.
MySQL 8.0부터 인증 방식이 바뀌었다고 함. Advanced 탭에서 몇 가지 더 설정:
allowPublicKeyRetrieval
: trueuseSSL
: false serverTimezone
: Asia/Seoul이제 됐다!
'user'@'localhost'
와 'user'@'%'
는 다른 사용자다지금은 개발용이라 대충 했는데, 실제 서비스에서는:
보안 신경써야 할 듯.
생각보다 복잡했지만 한번 설정해두니까 편하다. 이제 집에서든 밖에서든 같은 DB 쓸 수 있어서 개발이 훨씬 수월해졌다.
근데 왜 이런 기본적인 것도 이렇게 복잡하게 만들어놨을까... MySQL 문서도 좀 더 친절했으면 좋겠다.