본문 바로가기
Go

WSL2 에서 데이터 베이스를 MySQL로 사용하여 로컬에서 연결시도시 dial tcp 127.0.0.1:3306: connect: connection refused 문제 해결방법

by yongckim 2021. 12. 16.
728x90
반응형

Golang(Gin 프레임워크 사용)으로 백엔드를 사용하던중 WSL2에 올려놓은 MySQL에 연결을 하려고하니 계속 다음과 같은 에러가 발생했습니다.

로컬에서는 mysql이 잘 접속되는 상황이 었습니다.

하지만 -h로 호스트 주소를 지정할 경우에는 똑같이 에러메시지가 발생하는 것을 볼 수 있었습니다.

그런데 -h 옵션을 주었을때 127.0.0.1이 아닌 localhost를 주었을 때는 접속이 되는 상황이었습니다.

그래서 localhost와 127.0.0.1로 접속시도시 차이점에 대해 찾아보았더니 localhost로 접속 시도시 유닉스 소켓을 통해 mysql에 연결하고 127.0.0.1로 연결시도시 TCP/IP로 연결하게 됩니다.

그래서 Go 코드에서 TCP연결이 아닌 Socket 연결을 하도록 다음과 같이 변경한 후 연결을 시도해보면 연결이 잘되는 것을 볼 수 있습니다.

package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

// socket 연결을 위한 데이터를 세팅해두는 구조체
type ConnPath struct {
	// db 계정이름
	username string
	// db 계정 패스워드
	password string
	// Socket 파일 위치
	socketPath string
	// 연결할 데이터베이스 이름
	database string
}

// Mysql을 Scoket으로 연결하기 위해 사용하는 함수
func GetSocketConn() string {
	connInfo := ConnPath{
		username:   "root",
		password:   "root",
		socketPath: "/var/run/mysqld/mysqld.sock",
		database:   "gomusic",
	}
	conn := connInfo.username + ":" + connInfo.password +
		"@unix(" + connInfo.socketPath + ")" + "/" +
		connInfo.database + "?charset=utf8"
	return conn
}

func main() {
	conn, err := sql.Open("mysql", GetSocketConn())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(conn)
}

다음과 같이 socket 연결을 하도록 코드를 수정하면 잘 연결되는 것을 확인할 수 있습니다.

Golang에서 MySQL에 소켓 연결을 하고 싶을 경우 다음과 같은 방법을 사용해서 연결하면 됩니다.

$USERNAME:$PASSWORD@unix($SocketPath)/$DBName?charset=utf8
  • $USERNAME : DB 사용자 계정명 (ex : root)
  • $PASSWORD : DB 사용자 계정의 패스워드
  • $SocketPath : MySQL 소켓 위치(ex : /var/run/mysqld/mysqld.sock)
  • $DBName : 사용할 데이터베이스 이름
반응형

'Go' 카테고리의 다른 글

[gRPC] gRPC의 등장배경과 gRPC 이전의 통신  (0) 2021.12.22