서버를 구축하거나 데이터베이스를 배우는데 설치부터 막히셨나요? “Can’t connect to local server through socket” 에러로 고생하고 계신가요? 실제로 개발자 설문조사에 따르면 리눅스 초보자의 65%가 데이터베이스 설치와 초기 설정에서 가장 많은 어려움을 겪는다고 합니다. 이 글에서 MySQL과 MariaDB 설치부터 초기 설정, 문제 해결까지 완벽하게 정리해드립니다!
MySQL vs MariaDB 뭘 설치해야 할까?
MariaDB란?
MariaDB는 MySQL의 창시자 마이클 몬티 위데니우스가 MySQL이 오라클에 인수된 후, 오픈소스 정신을 지키기 위해 만든 MySQL의 포크(Fork) 버전입니다.
핵심 차이점 비교
| 구분 | MySQL | MariaDB |
|---|---|---|
| 개발사 | Oracle | MariaDB 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 기본 문법 학습
- 인덱스와 쿼리 최적화
- 레플리케이션 구성
- 백업 자동화
- 모니터링 도구 설정