Ubuntu 서버에 MySQL을 설치하고 애플리케이션용 데이터베이스와 계정을 만드는 절차입니다. 원격 접속은 반드시 필요한 경우에만 사용하고, 허용 IP와 계정 권한을 최소화하십시오.
1. MySQL 설치 및 서비스 확인
sudo apt update
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo systemctl status mysql --no-pager
MySQL 접속:
sudo mysql
버전 확인:
SELECT VERSION();
2. 데이터베이스와 전용 계정 생성
아래 예시에서 myapp을 실제 애플리케이션 데이터베이스 및 계정 이름으로 바꾸고, 강력하고 고유한 비밀번호를 안전하게 설정합니다. 예시 비밀번호를 실제 환경에서 재사용하지 마십시오.
CREATE DATABASE myapp
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'myapp'@'localhost' IDENTIFIED BY '<강력한_고유_비밀번호>';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
애플리케이션이 다른 서버에서 접속해야 한다면 % 대신 접속을 허용할 애플리케이션 서버의 IP를 지정합니다.
CREATE USER 'myapp'@'<애플리케이션_서버_IP>' IDENTIFIED BY '<강력한_고유_비밀번호>';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'<애플리케이션_서버_IP>';
MySQL의 계정은 '사용자'@'호스트' 조합으로 구분됩니다. localhost 계정과 원격 접속용 계정은 별개입니다. 'myapp'@'%'는 임의의 호스트를 허용하므로 필요한 경우가 아니면 사용하지 마십시오.
확인 후 종료합니다.
SHOW DATABASES;
SELECT user, host FROM mysql.user;
EXIT;
CREATE USER와 GRANT 변경은 즉시 반영되므로 일반적으로 FLUSH PRIVILEGES를 실행할 필요가 없습니다.
3. 원격 접속 설정 (필요한 경우에만)
원격 접속이 필요 없다면 이 절을 건너뛰고 MySQL을 로컬 전용으로 유지하십시오.
설정 파일을 편집합니다.
sudoedit /etc/mysql/mysql.conf.d/mysqld.cnf
기본값은 보통 로컬 접속만 허용하는 bind-address = 127.0.0.1입니다. 원격 접속을 위해 0.0.0.0으로 바꾸면 모든 네트워크 인터페이스에서 접속을 기다리므로, 네트워크 방화벽과 계정 호스트 제한을 함께 설정해야 합니다. 가능하면 사설 네트워크 인터페이스 IP에 바인딩하는 편이 안전합니다.
변경 예:
bind-address = 0.0.0.0
MySQL X Protocol을 사용하지 않는다면 mysqlx-bind-address는 변경하지 않아도 됩니다. 설정 후 서비스를 재시작하고 상태를 확인합니다.
sudo systemctl restart mysql
sudo systemctl status mysql --no-pager
sudo ss -lntp | grep 3306
TCP 3306을 외부에 열어야 하는 경우에는 클라우드 방화벽 및 서버 방화벽에서 애플리케이션 서버나 관리자 IP만 허용하십시오. 예를 들어 iptables를 사용하는 환경에서는 <허용할_IP>를 실제 IP로 바꾸어 제한 규칙을 추가합니다.
sudo iptables -I INPUT 5 -p tcp -s <허용할_IP> --dport 3306 -j ACCEPT
sudo iptables -L INPUT -v -n --line-numbers
sudo netfilter-persistent save
기존 방화벽 정책과 규칙 순서를 먼저 확인하십시오. 전체 인터넷에 3306 포트를 공개하거나, 데이터베이스 계정을 % 호스트로 열어 두는 구성은 피하십시오.
4. 접속 확인
서버 안에서 로컬 계정으로 접속하는 예:
mysql -u myapp -p myapp
다른 서버에서 접속하는 예:
mysql -h <데이터베이스_서버_IP> -P 3306 -u myapp -p myapp
비밀번호는 명령행 인수에 직접 입력하지 말고 -p 프롬프트에서 입력합니다.
접속이 실패하면 다음을 순서대로 확인합니다.
- MySQL 서비스가 실행 중인지 확인합니다.
bind-address가 접속 경로에 맞는지 확인합니다.- MySQL 계정의 호스트가 클라이언트 주소와 일치하는지 확인합니다.
- 서버 및 클라우드 방화벽에서 TCP 3306이 허용됐는지 확인합니다.
- 인증 오류인지 네트워크 시간 초과인지 구분하고 MySQL 로그를 확인합니다.
sudo journalctl -u mysql -n 100 --no-pager
5. DBeaver 설정 참고
Public Key Retrieval is not allowed 오류
DBeaver에서 해당 연결을 편집하고 Driver properties에서 allowPublicKeyRetrieval을 true로 설정하면 연결될 수 있습니다. 이는 연결 보안 설정에 영향을 주므로 신뢰하는 네트워크에서만 사용하고, 가능하면 TLS를 포함한 안전한 연결 구성을 우선하십시오.
문자 인코딩 및 시간대
DBeaver의 Edit Connection → Driver properties에서 필요한 속성을 확인합니다.
| 속성 | 값 예시 | 용도 |
|---|---|---|
characterEncoding |
UTF-8 |
JDBC 문자 인코딩 |
useUnicode |
true |
유니코드 사용 |
serverTimezone |
Asia/Seoul 또는 UTC |
시간대 지정 |
MySQL 서버와 JDBC 드라이버 버전에 따라 속성 지원이 다를 수 있습니다. characterEncoding에 utf8mb4를 넣으면 드라이버에 따라 오류가 날 수 있으므로 UTF-8을 사용하고, 데이터베이스·테이블의 문자셋은 utf8mb4로 설정합니다.
6. 계정 및 권한 확인
MySQL에서 현재 계정과 부여된 권한을 확인할 수 있습니다.
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'myapp'@'localhost';
애플리케이션 계정에는 필요한 데이터베이스의 권한만 부여하고, 애플리케이션에서 root 계정을 사용하지 마십시오.