데이터베이스가 빠르게 증가하거나 보안상의 이유로 데이터 디렉토리를 다른 위치로 옮겨야 할 때가 있습니다. 이 글에서는 Ubuntu 16.04 환경에서 MySQL 데이터 디렉토리의 위치를 변경하고, 기존 데이터베이스를 새로운 위치로 이전하는 방법을 단계별로 알아보겠습니다.
사전 준비 사항
- sudo 권한을 가진 일반 사용자 계정이 있는 Ubuntu 서버
- 설치되어 정상 작동 중인 MySQL
- 데이터를 이전할 새로운 볼륨 또는 저장 공간 (본 가이드에서는
/mnt/data_vol/mysql을 새 위치로 사용하며, data_vol은 서버에 연결된 새 볼륨입니다)
현재 데이터 디렉토리 확인
작업을 시작하기 전에 먼저 현재 MySQL 데이터 디렉토리의 위치를 확인해야 합니다. MySQL에 root 계정으로 접속합니다.
$ mysql -u root -p Output: Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 472 Server version: 5.6.30-0ubuntu0.14.04.1 (Ubuntu) mysql>
root 비밀번호를 입력한 후, 아래 명령어로 현재 데이터 디렉토리 경로를 확인합니다.
mysql> select @@datadir; Output: +-----------------+ | @@datadir | +-----------------+ | /var/lib/mysql/ | +-----------------+ 1 row in set (0.00 sec)
출력 결과에서 확인할 수 있듯이, MySQL은 기본적으로 /var/lib/mysql을 데이터 디렉토리로 사용합니다.
MySQL 서비스 중지 및 데이터 이전
데이터 무결성을 보장하기 위해 디렉토리 변경 전에 반드시 MySQL 서비스를 중지해야 합니다. 아래 명령어로 MySQL을 중지합니다.
$ sudo systemctl stop mysql
systemctl stop 명령어는 별도의 출력 없이 실행됩니다. 서비스가 정상적으로 중지되었는지 상태를 확인합니다.
$ sudo systemctl status mysql
Output:
mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Mon 2016-09-12 13:57:43 IST; 1s ago
Process: 17669 ExecStartPost=/usr/share/mysql/mysql-systemd-start post (code=exited, status=0/SUCCESS)
Process: 17668 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)
Main PID: 17668 (code=exited, status=0/SUCCESS)MySQL이 완전히 중지된 것을 확인했다면, rsync를 사용하여 데이터를 새 위치로 복사합니다. -a 옵션은 파일 권한과 소유권 등 속성을 그대로 유지하며, -v 옵션은 진행 과정을 자세히 출력해 줍니다.
$ rsync -av /var/lib/mysql /mnt/data_vol/ OutPut: sending incremental file list mysql/ mysql/auto.cnf mysql/debian-5.7.flag mysql/ib_buffer_pool mysql/ib_logfile0 mysql/ib_logfile1 mysql/ibdata1 ... sent 199,384,083 bytes received 6,858 bytes 132,927,294.00 bytes/sec total size is 199,307,568 speedup is 1.00
rsync로 데이터 복사가 완료되면, 안전을 위해 기존 데이터 디렉토리는 백업으로 이름을 변경해 둡니다. 새 위치의 데이터가 정상 작동하는 것을 확인할 때까지 원본을 보관하는 것이 좋습니다.
$ sudo mv /var/lib/mysql /var/lib/mysql_backup
MySQL 설정 파일 수정
이제 MySQL 설정 파일에서 데이터 디렉토리 경로를 변경합니다. Ubuntu에서는 /etc/mysql/mysql.conf.d/mysqld.cnf 파일을 편집하면 됩니다.
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
파일 내에서 datadir 항목을 찾아 새로운 경로로 수정합니다.
[mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /mnt/data_vol/mysql/ tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking
AppArmor 별칭(Alias) 설정 변경
Ubuntu는 AppArmor 보안 모듈을 통해 MySQL이 특정 디렉토리에만 접근하도록 제한합니다. 따라서 새 데이터 디렉토리를 사용하려면 AppArmor 설정도 함께 수정해야 합니다. /etc/apparmor.d/tunables/alias 파일을 엽니다.
$ sudo vi /etc/apparmor.d/tunables/alias
파일 맨 아래에 다음 별칭 규칙을 추가합니다.
alias /var/lib/mysql/ -> /mnt/data_vol/mysql,
설정 파일 편집이 끝나면 AppArmor를 재시작하여 변경 사항을 적용합니다.
기본 데이터 디렉토리를 변경했으므로, MySQL 시작 스크립트가 정상 동작할 수 있도록 최소한의 디렉토리 구조를 생성해 줍니다.
$ sudo mkdir /var/lib/mysql/mysql -p
MySQL 재시작 및 결과 확인
모든 설정이 완료되었으니 MySQL 서비스를 다시 시작합니다.
$ sudo systemctl start mysql
서비스 상태를 확인하여 정상적으로 실행 중인지 점검합니다.
$ sudo systemctl status mysql
Output:
mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2016-09-12 14:17:27 IST; 23s ago
Main PID: 18480 (mysqld)
Tasks: 28 (limit: 512)
Memory: 137.3M
Sep 12 14:17:27 ubuntu-16 systemd[1]: Started MySQL Community Server.마지막으로, 데이터 디렉토리가 실제로 변경되었는지 다시 한번 확인합니다.
$ mysql -uroot -p Output: Enter password: Welcome to the MySQL monitor. mysql> select @@datadir; +----------------------+ | @@datadir | +----------------------+ | /mnt/data_vol/mysql/ | +----------------------+ 1 row in set (0.00 sec)
출력 결과가 새로운 경로(/mnt/data_vol/mysql/)로 표시되면 성공입니다. 데이터베이스가 새 위치에서 정상 작동하는 것을 충분히 확인한 후에는, 더 이상 필요 없는 기존 백업 디렉토리를 삭제하여 디스크 공간을 확보할 수 있습니다.
$ sudo rm -rf /var/lib/mysql_backup
이번 가이드에서는 Ubuntu 16.04에서 MySQL 데이터 디렉토리를 새로운 위치로 이전하는 전체 과정을 살펴보았습니다. 이 방법을 활용하면 용량이 큰 별도의 볼륨으로 데이터를 옮겨 저장 공간을 확장하거나, 보안 정책에 따라 데이터 위치를 조정할 수 있습니다.