제가 요즘 시놀로지 nas에 mariadb를 설치해서 데이터베이스 서버로 이용하려고 하는데, 패키지가 너무 옛날 거더군요. 그래서 해당 내용을 정리해서 기록해두려고 합니다.
목차
사전 준비
필수 요구사항
- Synology DSM 7.0 이상
- Container Manager 패키지 설치 (DSM 7.2 미만은 Docker)
- 최소 1GB RAM 여유 공간
- 최소 5GB 저장 공간
Container Manager 설치
- DSM 패키지 센터 열기
- “Container Manager” 검색 (구버전은 “Docker”)
- 설치 버튼 클릭
Container Manager UI로 설치
1단계: 이미지 다운로드
- Container Manager 실행
- 레지스트리 탭 클릭
- 검색창에
mariadb
입력 - mariadb 공식 이미지 선택
- 태그에서
12.0.2
선택 - 다운로드 클릭
2단계: 폴더 구조 생성
File Station에서 다음 폴더 생성:
/docker/mariadb/
├── data/ (DB 데이터 저장)
├── config/ (설정 파일 - 선택사항)
└── backup/ (백업 파일)
3단계: 컨테이너 생성
- 이미지 탭 →
mariadb:12.0.2
선택 → 실행 - 네트워크 설정
bridge
선택 (기본값)- 다음 클릭
- 일반 설정
- 컨테이너 이름:
mariadb-12
- 자동 재시작 활성화: ✓
- 컨테이너 이름:
- 포트 설정
- 로컬 포트:
3307
- 컨테이너 포트:
3306
- 프로토콜:
TCP
- 로컬 포트:
- 볼륨 설정
- 폴더 추가 클릭
/docker/mariadb/data
→/var/lib/mysql
/docker/mariadb/backup
→/backup
- 읽기/쓰기: ✓
- 환경 변수
MYSQL_ROOT_PASSWORD = YourSecurePassword123!
MYSQL_DATABASE = testdb
MYSQL_USER = dbuser
MYSQL_PASSWORD = dbUserPassword456!
MYSQL_CHARSET = utf8mb4
MYSQL_COLLATION = utf8mb4_unicode_ci
TZ = Asia/Seoul
- 실행 기능 (권한 문제시)
- 권한 있는 컨테이너 실행: ✓ (필요시)
- 완료 클릭
4단계: 권한 설정
SSH로 접속하여 권한 조정:
bash
# 폴더 권한 설정
sudo chmod 755 /volume1/docker/mariadb/data
sudo chmod 755 /volume1/docker/mariadb/backup
# 소유자 설정 (999는 MariaDB 내부 사용자)
sudo chown -R 999:999 /volume1/docker/mariadb/data
Docker Compose로 설치
1단계: docker-compose.yml 생성
/volume1/docker/mariadb/docker-compose.yml
파일 생성:
yaml
version: '3.8'
services:
mariadb:
image: mariadb:12.0.2
container_name: mariadb-12
restart: unless-stopped
ports:
- "3307:3306"
volumes:
- ./data:/var/lib/mysql
- ./backup:/backup
# config 폴더는 권한 문제 있을 시 제외
# - ./config:/etc/mysql/conf.d
environment:
# 필수 설정
MYSQL_ROOT_PASSWORD: YourSecurePassword123!
# 초기 데이터베이스 생성 (선택)
MYSQL_DATABASE: testdb
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbUserPassword456!
# 인코딩 설정
MYSQL_CHARSET: utf8mb4
MYSQL_COLLATION: utf8mb4_unicode_ci
# 시간대
TZ: Asia/Seoul
# 추가 설정 (선택사항)
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
- --max_connections=200
- --innodb_buffer_pool_size=1G
networks:
- mariadb-network
networks:
mariadb-network:
driver: bridge
2단계: 실행
bash
cd /volume1/docker/mariadb
docker-compose up -d
설치 확인
로그 확인
bash
# 실시간 로그 보기
docker logs -f mariadb-12
# 마지막 50줄 보기
docker logs --tail 50 mariadb-12
접속 테스트
bash
# Docker 내부에서 접속
docker exec -it mariadb-12 mysql -u root -p
# 외부에서 접속
mysql -h NAS_IP -P 3307 -u root -p
기본 확인 명령어
sql
-- 버전 확인
SELECT VERSION();
-- 데이터베이스 목록
SHOW DATABASES;
-- 인코딩 확인
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
-- 사용자 확인
SELECT user, host FROM mysql.user;
문제 해결
1. 권한 오류 (Permission Denied)
bash
# 권한 재설정
sudo chmod -R 755 /volume1/docker/mariadb
sudo chown -R 999:999 /volume1/docker/mariadb/data
# config 폴더 문제시 볼륨에서 제외
2. 포트 충돌
- 시놀로지 패키지 MariaDB가 3306 사용 중
- 해결: 3307 또는 다른 포트 사용
3. io_uring 경고
create_uring failed: falling back to libaio
- 정상 동작 (시놀로지 커널이 구버전)
- 무시해도 무방
4. 메모리 부족
my.cnf 설정 조정:
ini
[mysqld]
innodb_buffer_pool_size = 512M # 줄이기
max_connections = 100 # 줄이기
5. 컨테이너 자동 시작 안됨
bash
docker update --restart unless-stopped mariadb-12
백업 및 복원
백업
bash
# 전체 백업
docker exec mariadb-12 mysqldump -u root -p --all-databases > /volume1/docker/mariadb/backup/backup_$(date +%Y%m%d).sql
# 특정 DB 백업
docker exec mariadb-12 mysqldump -u root -p testdb > /volume1/docker/mariadb/backup/testdb_$(date +%Y%m%d).sql
복원
bash
# 백업 파일로 복원
docker exec -i mariadb-12 mysql -u root -p < /volume1/docker/mariadb/backup/backup_20240101.sql
유용한 설정
성능 최적화 (my.cnf)
/volume1/docker/mariadb/config/my.cnf
생성:
ini
[mysqld]
# 성능 설정
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
# 네트워크
max_connections = 200
max_allowed_packet = 64M
# 캐시
query_cache_size = 32M
query_cache_type = 1
# 로그
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
원격 접속 허용
sql
-- 모든 IP에서 root 접속 허용 (보안 주의)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
-- 특정 IP 대역만 허용
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;