> ## Content Index
> Fetch the complete content index at: https://appsworld.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# Ubuntu MySQL 설치 및 데이터베이스 설정 매뉴얼
- URL: https://appsworld.kr/ubuntu-mysql-seolci-mic-deiteobeiseu-seoljeong-maenyueol/
- Published: 2026-10-14T07:15:14.000Z
- Updated: 2026-10-14T07:15:14.000Z
- Author: Nullull

Ubuntu 서버에 MySQL을 설치하고 애플리케이션용 데이터베이스와 계정을 만드는 절차입니다. 원격 접속은 반드시 필요한 경우에만 사용하고, 허용 IP와 계정 권한을 최소화하십시오.

## 1\. MySQL 설치 및 서비스 확인

```bash
sudo apt update
sudo apt install -y mysql-server
sudo systemctl enable --now mysql
sudo systemctl status mysql --no-pager

```

MySQL 접속:

```bash
sudo mysql

```

버전 확인:

```sql
SELECT VERSION();

```

## 2\. 데이터베이스와 전용 계정 생성

아래 예시에서 `myapp`을 실제 애플리케이션 데이터베이스 및 계정 이름으로 바꾸고, 강력하고 고유한 비밀번호를 안전하게 설정합니다. 예시 비밀번호를 실제 환경에서 재사용하지 마십시오.

```sql
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를 지정합니다.

```sql
CREATE USER 'myapp'@'<애플리케이션_서버_IP>' IDENTIFIED BY '<강력한_고유_비밀번호>';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'<애플리케이션_서버_IP>';

```

MySQL의 계정은 `'사용자'@'호스트'` 조합으로 구분됩니다. `localhost` 계정과 원격 접속용 계정은 별개입니다. `'myapp'@'%'`는 임의의 호스트를 허용하므로 필요한 경우가 아니면 사용하지 마십시오.

확인 후 종료합니다.

```sql
SHOW DATABASES;
SELECT user, host FROM mysql.user;
EXIT;

```

`CREATE USER`와 `GRANT` 변경은 즉시 반영되므로 일반적으로 `FLUSH PRIVILEGES`를 실행할 필요가 없습니다.

## 3\. 원격 접속 설정 (필요한 경우에만)

원격 접속이 필요 없다면 이 절을 건너뛰고 MySQL을 로컬 전용으로 유지하십시오.

설정 파일을 편집합니다.

```bash
sudoedit /etc/mysql/mysql.conf.d/mysqld.cnf

```

기본값은 보통 로컬 접속만 허용하는 `bind-address = 127.0.0.1`입니다. 원격 접속을 위해 `0.0.0.0`으로 바꾸면 모든 네트워크 인터페이스에서 접속을 기다리므로, 네트워크 방화벽과 계정 호스트 제한을 함께 설정해야 합니다. 가능하면 사설 네트워크 인터페이스 IP에 바인딩하는 편이 안전합니다.

변경 예:

```text
bind-address = 0.0.0.0

```

MySQL X Protocol을 사용하지 않는다면 `mysqlx-bind-address`는 변경하지 않아도 됩니다. 설정 후 서비스를 재시작하고 상태를 확인합니다.

```bash
sudo systemctl restart mysql
sudo systemctl status mysql --no-pager
sudo ss -lntp | grep 3306

```

TCP 3306을 외부에 열어야 하는 경우에는 클라우드 방화벽 및 서버 방화벽에서 애플리케이션 서버나 관리자 IP만 허용하십시오. 예를 들어 `iptables`를 사용하는 환경에서는 `<허용할_IP>`를 실제 IP로 바꾸어 제한 규칙을 추가합니다.

```bash
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\. 접속 확인

서버 안에서 로컬 계정으로 접속하는 예:

```bash
mysql -u myapp -p myapp

```

다른 서버에서 접속하는 예:

```bash
mysql -h <데이터베이스_서버_IP> -P 3306 -u myapp -p myapp

```

비밀번호는 명령행 인수에 직접 입력하지 말고 `-p` 프롬프트에서 입력합니다.

접속이 실패하면 다음을 순서대로 확인합니다.

1. MySQL 서비스가 실행 중인지 확인합니다.
2. `bind-address`가 접속 경로에 맞는지 확인합니다.
3. MySQL 계정의 호스트가 클라이언트 주소와 일치하는지 확인합니다.
4. 서버 및 클라우드 방화벽에서 TCP 3306이 허용됐는지 확인합니다.
5. 인증 오류인지 네트워크 시간 초과인지 구분하고 MySQL 로그를 확인합니다.

```bash
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에서 현재 계정과 부여된 권한을 확인할 수 있습니다.

```sql
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'myapp'@'localhost';

```

애플리케이션 계정에는 필요한 데이터베이스의 권한만 부여하고, 애플리케이션에서 `root` 계정을 사용하지 마십시오.