Percona XtraBackup을 사용한 증분 MySQL 백업 구성

Percona XtraBackup(PXB) 증분 스냅샷을 사용하여 고효율 MySQL 백업 기술을 익히십시오. 이 포괄적인 가이드는 LSN 추적을 기반으로 하는 순차적 증분 백업을 구성, 실행 및 복원하는 중요한 단계를 자세히 설명합니다. 초기 전체 기본 백업을 수행하고, `--incremental-basedir`를 사용하여 후속 증분을 올바르게 연결하며, 다단계 복원 프로세스를 탐색하여 대규모 데이터베이스의 최소 다운타임과 최적의 스토리지 관리를 보장하는 방법을 알아보십시오.

45 조회수

Percona XtraBackup을 사용한 증분 MySQL 백업 구성

Percona XtraBackup(PXB)은 MySQL, MariaDB 및 Percona Server 인스턴스의 비차단, 핫 백업을 수행하는 업계 표준입니다. 전체 백업은 필수적이지만, 대규모 데이터베이스는 가동 중지 시간과 스토리지 사용량을 최소화하는 효율적인 전략이 필요합니다. 증분 백업은 마지막 성공적인 백업 이후 발생한 데이터 변경 사항만 캡처하여 이러한 효율성을 제공합니다.

이 가이드에서는 PXB를 활용하여 강력한 증분 백업 전략을 구현하는 방법을 살펴봅니다. 핵심 개념, 순차적인 증분 스냅샷을 수행하는 데 필요한 명령, 성공적인 복원에 필요한 다단계 프로세스를 다룰 것입니다.

Percona XtraBackup의 증분 메커니즘 이해

PXB는 InnoDB 스토리지 엔진의 내부 작동 방식, 특히 로그 시퀀스 번호(LSN)를 사용하여 변경 사항을 추적하는 것에 의존합니다. 모든 InnoDB 페이지에는 LSN이 태그되어 있습니다. PXB가 증분 백업을 수행할 때, 이전 백업 시점의 LSN보다 큰 LSN을 가진 페이지만 기록합니다.

중요한 것은 증분 백업은 시작점을 설정하기 위해 전체 기본 백업이 필요하다는 것입니다. 이후의 모든 증분 백업은 이전 백업(기본 백업 또는 다른 증분 백업)을 참조하여 연결됩니다.

주요 파일 및 개념

  • LSN (로그 시퀀스 번호): 변경 사항이 시작되고 끝나는 위치를 결정하는 데 사용되는 마커입니다.
  • xtrabackup_checkpoints: 백업 중에 생성되는 파일로, to_lsn(백업 종료 시 도달한 LSN)과 증분 백업의 경우 from_lsn(시작 LSN)을 포함합니다.
  • --incremental-basedir: 증분 실행 중에 사용되는 필수 플래그로, PXB가 이전 백업 디렉토리를 가리키도록 하여 시작 LSN을 결정합니다.

1단계: 전체 기본 백업 수행

증분 스냅샷을 찍기 전에 일관성 있는 전체 기본 백업을 생성해야 합니다. 이는 전체 백업 체인의 기초를 설정합니다.

먼저 디렉토리 구조를 정의합니다.

# 전체 백업을 위한 기본 디렉토리 정의
BASE_DIR="/data/backups/2023-10-01_FULL"

# 디렉토리 생성
mkdir -p $BASE_DIR

# 전체 백업 실행
xtrabackup --backup \n  --target-dir=$BASE_DIR \n  --user=root --password=secret_password \n  --datadir=/var/lib/mysql

# 전체 백업의 LSN 확인
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'

참고: target-dir은 백업 프로세스를 시작할 때 비어 있거나 존재하지 않아야 합니다. 항상 적절한 권한(예: RELOAD, LOCK TABLES, PROCESS, SUPER 권한)을 가진 자격 증명을 사용하십시오.

2단계: 첫 번째 증분 백업 수행

첫 번째 증분 백업을 수행하려면 --incremental-basedir 플래그를 사용하여 전체 기본 백업 디렉토리를 참조해야 합니다. PXB는 기본 백업에서 to_lsn을 읽고 해당 지점 이후 변경된 페이지만 복사합니다.

# 첫 번째 증분 백업을 위한 디렉토리 정의
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"

# 전체 기본 백업을 참조하여 증분 백업 실행
xtrabackup --backup \n  --target-dir=$INCREMENTAL_1_DIR \n  --incremental-basedir=/data/backups/2023-10-01_FULL \n  --user=root --password=secret_password

3단계: 후속 증분 백업 연결

후속 증분 백업(INC2, INC3 등)의 경우 --incremental-basedir바로 이전 증분 백업 디렉토리를 가리켜야 합니다.

INC1 이후의 변경 사항을 기반으로 INC2를 생성하려면:

# 두 번째 증분 백업을 위한 디렉토리 정의
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"

# 이전 증분 백업(INC1)을 참조하여 증분 백업 실행
xtrabackup --backup \n  --target-dir=$INCREMENTAL_2_DIR \n  --incremental-basedir=/data/backups/2023-10-02_INC1 \n  --user=root --password=secret_password

이 연결은 시퀀스를 유지하는 동안 계속됩니다. 체인의 어떤 연결이라도 끊어지면(즉, 디렉토리가 누락되면) 복원 프로세스가 실패합니다.

복원: 증분 변경 사항 적용

증분 백업 세트를 복원하는 것은 기본 백업에 변경 사항을 순차적으로 적용하는 다단계 프로세스입니다. 전체 백업과 달리 증분 백업은 데이터 디렉토리로 직접 복사할 수 없습니다.

복원 단계 1: 기본 백업 준비

먼저 기본 백업을 준비해야 합니다. 이는 일반적으로 데이터 안전을 보장하기 위해 임시 스테이징 영역에서 수행됩니다.

기본 백업을 준비할 때 PXB는 두 가지 필수 작업을 수행합니다.
1. 커밋된 트랜잭션(redo 로그)을 적용합니다.
2. 커밋되지 않은 트랜잭션을 롤백합니다.

--prepare 플래그를 사용하지만, 중요하게도 --apply-log-only 플래그를 추가합니다. 이렇게 하면 PXB가 커밋되지 않은 트랜잭션을 롤백하지 않습니다. 이는 후속 증분 로그가 복원을 완료하기 위해 해당 트랜잭션 조각이 필요하기 때문에 필요합니다.

# 스테이징 디렉토리 정의
RESTORE_TARGET="/data/restore_staging"

# 전체 기본 백업 파일을 스테이징 영역으로 복사
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET

# 증분을 위해 준비된 상태로 기본 백업 준비
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only

# 확인 메시지 확인: 'completed OK!'

복원 단계 2: 증분 백업 순차 적용

다음으로, 각 증분 백업을 찍은 정확한 시간 순서대로 적용합니다. 각 명령은 스테이징 디렉토리(현재 수정 중인 기본 백업)를 참조하고 특정 증분 스냅샷을 가리키는 --incremental-dir 플래그를 사용해야 합니다.

# 증분 1 적용
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n  --incremental-dir=/data/backups/2023-10-02_INC1 \n  --apply-log-only

# 증분 2 적용
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n  --incremental-dir=/data/backups/2023-10-03_INC2 \n  --apply-log-only

# ... 필요한 모든 증분에 대해 계속 ...

복원 단계 3: 준비 완료

마지막으로 원하는 증분 스냅샷을 모두 적용한 후, --apply-log-only 플래그 없이 최종 준비 단계를 실행합니다. 이렇게 하면 PXB가 최종 정리 작업을 수행하여 전체 백업 시퀀스에 걸쳐 커밋되지 않은 모든 트랜잭션을 롤백하여 일관된 상태를 만듭니다.

# 준비 완료 ( --apply-log-only 없음)
xtrabackup --prepare --target-dir=$RESTORE_TARGET

# 중요: 'xtrabackup: Recovery completed OK!'를 나타내는 최종 확인 메시지를 확인하십시오.

복원 단계 4: MySQL로 데이터 복사

준비가 성공적으로 완료된 후, 스테이징 디렉토리($RESTORE_TARGET)의 데이터는 일관성이 있으며 MySQL 서버에서 사용할 준비가 되었습니다.

  1. MySQL 서비스를 중지합니다.
  2. MySQL 데이터 디렉토리가 비어 있거나 백업되었는지 확인합니다 (선택 사항: 허용되는 경우 --move-back 옵션을 사용할 수 있지만, 복구 시에는 --copy-back이 더 안전합니다).
  3. xtrabackup --copy-back을 사용하여 파일을 이동합니다.
  4. 권한을 수정합니다.
  5. MySQL을 다시 시작합니다.
# MySQL 서비스 중지
service mysql stop

# 준비된 파일을 MySQL 데이터 디렉토리로 다시 복사
xtrabackup --copy-back --target-dir=$RESTORE_TARGET

# 파일에 대한 적절한 소유권 보장
chown -R mysql:mysql /var/lib/mysql

# MySQL 시작
service mysql start

증분 백업 관리를 위한 모범 사례

자동화 및 스크립팅

증분 백업 전략은 완전히 자동화될 때 가장 효과적입니다. 스크립트는 LSN 연결을 자동으로 관리하여 --incremental-basedir 플래그에 사용할 가장 최근 백업 디렉토리를 동적으로 식별해야 합니다.

보존 정책

증분 체인이 매우 길어질 수 있어 복원이 느려질 수 있습니다. 일반적인 모범 사례는 Grandfather-Father-Son (GFS) 전략 또는 차등 증분 백업(모든 증분이 기본 전체 백업을 참조하는 경우)입니다. 주기적으로 새 전체 백업을 수행하여 체인을 롤오버하여 짧고 새로운 체인을 시작합니다.

압축 및 스로틀링

매우 바쁜 서버의 경우 백업 단계에서 --throttle 옵션을 사용하여 I/O 작업을 제한하는 것을 고려하십시오. --compress를 사용하여 백업 크기를 줄이십시오. 이는 증분 백업에서 생성되는 더 작은 데이터 세트에 매우 유익합니다.

# 압축 및 스로틀링 예시
xtrabackup --backup \n  --target-dir=$INCREMENTAL_3_DIR \n  --incremental-basedir=$INCREMENTAL_2_DIR \n  --compress \n  --throttle=100

검증 및 모니터링

항상 복원 절차를 정기적으로 테스트하십시오. 복원할 수 없는 백업은 쓸모가 없습니다. 특히 새 전체 기본 백업을 시작하기 전에 증분 체력이 소비하는 디스크 공간을 모니터링하십시오.