ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [XtraBackup] Docker를 활용한 XtraBackup 간단한 백업 시도
    Database/XtraBackup 2023. 3. 29. 17:08
    728x90
    반응형

    - 목차

     

    들어가며.

    Docker 를 활용하면 MySQL 서버와 XtraBackup 환경을 손쉽게 설정하여 백업 및 복구를 테스트할 수 있습니다.

    이 글에서는 Percona XtraBackup Docker 이미지를 사용하여 간단한 백업을 수행하는 과정을 안내합니다.

    사용할 Docker Image 들은 mysql:8.0.30 과 percona/percona-xtrabackup:8.0.30 이미지를 사용할 예정입니다.

     

    https://hub.docker.com/_/mysql

     

    mysql - Official Image | Docker Hub

    Quick reference Supported tags and respective Dockerfile links 9.1.0, 9.1, 9, innovation, latest, 9.1.0-oraclelinux9, 9.1-oraclelinux9, 9-oraclelinux9, innovation-oraclelinux9, oraclelinux9, 9.1.0-oracle, 9.1-oracle, 9-oracle, innovation-oracle, oracle⁠8

    hub.docker.com

    https://hub.docker.com/r/percona/percona-xtrabackup

     

    https://hub.docker.com/r/percona/percona-xtrabackup

     

    hub.docker.com

     

     

    MySQL 세팅하기.

    먼저 MySQL Docker Container 를 실행하고, Backup 을 위한 Table 과 Rows 를 생성해보도록 합니다.

    Table, Rows 초기화를 위한 init_db.sql 파일를 작성합니다.

    init_db.sql 의 내용은 test_db 라는 이름의 데이터베이스와 test_table 이라는 이름의 테이블을 생성하며,

    프로시저를 통해 10만 개의 행을 추가합니다.

     

    그리고 init_db.sql 파일을 MySQL Containerdocker-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
Designed by Tistory.