MariaDB를 리포지토리(repo) 방식으로 설치하면 기본적으로 데이터 디렉토리가 /var/lib/mysql에 생성됩니다. 하지만 운영 환경에서는 다음과 같은 이유로 데이터 디렉토리를 다른 위치로 옮겨야 하는 경우가 있습니다.
왜 ??
- 스토리지 공간 부족
/var/lib는 보통 OS 디스크(루트 파티션)에 존재합니다. DB 데이터가 쌓이면 루트 디스크가 가득 차 시스템 전체에 장애를 유발할 수 있습니다.
별도의 데이터 디스크(/data 등)를 마운트해 두었다면 거기로 옮기는 것이 안전합니다. - 성능 최적화
DB 데이터는 I/O가 많습니다. 전용 SSD/NVMe 디스크에 /data를 마운트해 운영하면 성능을 크게 개선할 수 있습니다. - 백업 및 관리 편의성
애플리케이션 코드와 DB 데이터를 명확히 분리해두면 백업 정책이나 관리 정책을 적용하기가 수월합니다. - 고객사에서 옮기라고 하니까....
파티션도 넉넉하고 굳이 옮겨야될 필요가 없는 경우가 솔직히 대다수.. 하지만 고객이 옮기라면 옮겨야죠. -_ -;
주의해야 할 점
- 서비스 중단 필요
데이터 디렉토리를 옮기려면 MariaDB 서비스를 중단해야 합니다. (데이터 무결성 확보) - 퍼미션(권한) 유지
새 디렉토리에 옮긴 후에도 mysql:mysql 소유권이 유지되어야 합니다. 잘못되면 DB가 실행되지 않습니다. - SELinux / AppArmor
CentOS/RHEL 계열은 SELinux, Ubuntu 계열은 AppArmor가 적용될 수 있습니다. 새로운 디렉토리에 대한 보안 컨텍스트를 맞춰줘야 합니다. - 소켓(socket) 파일 경로
기본적으로 /var/lib/mysql/mysql.sock에 생성됩니다. 위치가 바뀌면 my.cnf와 PHP mysqli/pdo_mysql 설정에서 맞춰줘야 합니다. (놓치기 쉬운 포인트)
적용방법
MariaDB 서비스 중지
systemctl stop mariadb
기존 데이터 디렉토리 확인
ls -al /var/lib/mysql
새 디렉토리 생성 및 권한 부여
mkdir -p /data/mariadb
rsync -av /var/lib/mysql/ /data/mariadb/
chown -R mysql:mysql /data/mariadb
rsync를 쓰면 권한/심볼릭링크 등이 보존되어 안전합니다.
MariaDB 설정 수정 (/etc/my.cnf 또는 /etc/my.cnf.d/server.cnf 및 /etc/my.cnf.d/client.cnf)
[mysqld]
datadir=/data/mariadb
socket=/data/mariadb/mysql.sock
# 같은경로 client.cnf 파일
[client]
socket=/data/mariadb/mysql.sock
SELinux 적용 (CentOS/RockyLinux/RHEL 계열만 해당)
sudo semanage fcontext -a -t mysqld_db_t "/data/mariadb(/.*)?"
sudo restorecon -Rv /data/mariadb
기존 /var/lib/mysql 정리 (선택)
혹시라도 참조하는 곳이 있을 수 있으니 심볼릭 링크를 남기는 방법도 있습니다.
sudo mv /var/lib/mysql /var/lib/mysql.bak
sudo ln -s /data/mariadb /var/lib/mysql
서비스 재시작 및 확인
systemctl start mariadb
mysql -u root
정리
데이터 디렉토리 변경은 운영환경에서 흔히 필요한 작업입니다.
반드시 서비스 중단, 권한, SELinux, 소켓 파일 경로를 체크해야 합니다.
문제가 없으면 /var/lib/mysql.bak은 추후 삭제해도 됩니다.