MySQL에서 localhost와 socket file!
데이터베이스 에러
프로그램을 만들 때 데이터베이스가 가장 말썽인 것 같다. 설계, 에러 등에서 시간을 많이 쓰게 된다. cloer chat프로젝트 중 잘 작동하다가 에러가 발생했다.
Error: connect ECONNREFUSED ::1:3306
데이터베이스에 연결이 안되는 에러인데 간단한 실수부터 방법으로 발생하는 에러다. 단순 실수로 발생한 에러가 아니고 몰랐던 부분이어서 정리하려 한다. 내 경우 MySQL 공식문서에서 답을 찾았다.
https://dev.mysql.com/doc/refman/8.0/en/can-not-connect-to-server.html
MySQL에서 localhost
localhost는 루프백 호스팅으로 본인의 컴퓨터를 나타내고 ip로 변환 될때 127.0.0.1(IPv4) 혹은 ::1(IPv6)로 변환된다. MySQL에 연결하는 방법은 두 가지가 있는데 하나는 Unix socket file을 이용하는 것이고 하나는 TCP/IP를 이용하는 것이다. Unix socket file을 이용하는 방법이 더 빠르지만 DB와 서버가 같은 컴퓨터 내에 있어야 한다. 그러니 당연히 빠를 수밖에. MySQL에서 host name을 특정하지 않거나 localhost를 사용하면 Unix socket file을 이용해 연결한다. 필자의 경우 이 부분에서 문제가 발생한 것이었다.
이를 해결하기 위해서는 TCP/IP 방법을 사용하거나 socket path를 명시해주면 된다.
// Error: connect ECONNREFUSED ::1:3306
const pool = mysql.createPool({
host: 'localhost',
user: process.env.DB_USER,
port: process.env.DB_PORT,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
// Unix socket file path 명시
const pool = mysql.createPool({
host: 'localhost',
user: process.env.DB_USER,
port: process.env.DB_PORT,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
socketPath: '/tmp/mysql.sock'
});
// TCP/IP 방법 사용
const pool = mysql.createPool({
host: '127.0.0.1',
user: process.env.DB_USER,
port: process.env.DB_PORT,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
});
socket path설정 방법은 공식문서를 참조하도록 하자!
https://dev.mysql.com/doc/refman/8.0/en/can-not-connect-to-server.html
'Computer Science > Database' 카테고리의 다른 글
[MySQL] 공식문서의 공간 데이터 파트 정리와 공간 인덱스 성능 테스트 기록 (0) | 2024.02.12 |
---|---|
[MySQL] Example database 다운로드, 설치 (0) | 2023.11.03 |