Mariadb 백업, 복원하기(mariabackup)
백업 종류
mariadb 를 백업하는 방법은 논리적인 방법과 물리적인 방법이 있다.
1. 논리적 백업(mysqldump)
- SQL 형태의 방식
- 모든 행을 스캔하여 테이블마다 insert 구문을 생성함
- 복원 시 시간이 오래 걸림(20GB Data -> 50분 소요)
2. 물리적 백업(mariabackup)
- XtraBackup 방식으로 구현된 mariadb 전용 백업 툴(mariadb 10.3 이상부터 지원)
- DB 데이터를 통째로 복사
- 복사중 데이터 업데이트 발생 가능성으로 인해 주의해야 함
물리적 백업이 복구에 시간이 훨씬 빠르기 때문에 물리적 백업을 채택(20GB Data -> 4분 소요)
백업
mariabackup 의 --backup 옵션을 활용한다.
mariabackup --backup --no-lock --target-dir=/tmp/$BACKUP_NAME --user=$USER --password=$PASSWORD
복원 절차
1. Get Backup File
2. Mariadb Container Stop
3. Mariadb-restore Container Start
4. mariadb-restore Backup File Copy & mariabackup Prepare/Copy Volume
5. Mariadb Container Start(Volume Mount)
Working Directory : /data
Mariadb Data Directory : /data/db_data
Mariadb Image : docker.io/bitnami/mariadb:11.4.3-debian-12-r2
실제 기동될 컨테이너(mariadb)와, 복원용 컨테이너(mariadb-restore)를 사용한다. (data 영역을 스왑하기 때문에 어쩔 수 없음)
서로 같은 볼륨을 마운트하는데 컨테이너 볼륨 마운트 경로는 다르게 한다.
- mariadb : /bitnami/mariadb/data
- mariadb-restore : /tmp/db_restore
docker run
먼저 작업할 컨테이너의 정보이다. 기동 후 stop 한다.
## mariadb-restore run
docker run -d \
--name mariadb-restore \
-e MARIADB_ROOT_PASSWORD={rootPassword} \
-e MARIADB_USER={username} \
-e MARIADB_PASSWORD={password} \
-e MARIADB_DATABASE={databaseName} \
-v /data/db_data:/tmp/db_restore/ \
docker.io/bitnami/mariadb:11.4.3-debian-12-r2
docker stop mariadb-restore
## mariadb run
docker run -d \
--name mariadb \
-e MARIADB_ROOT_PASSWORD={rootPassword} \
-e MARIADB_USER={username} \
-e MARIADB_PASSWORD={password} \
-e MARIADB_DATABASE={databaseName} \
-v /data/db_data:/bitnami/mariadb/data \
docker.io/bitnami/mariadb:11.4.3-debian-12-r2
docker stop mariadb
Backup File Download
백업한 파일은 tar 로 압축하여 minio 에 업로드해놨다. mc 를 사용해 파일을 다운로드 할 것이다.
*password 에 특수문자가 존재할 경우 작은 따옴표를 사용해 묶어줘야한다.
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc alias set myminio http://{ip}:{api port} 'username' 'password'
백업되는 파일명은 'backup-YYYY-MM-DD.tar.gz'
1일 전 데이터를 가져와 /data 영역에 복사하자.
date=`date -d "-1 day" +"%Y-%m-%d"`
./mc cp myminio/{BucketName}/backup-$date.tar.gz /data/
Mariadb-restore Container
이제 복원용 컨테이너를 기동시키고, 백업한 파일을 카피, 검증, 복구한다.
cd /data
docker stop mariadb
docker start mariadb-restore
docker cp backup-$date.tar.gz mariadb-restore:/tmp/
docker exec -i mariadb-restore mkdir /tmp/db_temp
docker exec -i mariadb-restore tar -zxvf /tmp/backup-$date.tar.gz -C /tmp/db_temp
docker exec -i mariadb-restore mariabackup --prepare --target-dir=/tmp/db_temp
docker exec -i mariadb-restore mariabackup --copy-back --target-dir=/tmp/db_temp --datadir=/tmp/db_restore --user={username} --password={password}
--prepare 로 검증을 하고 --copy-back 명령어로 실제 data 영역에 복구하게 된다.
이제 mariadb Container에서 복구한 data 영역을 마운트하여 기동시켜야 한다.
Mariadb Container
실제 기동될 컨테이너를 기동 시키고 database에 접근하여 백업된 데이터베이스와 테이블을 조회해보자.
docker stop mariadb-restore
docker start mariadb
docker exec -it mariadb mariadb -u root -p
Enter password: {password}
MariaDB [(none)]> use {dbname};
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [dbname]> select * from user;
docker-compose
필자는 이렇게 복구한 데이터베이스 컨테이너에 애플리케이션을 붙여야해서 docker-compose 를 사용했다.
healthcheck 와 depends_on 을 추가하여 db가 완전히 기동된 후 application container를 기동하도록 설정한다.
# vi docker-compose.yml
version: '3.7'
services:
mariadb:
image: docker.io/bitnami/mariadb:11.4.3-debian-12-r2
environment:
- MARIADB_ROOT_PASSWORD={rootPassword}
- MARIADB_USER={initUsername}
- MARIADB_PASSWORD={initPassword}
- MARIADB_DATABASE={createDatebasename}
ports:
- "3306:3306" # MySQL 기본 포트
volumes:
- /data/db_data:/bitnami/mariadb/data
healthcheck:
test: ["CMD", "mysqladmin", "ping", "--silent"]
interval: 10s
timeout: 5s
retries: 5
# 추후 app 추가
backend:
image: ...
ports:
- "80:80"
depends_on:
mariadb:
condition: service_healthy
docker-compose up -d