MySQL/MariaDB 설치 완벽 가이드 – Ubuntu/Linux 2025

서버를 구축하거나 데이터베이스를 배우는데 설치부터 막히셨나요? “Can’t connect to local server through socket” 에러로 고생하고 계신가요? 실제로 개발자 설문조사에 따르면 리눅스 초보자의 65%가 데이터베이스 설치와 초기 설정에서 가장 많은 어려움을 겪는다고 합니다. 이 글에서 MySQL과 MariaDB 설치부터 초기 설정, 문제 해결까지 완벽하게 정리해드립니다!


Table of Contents

MySQL vs MariaDB 뭘 설치해야 할까?

MariaDB란?

MariaDB는 MySQL의 창시자 마이클 몬티 위데니우스가 MySQL이 오라클에 인수된 후, 오픈소스 정신을 지키기 위해 만든 MySQL의 포크(Fork) 버전입니다.

핵심 차이점 비교

구분MySQLMariaDB
개발사OracleMariaDB Foundation
라이선스GPL + 상용완전 GPL
성능우수더 우수 (최적화)
호환성MySQL과 99% 호환
스토리지 엔진제한적다양함 (Aria, ColumnStore 등)
커뮤니티상업적오픈소스 중심
가격상용 버전 유료완전 무료

어떤 것을 선택해야 할까?

MariaDB 추천:

  • 개인 프로젝트나 스타트업
  • 오픈소스를 선호하는 경우
  • 더 나은 성능이 필요한 경우
  • 라이선스 비용이 부담되는 경우

MySQL 추천:

  • MySQL 특화 기능이 필요한 경우
  • Oracle 생태계와 통합이 필요한 경우
  • 레거시 시스템 유지보수

결론: 대부분의 경우 MariaDB를 추천합니다. 더 빠르고, 완전 무료이며, MySQL과 거의 동일하게 사용할 수 있습니다.


Ubuntu/Debian에서 MariaDB 설치하기

1단계: 시스템 업데이트

가장 먼저 패키지 목록을 최신화합니다.

sudo apt update
sudo apt upgrade -y

왜 필요한가?

  • 최신 보안 패치 적용
  • 의존성 패키지 충돌 방지
  • 설치 오류 최소화

2단계: MariaDB 서버와 클라이언트 설치

# MariaDB 서버 설치
sudo apt-get install mariadb-server -y

# MariaDB 클라이언트 설치
sudo apt-get install mariadb-client -y

# 또는 한 번에 설치
sudo apt-get install mariadb-server mariadb-client -y

각 패키지의 역할:

  • mariadb-server: 데이터베이스 서버 프로그램 (mysqld)
  • mariadb-client: 데이터베이스 접속 클라이언트 (mysql 명령어)

3단계: MariaDB 서비스 시작

중요! 설치 직후에는 서비스가 자동으로 시작되지 않을 수 있습니다.

# 서비스 시작
sudo systemctl start mariadb

# 또는
sudo service mariadb start

# 부팅 시 자동 시작 설정
sudo systemctl enable mariadb

# 서비스 상태 확인
sudo systemctl status mariadb

정상 상태 출력 예시:

● mariadb.service - MariaDB 10.6.12 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2025-01-02 10:30:45 KST; 5min ago

Active: active (running) 이 보이면 정상입니다!


“Can’t connect to socket” 에러 해결하기

에러 메시지

ERROR 2002 (HY000): Can't connect to local server through socket '/run/mysqld/mysqld.sock' (2)

원인과 해결

이 에러는 MariaDB 서비스가 실행되지 않았을 때 발생합니다.

해결 방법 1: 서비스 시작

# systemctl 사용 (권장)
sudo systemctl start mariadb

# service 명령어 사용
sudo service mariadb start

# 상태 확인
sudo systemctl status mariadb

해결 방법 2: 소켓 파일 확인

# 소켓 파일 위치 확인
sudo find / -name mysqld.sock 2>/dev/null

# 또는
ls -la /var/run/mysqld/mysqld.sock

해결 방법 3: 권한 문제 해결

# mysqld 디렉토리 생성 (없는 경우)
sudo mkdir -p /var/run/mysqld

# 소유권 설정
sudo chown mysql:mysql /var/run/mysqld

# 서비스 재시작
sudo systemctl restart mariadb

해결 방법 4: 설정 파일 확인

# MariaDB 설정 파일 확인
sudo cat /etc/mysql/mariadb.conf.d/50-server.cnf

# socket 경로 확인 (보통 [mysqld] 섹션에 있음)
# socket = /var/run/mysqld/mysqld.sock


MariaDB 초기 보안 설정

설치 후 반드시 보안 설정을 해야 합니다!

mysql_secure_installation 실행

sudo mysql_secure_installation

단계별 설정 가이드

1. root 비밀번호 설정

Enter current password for root (enter for none): [엔터]
Switch to unix_socket authentication [Y/n]: n
Change the root password? [Y/n]: Y
New password: [강력한 비밀번호 입력]
Re-enter new password: [비밀번호 재입력]

2. 익명 사용자 제거

Remove anonymous users? [Y/n]: Y

익명 사용자는 보안 위험이 있으므로 제거합니다.

3. 원격 root 로그인 비활성화

Disallow root login remotely? [Y/n]: Y

root는 localhost에서만 접속 가능하게 합니다.

4. 테스트 데이터베이스 제거

Remove test database and access to it? [Y/n]: Y

5. 권한 테이블 리로드

Reload privilege tables now? [Y/n]: Y


MariaDB 접속하기

기본 접속 방법

# root로 접속 (비밀번호 입력)
sudo mysql -u root -p

# 또는 sudo 권한으로 바로 접속
sudo mysql

프롬프트 변경:

mysql>

또는

MariaDB [(none)]>

이 프롬프트가 나오면 성공!


접속 확인 명령어

-- 버전 확인
SELECT VERSION();

-- 현재 사용자 확인
SELECT USER();

-- 데이터베이스 목록 보기
SHOW DATABASES;

-- 상태 확인
STATUS;


설정 확인 및 변수 조회

시스템 변수 확인

-- c로 시작하는 모든 변수 보기
SHOW VARIABLES LIKE 'c%';

-- 특정 변수 확인
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'port';
SHOW VARIABLES LIKE 'datadir';

-- 모든 변수 보기 (매우 많음 주의!)
SHOW VARIABLES;

주요 변수 설명:

변수명의미기본값
character_set_server서버 문자셋utf8mb4
collation_server정렬 규칙utf8mb4_general_ci
port포트 번호3306
datadir데이터 저장 경로/var/lib/mysql
max_connections최대 연결 수151


실행 중인 프로세스 확인

-- 현재 실행 중인 쿼리 보기
SHOW PROCESSLIST;

-- 또는 더 자세한 정보
SHOW FULL PROCESSLIST;

사용자 생성 및 권한 부여

새로운 사용자 생성

-- 사용자 생성 (모든 호스트에서 접속 가능)
CREATE USER 'king'@'%' IDENTIFIED BY '123123';

-- 특정 IP에서만 접속 가능
CREATE USER 'king'@'192.168.1.100' IDENTIFIED BY '123123';

-- localhost에서만 접속 가능
CREATE USER 'king'@'localhost' IDENTIFIED BY '123123';

호스트 지정자 의미:

  • '%': 모든 호스트에서 접속 가능 (보안 주의!)
  • 'localhost': 같은 서버에서만 접속
  • '192.168.1.%': 192.168.1.x 대역에서 접속
  • '192.168.1.100': 특정 IP에서만 접속

권한 부여

-- 모든 권한 부여 (관리자 수준)
GRANT ALL PRIVILEGES ON *.* TO 'king'@'%' IDENTIFIED BY '123123';

-- 특정 데이터베이스에만 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'king'@'%';

-- 읽기 전용 권한
GRANT SELECT ON mydb.* TO 'king'@'%';

-- 읽기, 쓰기 권한
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'king'@'%';

-- 권한 적용
FLUSH PRIVILEGES;

권한 종류:

  • ALL PRIVILEGES: 모든 권한
  • SELECT: 조회 권한
  • INSERT: 삽입 권한
  • UPDATE: 수정 권한
  • DELETE: 삭제 권한
  • CREATE: 테이블 생성 권한
  • DROP: 테이블 삭제 권한
  • ALTER: 테이블 구조 변경 권한
  • INDEX: 인덱스 생성/삭제 권한

사용자 확인

-- mysql 데이터베이스 사용
USE mysql;

-- 사용자 목록 확인
SELECT host, user FROM user;

-- 더 자세한 정보
SELECT host, user, authentication_string FROM user;

-- 특정 사용자 권한 확인
SHOW GRANTS FOR 'king'@'%';

출력 예시:

+---------------+------+
| host          | user |
+---------------+------+
| %             | king |
| localhost     | root |
+---------------+------+


외부 접속 허용하기

기본적으로 MariaDB는 localhost에서만 접속 가능합니다. 외부 접속을 허용하려면:

1단계: 설정 파일 수정

# 설정 파일 열기
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

# 또는 MySQL인 경우
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

2단계: bind-address 변경

변경 전:

bind-address = 127.0.0.1

변경 후:

bind-address = 0.0.0.0

또는 특정 IP만 허용:

bind-address = 192.168.1.10

주의: 0.0.0.0은 모든 네트워크 인터페이스에서 접속을 허용합니다. 보안에 주의하세요!

3단계: 방화벽 설정

# UFW 사용 시
sudo ufw allow 3306/tcp

# 특정 IP만 허용
sudo ufw allow from 192.168.1.100 to any port 3306

# firewalld 사용 시 (CentOS/Rocky)
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

4단계: MariaDB 재시작

sudo systemctl restart mariadb

5단계: 외부에서 접속 테스트

# 원격 서버에서
mysql -h [서버IP] -u king -p

# 예시
mysql -h 192.168.1.10 -u king -p123123


데이터베이스 기본 작업

데이터베이스 생성

-- 데이터베이스 생성
CREATE DATABASE mydb;

-- 문자셋 지정하여 생성 (추천)
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 데이터베이스 목록 확인
SHOW DATABASES;

-- 데이터베이스 사용
USE mydb;

-- 현재 사용 중인 데이터베이스 확인
SELECT DATABASE();

테이블 생성

-- 간단한 테이블 생성
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 테이블 목록 확인
SHOW TABLES;

-- 테이블 구조 확인
DESCRIBE users;
-- 또는
SHOW CREATE TABLE users;

기본 CRUD 작업

-- 데이터 삽입
INSERT INTO users (username, email) VALUES ('홍길동', 'hong@email.com');
INSERT INTO users (username, email) VALUES ('김철수', 'kim@email.com');

-- 데이터 조회
SELECT * FROM users;
SELECT username, email FROM users WHERE id = 1;

-- 데이터 수정
UPDATE users SET email = 'newemail@email.com' WHERE id = 1;

-- 데이터 삭제
DELETE FROM users WHERE id = 2;

-- 테이블 전체 데이터 삭제 (구조는 유지)
TRUNCATE TABLE users;

-- 테이블 삭제
DROP TABLE users;

-- 데이터베이스 삭제
DROP DATABASE mydb;


유용한 MariaDB 명령어 모음

서비스 관리

# 시작
sudo systemctl start mariadb

# 중지
sudo systemctl stop mariadb

# 재시작
sudo systemctl restart mariadb

# 상태 확인
sudo systemctl status mariadb

# 부팅 시 자동 시작 활성화
sudo systemctl enable mariadb

# 부팅 시 자동 시작 비활성화
sudo systemctl disable mariadb

# 설정 리로드 (재시작 없이)
sudo systemctl reload mariadb


SQL 유용한 명령어

-- 도움말
HELP;

-- 나가기
EXIT;
-- 또는
QUIT;
-- 또는
\\q

-- SQL 파일 실행
SOURCE /path/to/file.sql;

-- 쿼리 결과를 파일로 저장
SELECT * FROM users INTO OUTFILE '/tmp/users.txt';

-- 테이블 백업
CREATE TABLE users_backup AS SELECT * FROM users;

-- 현재 시간
SELECT NOW();

-- 데이터베이스 크기 확인
SELECT
    table_schema AS 'Database',
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;


성능 및 모니터링

-- 현재 연결 수
SHOW STATUS LIKE 'Threads_connected';

-- 최대 연결 수
SHOW VARIABLES LIKE 'max_connections';

-- 실행 중인 쿼리
SHOW PROCESSLIST;

-- 느린 쿼리 찾기
SHOW VARIABLES LIKE 'slow_query_log%';

-- 테이블 상태
SHOW TABLE STATUS FROM mydb;

-- 인덱스 정보
SHOW INDEX FROM users;


백업 및 복원

데이터베이스 백업

# 단일 데이터베이스 백업
mysqldump -u root -p mydb > mydb_backup.sql

# 모든 데이터베이스 백업
mysqldump -u root -p --all-databases > all_databases_backup.sql

# 특정 테이블만 백업
mysqldump -u root -p mydb users > users_backup.sql

# 압축하여 백업
mysqldump -u root -p mydb | gzip > mydb_backup.sql.gz

# 구조만 백업 (데이터 제외)
mysqldump -u root -p --no-data mydb > mydb_structure.sql

# 데이터만 백업 (구조 제외)
mysqldump -u root -p --no-create-info mydb > mydb_data.sql

데이터베이스 복원

# 데이터베이스 복원
mysql -u root -p mydb < mydb_backup.sql

# 압축 파일 복원
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb

# 새 데이터베이스에 복원
mysql -u root -p -e "CREATE DATABASE newdb;"
mysql -u root -p newdb < mydb_backup.sql

자동 백업 스크립트

# backup.sh 파일 생성
#!/bin/bash

# 설정
DB_USER="root"
DB_PASS="your_password"
DB_NAME="mydb"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE.sql.gz"

# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR

# 백업 실행
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $FILENAME

# 7일 이상 된 백업 삭제
find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete

echo "Backup completed: $FILENAME"

실행 권한 부여 및 cron 등록:

# 실행 권한
chmod +x backup.sh

# cron 편집
crontab -e

# 매일 새벽 2시에 백업
0 2 * * * /path/to/backup.sh


문제 해결 (Troubleshooting)

문제 1: 비밀번호를 잊어버렸을 때

# 1. MariaDB 중지
sudo systemctl stop mariadb

# 2. 안전 모드로 시작
sudo mysqld_safe --skip-grant-tables &

# 3. 비밀번호 없이 접속
mysql -u root

# 4. 비밀번호 변경
USE mysql;
UPDATE user SET authentication_string=PASSWORD('new_password') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;

# 5. MariaDB 정상 재시작
sudo systemctl stop mariadb
sudo systemctl start mariadb

문제 2: “Access denied” 에러

ERROR 1045 (28000): Access denied for user 'root'@'localhost'

해결:

# sudo로 접속 시도
sudo mysql -u root

# 또는 소켓 인증 사용
sudo mysql

# 비밀번호 인증으로 변경
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;

문제 3: 포트가 이미 사용 중

# 3306 포트 사용 확인
sudo netstat -tulpn | grep 3306
# 또는
sudo lsof -i :3306

# 프로세스 종료
sudo kill -9 [PID]

# MariaDB 재시작
sudo systemctl restart mariadb

문제 4: 디스크 공간 부족

# 디스크 사용량 확인
df -h

# MariaDB 데이터 디렉토리 크기
sudo du -sh /var/lib/mysql/

# 로그 파일 정리
sudo rm /var/lib/mysql/ib_logfile*
sudo systemctl restart mariadb

# 바이너리 로그 정리
mysql -u root -p -e "PURGE BINARY LOGS BEFORE NOW();"

문제 5: 너무 많은 연결

ERROR 1040 (HY000): Too many connections

해결:

-- 최대 연결 수 확인
SHOW VARIABLES LIKE 'max_connections';

-- 최대 연결 수 증가 (임시)
SET GLOBAL max_connections = 500;

-- 영구 설정: /etc/mysql/mariadb.conf.d/50-server.cnf
-- [mysqld]
-- max_connections = 500


성능 최적화 팁

설정 파일 최적화

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

추천 설정:

[mysqld]
# 기본 설정
max_connections = 200
connect_timeout = 10
wait_timeout = 600

# 버퍼 크기 (메모리에 따라 조정)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
key_buffer_size = 256M

# 쿼리 캐시
query_cache_type = 1
query_cache_size = 64M

# 로그 설정
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 문자셋
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

인덱스 최적화

-- 인덱스 생성
CREATE INDEX idx_username ON users(username);

-- 복합 인덱스
CREATE INDEX idx_user_email ON users(username, email);

-- 전문 검색 인덱스
CREATE FULLTEXT INDEX idx_content ON articles(content);

-- 인덱스 삭제
DROP INDEX idx_username ON users;

-- 인덱스 확인
SHOW INDEX FROM users;

쿼리 최적화

-- 실행 계획 확인
EXPLAIN SELECT * FROM users WHERE username = 'hong';

-- 쿼리 캐시 확인
SHOW STATUS LIKE 'Qcache%';

-- 테이블 최적화
OPTIMIZE TABLE users;

-- 테이블 분석
ANALYZE TABLE users;


보안 체크리스트

필수 보안 조치

  • [ ] root 비밀번호를 강력하게 설정
  • [ ] 불필요한 사용자 삭제 (anonymous, test)
  • [ ] 원격 root 로그인 비활성화
  • [ ] 방화벽으로 3306 포트 제한
  • [ ] 정기적인 백업 수행
  • [ ] 최신 보안 패치 적용
  • [ ] SSL/TLS 연결 사용 (프로덕션 환경)
  • [ ] 로그 모니터링 설정

보안 설정 확인:

-- 사용자 확인
SELECT host, user FROM mysql.user;

-- 권한 확인
SHOW GRANTS FOR 'user'@'host';

-- 비밀번호 정책 확인
SHOW VARIABLES LIKE 'validate_password%';

-- SSL 설정 확인
SHOW VARIABLES LIKE 'have_ssl';


자주 묻는 질문 (FAQ)

Q1. MySQL과 MariaDB를 함께 설치할 수 있나요?

A: 권장하지 않습니다. 두 개를 함께 설치하면 포트 충돌, 설정 파일 충돌 등의 문제가 발생할 수 있습니다. 하나만 선택하여 사용하세요.

Q2. 설치 후 한글이 깨집니다.

A: 문자셋을 UTF-8로 설정하세요:

-- 현재 문자셋 확인
SHOW VARIABLES LIKE 'character_set%';

-- 데이터베이스 문자셋 변경
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 테이블 문자셋 변경
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Q3. 비밀번호 없이 root로 접속되는데 안전한가요?

A: Ubuntu의 MariaDB는 기본적으로 unix_socket 인증을 사용합니다. sudo 권한이 있는 사용자만 접속 가능하므로 안전합니다. 하지만 원격 접속을 위해서는 비밀번호를 설정해야 합니다.

Q4. MariaDB와 MySQL 명령어가 다른가요?

A: 거의 동일합니다. mysql 명령어로 MariaDB에도 접속할 수 있으며, SQL 문법도 99% 호환됩니다.

Q5. 설치 후 서비스가 자동 시작되지 않습니다.

A: 다음 명령어로 자동 시작을 활성화하세요:

sudo systemctl enable mariadb
sudo systemctl start mariadb

마치며

MariaDB 설치와 초기 설정, 어렵지 않으시죠? 이 가이드를 따라하면 누구나 쉽게 데이터베이스 서버를 구축할 수 있습니다.

다음 단계

  • SQL 기본 문법 학습
  • 인덱스와 쿼리 최적화
  • 레플리케이션 구성
  • 백업 자동화
  • 모니터링 도구 설정

관련 유용한 자료

댓글 남기기