PostgreSQL / MySQL 도커 컨테이너 데이터베이스 백업 및 복원 방법
도커(Docker) 컨테이너 환경에서 데이터베이스(DB)인 PostgreSQL이나 MySQL을 운용할 때 가장 중요한 관리 요소 중 하나는 데이터의 안전한 백업(Backup)과 복원(Restore)입니다. 도커 컨테이너는 본래 휘발성(Stateless) 특성을 지니고 있으므로, 지속성 저장소(Persistent Storage)인 도커 볼륨(Volume)이나 바인드 마운트(Bind Mount)를 세팅해 두었더라도 시스템 오류, 랜섬웨어 감염, 또는 오작동에 대비한 정기적인 덤프(Dump) 백업은 필수적입니다.
특히 docker exec 명령어를 활용하면 컨테이너 내부로 직접 들어가지 않고도 호스트 시스템 터미널에서 데이터베이스의 전체 상태를 SQL 파일 형태로 손쉽게 추출하고 원상복구할 수 있습니다.
본 글에서는 대표적인 관계형 데이터베이스인 PostgreSQL과 MySQL(MariaDB 포함) 환경 각각에서 도커 컨테이너 내부 데이터베이스를 백업하고 복원하는 실전 명령어 사용법과 자동화 팁까지 상세히 알아보겠습니다.
1. PostgreSQL 도커 컨테이너 데이터베이스 백업 및 복원 방법
PostgreSQL은 데이터 백업을 위해 pg_dump 유틸리티를 기본 제공하며, 도커 환경에서는 docker exec 명령어를 결합하여 호스트 PC에 안전하게 백업 파일(.sql)을 생성할 수 있습니다.
[이미지: 호스트 리눅스 터미널에서 docker exec 명령어를 실행해 PostgreSQL 컨테이너 내부 데이터를 pg_dump로 추출하는 화면]
PostgreSQL의 실전 백업 및 복원 실행 절차는 다음과 같습니다.
PostgreSQL 데이터베이스 백업 (Export)
- 단일 DB 덤프 백업: 컨테이너 내부의 특정 DB를 SQL 파일로 내보냅니다.
- 명령어: docker exec -t [컨테이너_이름] pg_dump -U [DB_사용자명] [DB_이름] > [백업파일_경로.sql]
- 실행 예시: docker exec -t my-postgres pg_dump -U postgres mydatabase > ./postgres_backup.sql
- 압축 형태 덤프 백업 (대용량 권장): gzip을 이용해 백업 파일 용량을 크게 줄여 저장합니다.
- 명령어: docker exec -t my-postgres pg_dump -U postgres mydatabase | gzip > ./postgres_backup.sql.gz
PostgreSQL 데이터베이스 복원 (Import)
- SQL 덤프 파일 복원: 백업해 둔 SQL 파일을 컨테이너 내부의 PostgreSQL로 주입합니다.
- 명령어: cat [백업파일_경로.sql] | docker exec -i [컨테이너_이름] psql -U [DB_사용자명] -d [DB_이름]
- 실행 예시: cat ./postgres_backup.sql | docker exec -i my-postgres psql -U postgres -d mydatabase
- Verification: 복원 명령 실행 후 docker exec -it my-postgres psql -U postgres -d mydatabase -c "\dt" 명령을 통해 테이블 목록과 데이터 건수가 정상적으로 들어왔는지 검증합니다.
2. MySQL / MariaDB 도커 컨테이너 데이터베이스 백업 및 복원 방법
MySQL 및 MariaDB 환경에서는 mysqldump 도구를 이용하여 데이터베이스 구조와 레코드를 손쉽게 덤프 파일로 추출할 수 있습니다.
MySQL 데이터베이스 백업 (Export)
- 단일 DB 덤프 백업: 비밀번호 항목(-p) 뒤에 공백 없이 암호를 입력하거나, 표준 입출력 파이프라인을 활용합니다.
- 명령어: docker exec [컨테이너_이름] mysqldump -u[DB_사용자명] -p[비밀번호] [DB_이름] > [백업파일_경로.sql]
- 실행 예시: docker exec my-mysql mysqldump -uroot -psecret mydatabase > ./mysql_backup.sql
- 전체 DB 일괄 백업 (--all-databases): 시스템 내 모든 데이터베이스를 한 번에 백업합니다.
- 명령어: docker exec my-mysql mysqldump -uroot -psecret --all-databases > ./all_mysql_backup.sql
MySQL 데이터베이스 복원 (Import)
[이미지: 백업된 SQL 파일 리다이렉션을 통해 신규 MySQL 도커 컨테이너 내부로 데이터를 복원 주입하는 장면]
복원하려는 대상 데이터베이스가 컨테이너 내부에 존재하지 않는 경우 미리 DB를 생성해야 합니다.
- 명령어: docker exec -i my-mysql mysql -uroot -psecret -e "CREATE DATABASE IF NOT EXISTS mydatabase;"
호스트 PC에 보관 중인 백업 SQL 파일의 내용을 컨테이너 내부 mysql 프로세스로 전달하여 테이블과 데이터를 원상 복구합니다.
- 명령어: docker exec -i my-mysql mysql -uroot -psecret mydatabase < ./mysql_backup.sql
- Verification: docker exec -i my-mysql mysql -uroot -psecret -e "SHOW TABLES FROM mydatabase;" 명령을 입력해 복원된 데이터베이스 내 테이블 목록이 정상 출력되는지 검증합니다.
3. 안정적인 덤프 백업 관리를 위한 필수 점검 사항
도커 컨테이너 백업 및 복원 명령어를 운용할 때 실수를 방지하기 위한 체크리스트입니다.
- -i 및 -t 옵션의 올바른 구분 사용
- 데이터 추출(백업) 시에는 터미널 출력을 지원하는 -t (TTY) 옵션을 함께 사용해도 되지만, 데이터 주입(복원) 시에는 -t 옵션을 절대 넣으면 안 됩니다. (-t 옵션을 복원 시 사용하면 the input device is not a TTY 오류가 발생하므로 대화형 표준 입력 전용인 -i 옵션만 써야 합니다.)
- 비밀번호 노출 보안 주의
- 터미널 명령어에 비밀번호를 직접 명시하면 history 기록에 남게 됩니다. 보안이 중요한 환경에서는 환경 변수(.env 파일)를 활용하거나 패스워드 입력 프롬프트를 유도하는 방식을 권장합니다.
- Crontab을 활용한 자동 백업 스케줄링
- 백업 명령어를 리눅스 Crontab에 등록하여 매일 새벽 정기적으로 실행되도록 세팅하면 관리자 개입 없이도 안전한 자동 백업 시스템을 구축할 수 있습니다.
자주 묻는 질문 (FAQ)
Q1. 도커 볼륨(Volume)을 설정해 두었는데도 굳이 SQL 덤프 백업을 추가로 해야 하나요?
A1. 네, 그렇습니다. 도커 볼륨은 컨테이너가 삭제되어도 물리적 하드디스크에 데이터를 보관해 주는 역할을 하지만, 데이터베이스 자체의 커럽션(데이터 파손), 실수에 의한 SQL DROP TABLE 실행, 랜섬웨어 감염 등에는 무방비합니다. 데이터 안정성을 완벽히 확보하려면 볼륨 저장과 별개로 정기적인 SQL 덤프 백업을 병행해야 합니다.
Q2. 대용량 데이터베이스를 백업하고 복원할 때 시간이 너무 오래 걸립니다.
A2. 대용량 환경에서는 일반 text 형태의 .sql 파일 대신 파이프라인으로 gzip 압축을 결합하여 백업 파일 용량을 줄이는 것이 효과적입니다. 또한 PostgreSQL의 경우 pg_dump -F c (Custom Format) 옵션으로 내보낸 뒤 multi-thread 방식의 pg_restore -j [코어수] 명령을 통해 훨씬 빠른 속도로 복원할 수 있습니다.
Q3. 복원 시 Got a packet bigger than 'max_allowed_packet' 오류가 발생합니다.
A3. MySQL 백업 파일 내에 대용량 바이너리 데이터나 큰 단일 레코드가 포함되어 있을 때 발생하는 오류입니다. 컨테이너 내부 MySQL 설정(my.cnf)의 max_allowed_packet 크기를 64M 또는 128M 이상으로 늘려준 후 MySQL 서비스를 재시작하고 복원을 다시 시도하면 해결됩니다.
결론
도커(Docker) 기반으로 PostgreSQL 및 MySQL 데이터베이스 시스템을 운용할 때 docker exec 명령어 기반의 백업 및 복원은 서비스 안정성을 유지하는 핵심 보안 절차입니다.
PostgreSQL의 pg_dump와 MySQL의 mysqldump 사용법을 정확히 이해하고, 백업(-t)과 복원(-i) 시 사용하는 도커 옵션 차이를 숙지해 두면 예기치 못한 시스템 장애나 데이터 손실 상황에서도 즉각 원상 복구할 수 있습니다.
본 가이드의 명령어와 주의사항을 참고하여 데이터베이스 정기 백업 프로세스를 구축하고 안심할 수 있는 나만의 가상화 데이터 센터를 운영해 보시기 바랍니다.