Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags more
Archives
Today
Total
관리 메뉴

혼자서 앱 만드는 개발자 함께하는 AI 세상

MySQL 외부 접속 설정 가이드 본문

카테고리 없음

MySQL 외부 접속 설정 가이드

혼앱사 2025. 8. 2. 07:31
반응형

문제 상황

  • MySQL 3306 포트로 외부 접속이 안 되는 문제
  • ERROR 2003 (HY000): Can't connect to MySQL server 오류 발생

해결 과정

1. 초기 상태 확인

# MySQL 서비스 상태 확인
sudo systemctl status mysql

# 포트 리스닝 확인
sudo netstat -tlnp | grep 3306

문제점: netstat에서 3306 포트가 보이지 않음

2. MySQL 로그 확인

sudo tail -20 /var/log/mysql/error.log

발견된 문제: 로그에서 port: 0으로 표시됨 (정상적으로는 port: 3306이어야 함)

3. MySQL 설정 파일 확인

# 설정 파일에서 포트 관련 설정 확인
sudo grep -r "port" /etc/mysql/
sudo cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -E "(bind-address|port)"

설정 내용:

port          = 3306
bind-address  = 0.0.0.0
mysqlx-bind-address = 127.0.0.1

4. 실제 적용된 설정 확인

# MySQL이 실제로 읽고 있는 설정 확인
sudo mysqld --print-defaults

핵심 문제 발견: --skip-grant-tables 옵션이 활성화되어 있었음

/usr/sbin/mysqld would have been started with the following arguments:
--skip-grant-tables --user=mysql --port=3306 --bind-address=0.0.0.0 ...

해결 방법

1. skip-grant-tables 설정 제거

# skip-grant-tables 설정 위치 찾기
sudo grep -r "skip-grant-tables" /etc/mysql/

# 설정 파일 편집
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

수정 내용: skip-grant-tables 라인을 주석 처리하거나 제거

# skip-grant-tables  (주석 처리)

2. 올바른 MySQL 설정 확인

[mysqld]
port          = 3306
bind-address  = 0.0.0.0
user          = mysql

3. MySQL 재시작

sudo systemctl restart mysql

4. 설정 적용 확인

# 포트 리스닝 확인
sudo netstat -tlnp | grep 3306

# 로그 확인 (이제 port: 3306으로 표시되어야 함)
sudo tail -5 /var/log/mysql/error.log

5. 외부 접속 권한 설정

mysql -u root -p
-- cleandot 사용자의 현재 권한 확인
SELECT user, host FROM mysql.user WHERE user='cleandot';

-- 외부 접속 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'cleandot'@'%' IDENTIFIED BY 'iujh@adm';

-- 권한 적용
FLUSH PRIVILEGES;

-- 확인
SELECT user, host FROM mysql.user WHERE user='cleandot';

6. 방화벽 설정

# 3306 포트 열기
sudo ufw allow 3306

# UFW 상태 확인
sudo ufw status

외부 접속 테스트

# 외부에서 MySQL 접속 테스트
mysql -u cleandot -p -h sheetmeta.net
# 비밀번호: iujh@adm

문제 해결 포인트

  1. skip-grant-tables 옵션: 이 옵션이 활성화되어 있으면 MySQL이 정상적으로 네트워크 연결을 받지 않을 수 있음
  2. bind-address 설정: 127.0.0.1은 로컬에서만 접속 가능, 0.0.0.0은 모든 IP에서 접속 가능
  3. 방화벽 설정: 시스템 방화벽에서 3306 포트가 열려있어야 함
  4. 사용자 권한: MySQL 사용자에게 외부 접속 권한('user'@'%')이 있어야 함

최종 설정 요약

  • MySQL 설정: /etc/mysql/mysql.conf.d/mysqld.cnf
  • port = 3306 bind-address = 0.0.0.0 # skip-grant-tables 제거됨
  • 사용자 정보:
    • 사용자명: cleandot
    • 비밀번호: iujh@adm
    • 접속 권한: 모든 IP (%)
  • 방화벽: 3306 포트 개방

추가 팁

보안 강화

특정 IP에서만 접속을 허용하려면:

GRANT ALL PRIVILEGES ON *.* TO 'cleandot'@'특정IP주소' IDENTIFIED BY 'iujh@adm';
# 특정 IP에서만 방화벽 허용
sudo ufw allow from 특정IP주소 to any port 3306

문제 진단 명령어

# MySQL 프로세스 확인
sudo systemctl status mysql

# 포트 리스닝 확인
sudo netstat -tlnp | grep 3306
sudo ss -tlnp | grep 3306

# MySQL 설정 확인
sudo mysqld --print-defaults

# 로그 확인
sudo tail -f /var/log/mysql/error.log

작성일: 2025년 8월 2일
테스트 환경: Ubuntu Server, MySQL 8.0.42

728x90
반응형
Comments