Synology NAS 기반 MySQL 데이터베이스 마이그레이션 전략

환경 구축 배경 및 목표

기존 로컬 워크스테이션에 보관되어 있던 대용량 금융 관련 데이터셋의 저장 공간 문제가 발생합니다. 물리적 하드웨어 한계로 인해 디스크 용량이 부족해짐에 따라, 네트워크 어태치드 스토리지(NAS) 인프라를 확장하여 해결책을 모색하게 됩니다. 본 문서에서는 업그레이드된 Synology NAS 모델에서 Docker 컨테이너 관리자를 활용하여 MySQL 인스턴스를 구동하고, 로컬 서버의 기존 데이터를 원격으로 이관하는 구체적인 절차를 다룹니다.

사전 준비 사항

  • 소스 환경: 로컬 머신에서 실행 중인 MySQL 서버 및 이에 포함된 소스 데이터
  • 타겟 환경: Synology NAS 에 설치 완료된 MySQL 서비스 (Container Manager 필수)
  • 연결성: 라우팅 가능한 네트워크 환경을 통해 원격 DB 접속 가능 확인
  • 접근 제어: NAS 호스트의 SSH 데몬 활성화 (파일 이동 시 필요)

NAS 내부에서의 MySQL 배포는 별도의 가이드를 참조하되, 본 과정에서는 이미 설치된 상태를 전제로 합니다.

방안 1 : 데이터 스트리밍 방식 (파이프)

가장 직관적인 방법은 데이터 덤프 생성 과정을 거쳐 바로 수신 측 데이터베이스로 연결을 맺고 전송하는 것입니다. 로컬 터미널에서 명령어를 결합하여 구현합니다.

# 소스 에서 덤프 한 뒤 파이프를 통해 타겟 으로 직접 주입
mysqldump -u [관리자 아이디] -p[비밀번호] [소스_데이터베이스] [테이블 이름] | mysql -u [관리자 아이디] -p[비밀번호] -h [NAS_IP_주소] [대상_데이터베이스]

예시를 들어 설명하면, 로컬의 `finance_db` 내에 있는 `transaction_log` 테이블을 내장 IP 가 `10.0.10.200` 인 NAS 서버의 동일 명칭 데이터베이스로 보내는 경우입니다.

mysqldump -u root -pSecurePass123 finance_db transaction_log | mysql -u root -pSecurePass123 -h 10.0.10.200 finance_db

구현의 난이도는 낮지만 대규모 데이터 처리 시 병목 현상이 발생할 수 있습니다. 행 수가 수천만 단위일 때나 테이블 크기가 기가바이트 수준이면 네트워크 오버헤드와 프로토콜 오버헤드로 인해 소요 시간이 비선형적으로 증가할 수 있습니다.

방안 2 : 파일 변환 및 컨테이너 내보내기

대용량 트랜잭션 시 성능 저하를 최소화하기 위해 중간 저장 매체를 경유하는 방식을 활용할 수 있습니다. 먼저 데이터를 SQL 스크립트 파일로 추출한 후, NAS 호스트 시스템 상에 파일을 옮겨 다시 로딩하는 단계로 나뉩니다.

1 단계 : 로컬 데이터 덤프 생성

원본 데이터를 SQL 형식의 단일 파일로 추출합니다.

mysqldump -u root -p finance_db transaction_log > backup_export.sql

2 단계 : NAS 호스트로 파일 전달 및 SSH 연결

생성된 스크립트는 SMB 또는 기타 파일 공유 프로토콜을 통해 NAS 의 특정 디렉토리로 복사해야 합니다. 이후 터미널을 통해 SSH 세션을 초기화합니다.

# 포트 번호와 사용자 계정 정보가 필요합니다
ssh root@10.0.10.200 -p 22

NAS 쉘에 진입하면 복사된 `backup_export.sql` 파일을 확인할 수 있으나, MySQL 엔진은 Docker 컨테이너 내부에 격리되어 있으므로 해당 파일을 컨테이너 파일시스템으로 복사해야 접근이 가능합니다.

3 단계 : Docker 컨테이너 내부로 파일 주입

`docker cp` 명령을 사용하여 NAS 메인 운영체제의 경로와 컨테이너 내부 경로를 매핑합니다. 권한 상승이 필요한 작업입니다.

# 소스 경로와 컨테이너 ID(또는 이름) 지정
sudo docker cp /volume1/home/admin/backup_export.sql db-container-name:/tmp/

4 단계 : 컨테이너 내부에서 데이터 로딩

컨테이너의 인터랙티브 셸에 진입하여 파일 존재 여부를 검증하고, MySQL 클라이언트를 사용하여 스크립트를 실행시킵니다.

# 컨테이너 인터널 진입
sudo docker exec -ti db-container-name /bin/bash

# MySQL 커넥션 및 임포트 수행
mysql -u root -p finance_db < /tmp/backup_export.sql

이 방법은 스트리밍보다 파일 시스템의 안정성을 활용할 수 있지만, 결국 네트워크 전송 속도와 디스크 입출력에 의존하므로 대용량 데이터인 경우 전체 소요 시간이 크게 단축되는 효과는 제한적일 수 있습니다. 다만, 중단과 재개 처리가 상대적으로 용이하며 디버깅 로그를 남기기 좋은 구조를 제공합니다.

태그: MySQL Synology docker DatabaseMigration SSHTerminal

6월 3일 20:13에 게시됨