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

전체 백업, LSN 체이닝, 준비 단계 및 복사-백을 통해 Percona XtraBackup 증분 MySQL 백업을 구축하고 복원합니다.

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

Percona XtraBackup(PXB)은 InnoDB 데이터가 있는 MySQL 호환 서버의 핫 백업을 수행할 수 있습니다. 전체 백업은 간단하지만, 대규모 데이터베이스의 경우 매일 같은 페이지를 복사하지 않도록 증분 MySQL 백업이 필요한 경우가 많습니다.

이 가이드에서는 전체 기본 백업, 연결된 증분 백업 및 각 증분을 순서대로 적용하는 복원 시퀀스에 대한 명령을 다룹니다.

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 \
  --target-dir=$BASE_DIR \
  --user=root --password=secret_password \
  --datadir=/var/lib/mysql

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

참고: 백업 프로세스를 시작할 때 target-dir은 비어 있거나 존재하지 않아야 합니다. 필요한 권한은 MySQL 및 XtraBackup 버전에 따라 다르므로 root를 재사용하는 대신 Percona의 현재 권한 지침을 사용하여 전용 백업 사용자를 생성하세요.

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

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

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

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

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

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

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

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

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

이 체이닝은 시퀀스를 유지하는 한 계속됩니다. 체인의 연결이 끊어지면(즉, 디렉터리가 누락된 경우) 복원 프로세스가 실패합니다.

복원: 증분 변경 사항 적용

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

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

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

기본 백업을 준비할 때 PXB는 두 가지 필수 작업을 수행합니다.

  1. 커밋된 트랜잭션(리두 로그)을 적용합니다.
  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 \
  --incremental-dir=/data/backups/2023-10-02_INC1 \
  --apply-log-only

# 증분 2 적용
xtrabackup --prepare --target-dir=$RESTORE_TARGET \
  --incremental-dir=/data/backups/2023-10-03_INC2 \
  --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 서비스 중지
sudo systemctl stop mysql

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

# 파일의 적절한 소유권 확인
sudo chown -R mysql:mysql /var/lib/mysql

# MySQL 시작
sudo systemctl start mysql

증분 백업 관리 모범 사례

자동화 및 스크립팅

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

보존 정책

증분 체인이 매우 길어지면 복원 속도가 느려지고 취약해질 수 있습니다. 새 전체 백업을 수행하여 주기적으로 체인을 교체하세요. 일부 팀은 조부-부-자식 보존 모델에 따라 주간 및 월간 전체 백업을 유지하기도 합니다.

압축 및 조절

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

# 압축 및 조절 예시
xtrabackup --backup \
  --target-dir=$INCREMENTAL_3_DIR \
  --incremental-basedir=$INCREMENTAL_2_DIR \
  --compress \
  --throttle=100

확인 및 모니터링

정기적으로 복원 절차를 테스트하세요. 복원할 수 없는 백업은 무용지물입니다. 특히 새 전체 기본 백업을 시작하기 전에 증분 체인이 사용하는 디스크 공간을 모니터링하세요.

결론

증분 XtraBackup은 체인이 손상되지 않은 경우에만 작동합니다: 전체 백업, 전체 백업을 기반으로 한 첫 번째 증분, 그 다음 이전 백업을 기반으로 한 각 후속 증분. 복원 중에는 --apply-log-only를 사용하여 기본 백업을 준비하고, 각 증분을 순서대로 적용하고, --apply-log-only 없이 최종 준비를 한 번 실행한 다음에만 준비된 데이터를 MySQL로 다시 복사합니다.