반응형

내 로컬에서 접속이 안된다고? MySQL host 설정 하나로 인생 바뀜

127.0.0.1 아니면 localhost? 진짜 중요한 건 딱 한 글자였더라구요...

요즘 뭐만 하면 DB 쓰잖아요? 작은 웹페이지든, 간단한 앱이든 간에, MySQL은 기본 중 기본처럼 깔고 쓰게 되니까요. 근데 이상하게 연결만 하려고 하면 무슨 “host가 틀렸다”, “접속 거부됐다” 이런 문구 뜨면 멘붕 오죠 ㅋㅋ 저도 처음엔 localhost만 써도 되는 줄 알았거든요. 근데 이게 알고 보니까 ‘host’ 설정이란 게 생각보다 깊고, 또 은근 까다롭더라구요...ㅠㅠ 한 번 꼬이면 진짜 몇 시간 날리는 건 기본이고, 구글링 하다가 화만 나고요 ㅎㅎ
그래서 오늘은 제가 직접 겪었던 MySQL host 설정 관련 삽질 썰 + 해결했던 방법까지 탈탈 털어볼까 해요. 뭐 하나라도 비슷한 상황 겪고 계시다면, 아마 고개 끄덕이실지도 몰라요 😉


처음 MySQL 설치했을 때는 그냥 root 계정에 비번 걸고, 쿼리 하나 날려보면 다 된 줄 알았거든요? 근데... 세상 그렇게 만만하지 않잖아요 ㅋㅋ
일단 'host'라는 단어 자체가 좀 뭔가 애매하잖아요. 도대체 'host'가 뭔데? 로컬에서 접속하는데 localhost가 맞는 건지, 127.0.0.1이 맞는 건지, 외부에서 접속하려면 어떻게 해야 하는 건지 진짜 헷갈림 그 자체였어요. 특히 ERROR 1130 (HY000): Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server 이런 에러 한 번 봐버리면... 와, 이건 진짜 복잡한 퍼즐 맞추는 기분이었어요.
알고 보니까 MySQL에서 말하는 'host'는 그냥 접속하는 사용자의 IP 주소나 도메인 그 자체더라구요. 단순한 이름 하나인데, 이걸 어떻게 지정하느냐에 따라 접속 가능 여부가 확 갈리니까... 신중하게 다뤄야겠구나! 싶었어요.
그리고 또 하나, GRANT 명령어 쓸 때도 이 host 설정이 핵심이라는 걸 나중에야 알았지 뭐예요~ 😅 오늘 이 글 보시는 분들께는 그런 삽질 안 하시길 바라며, 진짜 필요한 팁들만 쏙쏙 알려드릴게요!

1. "localhost"랑 "127.0.0.1", 똑같은 거 아님?

처음엔 진짜 당연히 같은 거라고 생각했거든요? 브라우저 주소창에 써도 같고, 핑 날려도 같고, 어차피 내 컴퓨터잖아요~ 근데 MySQL은 그렇게 호락호락하지 않더라구요. 이 둘은 사실 운영체제 레벨에서는 비슷한 역할을 하지만, MySQL 입장에서는 다르게 인식해요. 특히 MySQL은 localhost로 접속하려고 하면 소켓 파일을 먼저 찾고, 127.0.0.1은 TCP로 접속 시도한다는 거... 이걸 모르고 삽질할 수도 있음요 ㅠㅠ 저는 이거 몰라서 연결 안 되는 이유를 찾느라 반나절 썼습니다...


2. MySQL 유저 계정에 등록된 host가 전부다!

이거 진짜 핵심이에요! 아무리 비밀번호 맞고 사용자 아이디 맞아도, host가 안 맞으면 그냥 ‘넌 접속할 수 없는 사람임’ 이렇게 나와요. 예를 들어, 같은 계정이라도 user@localhostuser@%는 다른 존재라는 거죠. %는 모든 host에서 접근 가능하게 해주는 와일드카드인데요, 보안상 이유로 막아놓은 경우도 있어서 무턱대고 쓰면 또 안 되더라구요 😥 꼭 SELECT host, user FROM mysql.user;로 현재 설정을 먼저 확인해보세요! 이거 모르고 계속 같은 계정인데 왜 접속 안 되냐고 버럭했었음요... ㅋㅋ


3. GRANT 명령어, 그냥 명령어 아님

솔직히 처음엔 GRANT ALL PRIVILEGES 막 이런 거, 그냥 퍼미션 주는 건 줄 알았는데요! 알고 보니 이거 할 때도 IDENTIFIED BY 뒤에 host 지정이 은근히 중요하더라구요. GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%' IDENTIFIED BY 'pwd'; 이런 식으로 써야 외부에서 접근 가능하게 열리는 거였어요. 저처럼 무턱대고 %만 박았다가, 보안설정에 막히고, 또 방화벽에서 막히고… 진짜 허허, 하나 열리면 다른 데서 막히고 그랬어요.


4. my.cnf 설정 파일도 한 몫 함😤

접속 안 되면 무조건 사용자 계정 문제인 줄 알았는데, my.cnf 파일에 bind-address=127.0.0.1 요 한 줄 때문에 외부 접속이 막히는 경우도 은근 많아요. 이거 뭔가 하면 MySQL이 어디서 접속받을지를 제한하는 거거든요. 0.0.0.0으로 바꾸면 모든 IP에서 접속 허용된다는 뜻인데, 이걸 모르고 몇 시간 동안 권한 바꿔도 왜 안 되나 싶었네요~ 수정하고 나서도 MySQL 재시작 안 하면 반영도 안 되니까 꼭 systemctl restart mysql도 해줘야 하구요!


5. 외부 접속? 방화벽, 포트 열림도 체크해야 함!

어느 날은 다 맞게 했는데도 접속이 안 되는 거에요. 그래서 또 한참 구글링 했죠. 그랬더니 방화벽이 3306 포트를 막고 있었더라구요;; MySQL 기본 포트인데요, 이게 열려 있지 않으면 아무리 설정 다 맞아도 연결 자체가 안 돼요. ufw allow 3306 이런 거 꼭 해줘야 하더라구요. 외부에서 접근 테스트할 때는 포트스캔 해보는 것도 나쁘지 않구요. 아, 이건 좀 고급자 느낌 나죠 ㅋㅋ 그래도 진짜 그런 거 한두 번 해보면 실력이 확 느는 느낌이더라구요~


6. 직접 테스트해보면서 하나씩 체크하는 게 답!

결국은 내가 뭘 잘못 설정했는지 직접 부딪혀봐야 알 수 있더라구요. 너무 자동화 도구만 믿고 설정했다가 ‘왜 안 되지?’만 수십 번 말한 적도 있었고요. 저는 결국 하나씩 바꿔가면서 테스트해보는 게 제일 빠르다는 걸 느꼈습니다. 유저 생성 → host 지정 → 권한 부여 → 포트 열림 확인 → 실제 접속 테스트까지, 한 번 제대로 순서대로 해보면 감 잡혀요. 그리고 무엇보다, 한 번이라도 에러 로그 보는 습관 들이면, 삽질 시간 70%는 줄어듭니다~ 진짜루요 🤯

❓ 자주 묻는 궁금한 것들 (FAQ)

Q1. 외부에서 MySQL 접속하려는데 계속 안 돼요. 뭐부터 확인해야 하나요?
→ 제일 먼저 bind-address 설정을 확인하세요. /etc/mysql/my.cnf 또는 /etc/mysql/mysql.conf.d/mysqld.cnf 파일 안에 bind-address=127.0.0.1로 되어 있으면 외부 접속은 당연히 안 됩니다. 그리고 유저 생성 시 host가 %로 되어 있는지도 꼭 체크하셔야 해요!
Q2. localhost127.0.0.1 중 뭘 써야 안전한가요?
→ 둘 다 로컬접속이긴 한데, localhost는 유닉스 도메인 소켓을 사용하고, 127.0.0.1은 TCP를 써요. 소켓 접속은 빠르지만 설정에 따라 충돌날 수도 있어서 저는 대부분 TCP로 테스트합니다. 상황에 따라 다르게 써보는 것도 좋구요~
Q3. 사용자 계정에 host를 localhost로 해놓고 외부에서 접속 가능한가요?
→ 안 됩니다 😭 localhost는 말 그대로 '그 컴퓨터'에서만 접속 가능한 설정이에요. 외부에서 접속하려면 반드시 hostIP%로 등록해줘야 합니다. 아니면 또 ERROR 1130 만나게 됩니다... 경험담입니다...


흠... 이상하게 복잡했지만, 결국 다 연결되더라구요 😌

이 글 쓰면서도 다시 복습하게 됐는데요, 신기하게도 MySQL에서 가장 단순해 보이는 'host 설정'이 은근히 많은 걸 좌우하더라구요. 처음엔 뭐가 뭔지도 모르겠고 그냥 대충 하다보면 되겠지 싶었는데, 에러 하나 뜨면 바로 좌절...ㅎㅎ
그래도 하나씩 짚어보면서 해결해보니까, 그 전보단 훨씬 감이 생겼달까... 이제는 누가 접속 안 된다고 하면 대충 host 뭐로 설정했어? 이렇게 물어보게 된답니다 ㅋㅋ


혹시 여러분도 그런 경험 있으셨나요?

똑같이 설정했는데 접속은 안 되고, 이상하게 뭔가 빼먹은 느낌? 갑자기 GRANT 명령어가 기억 안 나고... 그런 적 다들 한 번쯤은 있으시죠? 😂 여러분은 어떻게 해결하셨는지도 궁금해지네요. 혹시 저랑 다른 방법으로 뚫으신 분 있으면 댓글이나 피드백 남겨주시면 같이 얘기해봐요!


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기