크고 작은 문제들/어려움

[기록] 윈도우 MySQL ↔ ubuntu node.js(mysql2) 연결 시도

노새두마리 2023. 10. 26. 15:30

요약

  • MySQL 연결에 어려움을 겪는 경우 해볼 수 있는 갖가지 방법 적용
  • socat을 사용하여 소켓 통신을 시도하였으나 배경지식 부족으로 인하여 실패
  • socat을 통하여 ubuntu localhost:3306 - pc ip 주소:3306 연결
  • sql 요청 host로 pc ip 주소를 직접 입력하여 socat을 거치는 불필요한 단계 제거

상황

  • MySQL 서버를 윈도우에서 실행중
  • 동일한 기기의 WSL2 ubuntu 환경에서 node.js(mysql2)를 활용하여 데이터베이스 접근 시도(localhost:3306)
  • -111: ECONNREFUSED 오류 발생
  code: 'ECONNREFUSED',
  errno: -111,
  sql: undefined,
  sqlState: undefined,
  sqlMessage: undefined

해결 시도

1. MySQL 서비스 실행 여부 확인

윈도우 키를 누르고 '서비스'를 검색합니다.

MySQL 서버가 정상적으로 작동하고 있음을 확인하였습니다.


2. 방화벽 설정 확인

자동문 수준의 설정이 적용되어 있음을 확인하였고, 로컬 포트가 3306 포트로 제한되어 있던 것을 일시적으로 모두 허용으로 바꾸어 보았음에도 변화가 없었습니다.

방화벽에 의한 차단 여부 확인 결과 이상 없음


3. telnet을 활용한 포트 연결 확인

원격 제어 프로토콜인 telnet을 사용하여 포트에 대한 연결이 정상인지 확인합니다.

telnet [아이피 or 주소] [포트]

'connected to 주소'가 출력되었습니다. 연결은 정상적으로 수행되었습니다.

사용하지 않는 포트 번호로 바꾸어 보았습니다. 연결이 되지 않으면 연결을 시도하는 단계에서 넘어가지지 않네요.


4. 유저 권한 확인

MySQL 서버에 접근할 수 있는 새로운 유저를 만들어 모든 주소에서 접근 가능하도록 하였고, 모든 권한을 부여하였으나 문제가 지속되었습니다.


5. host 변경

localhost를 127.0.0.1로 변경 - 다수의 글을 참고한 결과 에러 코드가 -111이 아니라 -61인 경우에 유효한 해결법으로 보입니다. ECONNREFUSED 관련 게시글 중 독보적인 성공률을 자랑하는 해법입니다.

const pool = mysql.createPool(
  {
    host: 'localhost', // 이 부분을 '127.0.0.1'로 바꿉니다.
    user: 'user 이름',
    database: 'mydb',
    password: '비밀번호',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
  }
);

 


6. socat 사용

위의 모든 방법이 통하지 않고 남은 것은 소켓 연결을 시도하는 것 뿐. 하지만 MySQL의 소켓 디렉토리, 윈도우에서는 pipe 디렉토리를 찾아 named pipe라고 하는 MYSQL로 연결을 시도해보지만 실패합니다.

그러던 중 문득 생각이 듭니다. 출발지와 목적지를 정할 수 있으면 굳이 잘 모르는 소켓을 찾아서 연결하려고 하는 것보다 ubuntu의 3306번 포트와 MySQL이 실행중인 ip 주소의 3306번 포트를 직접 연결하면 되는 것이 아닐까요?

그래서 socat으로 이 둘을 직접 연결해 보기로 합니다.

socat TCP-LISTEN:3306,fork TCP:<내 컴퓨터 IP>:3306

그 결과, 반나절만에 한 단계 나아갈 수 있었습니다.

  code: 'ER_ACCESS_DENIED_ERROR',
  errno: 1045,
  sql: undefined,
  sqlState: '28000',
  sqlMessage: "Access denied for user 'root'@'DESKTOP-XXXXXX' (using password: YES)"

이제 남은 것은 한 단계입니다. JavaScript 파일에서 요청을 보내는 유저 이름 및 서버에서 허용한 호스트 등을 적절히 조작하여 'user'@'host' 부분이 접근 권한이 있는 사용자가 되도록 합니다.


결과

예스!


7. socat을 사용하지 않고 ip 주소로 직접 요청

성공


후기

MySQL을 ubuntu에 다시 깔거나 주먹구구식으로 데이터베이스 서버 배포를 시도했으면 더 빨리 해결했을 것 같습니다. 하지만 지금 물러서면 로컬 상에서 윈도우 + ubuntu 환경을 조합하여 개발할 때 동일한 문제가 발생할 수 있으므로 연결할 방법에 대해 고민하는 시간을 가졌습니다.

윈도우의 포트 수 제한 및 포트 재사용 타임아웃 적용으로 인한 서버 운용상의 불리함을 접하고도 끝까지 밀어붙인 이유는... 그저 오기가 발동해서라고 할 수 있겠네요.

MySQL을 중심으로 문제 해결 방법을 모색하려고 하다 보니 UNIX 계열의 환경이 선호되는 MySQL의 특성 상 윈도우에서 서비스되는 MySQL과 ubuntu 사이에 연결이 제대로 이루어지지 않는 문제를 해결하기 위한 인사이트를 얻기 어려웠습니다.

이후 네트워크 연결 자체에 초점을 두니 빠르게 해결할 수 있었고, 꼭 MySQL에만 국한된 문제는 아니므로 나중에 두 환경의 연결이 필요한 경우 '로컬'이라는 개념에 사로잡히지 않고 바로 ip 주소를 통해 연결할 수 있겠습니다.


참고

socat 활용

https://zetawiki.com/wiki/%EC%9A%B0%EB%B6%84%ED%88%AC_socat_%EC%84%A4%EC%B9%98

https://flower0.tistory.com/778

telnet 활용

https://extbrain.tistory.com/103

pipe

https://stackoverflow.com/questions/258701/how-can-i-get-a-list-of-all-open-named-pipes-in-windows