-
[XtraBackup] Docker를 활용한 XtraBackup 간단한 백업 시도Database/XtraBackup 2023. 3. 29. 17:08728x90반응형
- 목차
들어가며.
Docker 를 활용하면 MySQL 서버와 XtraBackup 환경을 손쉽게 설정하여 백업 및 복구를 테스트할 수 있습니다.
이 글에서는 Percona XtraBackup Docker 이미지를 사용하여 간단한 백업을 수행하는 과정을 안내합니다.
사용할 Docker Image 들은 mysql:8.0.30 과 percona/percona-xtrabackup:8.0.30 이미지를 사용할 예정입니다.
https://hub.docker.com/_/mysql
https://hub.docker.com/r/percona/percona-xtrabackup
MySQL 세팅하기.
먼저 MySQL Docker Container 를 실행하고, Backup 을 위한 Table 과 Rows 를 생성해보도록 합니다.
Table, Rows 초기화를 위한 init_db.sql 파일를 작성합니다.
init_db.sql 의 내용은 test_db 라는 이름의 데이터베이스와 test_table 이라는 이름의 테이블을 생성하며,
프로시저를 통해 10만 개의 행을 추가합니다.
그리고 init_db.sql 파일을 MySQL Container 의 docker-entrypoint-initdb.d 디렉토리 내부로 마운트하여 Database, Table, Rows 를 자동으로 초기화되도록 합니다.
cat <<'EOF'> /tmp/init_db.sql CREATE DATABASE test_db; USE test_db; CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, description TEXT ) ENGINE=InnoDB; DELIMITER $$ CREATE PROCEDURE InsertTestData() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 100000 DO INSERT INTO test_table (name, description) VALUES ( CONCAT('Name_', i), CONCAT('This is a description for record number ', i) ); SET i = i + 1; END WHILE; END$$ DELIMITER ; CALL InsertTestData(); EOF
docker run -d --platform linux/amd64 \ --name mysql \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ -p 3306:3306 \ --mount type=bind,source=/tmp/init_db.sql,target=/docker-entrypoint-initdb.d/init_db.sql \ mysql:8.0.30
참고로 저의 PC 환경에서는 10만개의 Rows 를 추가하는데에 5분 가량의 시간이 소요되었습니다.
MySQL Container 의 초기화 완료를 확인하려면 아래의 명령어를 입력해주세요.
docker exec mysql mysql -e 'select count(*) from test_db.test_table;'
XtraBackup 으로 백업 시도하기.
XtraBackup 또한 Docker Container 를 통해서 실행합니다.
XtraBackup 은 1회성 BatchJob 의 형식으로 실행되며, 여기서 Docker 의 몇가지 기능들이 활용되어야 합니다.
먼저 Docker Volume 을 생성합니다.
MySQL 의 데이터가 저장되는 영역의 File System 과 동일한 File System 을 가지는 Docker Volume 을 생성하고,
생성된 Docker Volume 내부에 Backup Snapshot 을 저장합니다.
docker volume create backup
그리고 percona/percona-xtrabackup 도커 이미지를 통해서 Backup 을 시도합니다.
XtraBackup 의 Backup 실행을 위한 명령어는 아래와 같습니다.
docker run --platform linux/amd64 --name xtrabackup -d \ --volumes-from mysql \ -v backup:/backup \ --user root \ percona/percona-xtrabackup:8.0.30 \ bash -c ' xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/backup --host=host.docker.internal --port=3306 --user=root && \ xtrabackup --prepare --target-dir=/backup'
- --volumes-from mysql
- MySQL 데이터 디렉터리(/var/lib/mysql/)에 직접 접근하기 위해서 --volumes-from 옵션을 사용합니다.
- --volumes-from 은 특정 Docker Container 의 볼륨을 공유합니다.
- --user root
- root 사용자의 권한으로 XtraBackup 명령어를 실행합니다.
- root 사용자로 실행하지 않으면 MySQL 의 일부 파일의 권한 이슈를 접할 확률이 있습니다.
- xtrabackup --backup & --prepare
- xtrabackup 은 --backup 과 --prepare 과정을 통해서 Backup Snapshot 을 생성합니다.
백업된 Volume 확인하기.
Backup 된 Docker Volume 을 확인하기 위해서 ubuntu 이미지의 Container 를 하나 실행하도록 합니다.
docker run --platform linux/amd64 -it -v backup:/tmp/backup ubuntu:20.04
그리고 /tmp/backup 디렉토리의 파일들을 확인하면 백업된 파일 목록을 확인할 수 있습니다.
확인된 결과를 살펴보면,
test_db 데이터베이스를 위한 ibd 파일이 확인되며 이 파일은 백업된 Table 의 Tablespace 공간입니다.
그리고 undo log 의 Tablespace 인 undo_001, undo_002 와 binlog 등이 보입니다.
redo log 의 파일들은 보이진 않는데요.
이는 xtrabackup_logfile 내부에 기록되어 있고, Backup 과정에서 redo log 에 기록된 변경사항들은 모두 Table 의 ibd 파일로 병합됩니다.
Backup Snapshot 으로 Restore 시도해보기.
이제 Backup Snapshot 을 기반으로 새로운 MySQL Container 를 실행합니다.
백업을 위해 사용하였던 backup Docker Volume 을 restored-mysql 컨테이너에 볼륨 마운트를 적용합니다.
docker run -d --platform linux/amd64 \ --name restored-mysql \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ --mount type=volume,source=backup,target=/var/lib/mysql \ mysql:8.0.30
실행 중인 restored-mysql Container 에 docker exec 명령어를 실행하여 복원된 Rows 를 조회합니다.
docker exec restored-mysql \ mysql -e 'select * from test_db.test_table order by rand() limit 10;'
마치며.
이번 글에서는 우선적으로 간단한 XtraBackup 의 실행과 복원 과정을 살펴보았는데요.
이어지는 새로운 글들에서 XtraBackup 에 대한 심화있는 주제를 다루어보도록 하겠습니다.
반응형'Database > XtraBackup' 카테고리의 다른 글
[XtraBackup] XtraBackup Stream Mode 알아보기 (0) 2023.04.28 - --volumes-from mysql