mysql 데이터 백업하기 xtrabackup

snooby·2022년 11월 10일
2
post-thumbnail

✔️ 백업 방식 및 개념 파악

백업의 필요성

mysql을 사용하여 db를 사용 시, 데이터를 백업해두어야 만일의 경우 db의 정보가 날라갈 경우 백업본을 바탕으로 복구할 수 있으므로 db 정보를 백업하는 작업은 필요합니다.

xtrabackup

백업을 위해 사용할 툴은 xtrabackup입니다.

Percona에서 만든 백업 유틸리티로 MySQL에 사용되는 온라인 백업

비교 툴 : mysqldump (=논리적인 백업)
백업 방식 : 물리적인 파일을 통째로 특정 디렉토리에 복사하는 방법

        풀백업, 증분백업, 암호화 백업, 압축백업 지원

         MySQL 엔터프라이즈 라이센스에 포함된 백업 도구의 기능을 모두 제공할 뿐만 아니라 더 유용한 기능들도 제공합니다.

XtraBackup 특징

Percona XtraBackup은 InnoDB의 충돌 복구 기능을 기반

InnoDB 데이터 파일을 복사하므로 내부적으로 일관성이 없는 데이터가 생성됩니다. 그런 다음 파일에 대해 응급 복구를 수행하여 일관되고 사용 가능한 데이터베이스로 다시 만듭니다. 이것은 InnoDB가 트랜잭션 로그라고 하는 리두 로그를 유지하기 때문에 작동합니다.
여기에는 InnoDB 데이터의 모든 변경에 대한 기록이 있습니다. InnoDB가 시작되면 데이터 파일과 트랜잭션 로그를 검사하고 두 단계를 수행합니다.

커밋된 트랜잭션 로그 항목을 데이터 파일에 적용하고 데이터를 수정하지만 커밋하지 않은 모든 트랜잭션에 대해 실행취소 작업을 수행

동작 방식

Percona XtraBackup은 시작할 때 로그 시퀀스 번호 (LSN)를 기억한 다음 데이터 파일을 복사하는 방식으로 작동
이 작업을 수행하는 데 약간의 시간이 걸리므로 파일이 변경되면 다른 시점의 데이터베이스 상태를 반영

동시에 Percona XtraBackup은 트랜잭션 로그 파일을 감시하는 백그라운드 프로세스를 실행하고 여기에서 변경 사항을 복사합니다. Percona XtraBackup은 트랜잭션 로그가 라운드 로빈 방식으로 작성되고 잠시 후에 재사용 될 수 있기 때문에 이를 지속적으로 수행해야합니다.

Percona XtraBackup은 실행을 시작한 이후 데이터 파일이 변경 될 때마다 트랜잭션 로그 레코드가 필요합니다.

< 백업 >

백업 완료 시, xtrabackup_checkpoints 파일 생성됨.

xtrabackup_checkpoints → 데이터 베이스 LSN 행 존재

증분백업은 이를 기반으로 LSN 이후의 변경사항을 백업

< 복구 >

증분 백업을 사용한 복구 시,

일반 백업( 데이터베이스 일관성을 위해 커밋된 트랜잭션은 로그 파일에서 데이터 파일에 대해 재생 & 커밋되지 않은 트랜잭션은 롤백)과 달리

백업을 준비 시, 커밋되지 않은 트랜잭션 롤백 하지 않음!! → 백업 시점에 커밋되지 않은 트랜잭션이 진행중이어서 다음 증분 백업에서 커밋될 가능성이 높기 때문 → 롤백 단계 방지하려면 —apply-log-only 옵션 사용

롤백 단계를 방지하기 위해 --apply-log-only 옵션을 사용하지 않으면 증분 백업이 쓸모 없게 됩니다.

요약

– Mysql / Mariadb 등 에서 백업에 사용되는 오픈소스 백업 유틸리티

– xtrabackup은 엔진 데이터를 그대로 복사하여 백업 / 복구 하는 방식입니다.

– 장점 :
대용량 백업의 경우 mysqldump 대비 xtrabackup 이 서버의 리소스 사용 및 속도면에서 매우 강력한 이점

– 단점 :
데이터를 복사하여 백업하는방식이기 때문에 대용량 백업을 진행할 시, Backup Server에 충분한 용량 확보 필요

✔️ 설치 체크리스트

버전 관리

mysql : 8.0.29(cbt) 8.0.27(dev)

xtrabackup : 8.0.29
→ 설치된 mysql 버전과 동일해야함.

백업 주의

  • 백업 시 table lock false
  • 압축, 속도 효율성 체크

✔️ Backup 방식

백업 툴 : xtrabackup

https://www.percona.com/software/mysql-database/percona-xtrabackup

버전 : 8.0.29 (cbt)
2점대, 8점대 제공 (mysql 버전과 일치해야함)

제한사항 : mysql 8.0.29까지 지원

       mysql 8점대 ALTER algorithm instant로 인한 백업 기능 제한 [자세히](https://www.notion.so/Xtrabackup-49bbec4a6bd84c1bb542f25e13e9e527)

백업 방식 : 풀 백업 & 증분 백업 혼합

  • 풀 백업 : 전체 다 백업
  • 증분 백업 : 이전 백업 ~ 현재까지 변경된 내역만 백업 (변경사항 없다면 백업 용량 0)
  • 시간
    증분 백업은 금방될 것 같지만 증분백업도 풀백업과 동일하게 데이터파일 모두 읽어야하므로 시간은 비슷
    백업할 데이터양과 백업 시간은 비례
  • 용량
    풀백업보다 증분백업이 용량은 확실히 작다.
  • 매일매일 자정 풀백업 1회 & 1시간 마다 증분 백업
    • 장점: 용량 최소화 & 풀 백업 이외 백업 시간 가장 짧다
    • 단점: 복구 시 오래 걸림

✔️ 백업 진행하기

Xtrabackup 설치

  • CentOS and RHEL
wget http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm 
rpm -ivH percona-release-0.1-4.noarch.rpm
yum install percona-xtrabackup-24
  • Debian and Ubuntu
wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-xtrabackup-24

mysql 사전 세팅

xtrabackup 기본 설정으로 아래와 같이 설정됩니다.
mysql 설정 파일 경로(mysql.cnf)와 user가 다를경우 해당 옵션을 추가해야 정상적으로 백업이 됩니다.

--defaults-file=/etc/my.cnf
--defaults-group=mysql 

설치된 mysql의 mysql.cnf의 datadir이 어디로 정의되어있는지 파악해두셔야합니다.
이 datadir이 기본 /var/lib/mysql과 다를경우 백업 시 직접 옵션 정의해야합니다.

전체 백업

전체 백업은 mysql의 전체 데이터를 백업하는 작업입니다.

xtrabackup --backup --compress --datadir=${mysql.cnf의 datadir} --host=${MYSQL_DB_HOST} --port=${MYSQL_PORT} --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} --stream=xbstream  > base.xbstream
ex) xtrabackup --backup --compress --datadir=/data/mysql --host=${MYSQL_DB_HOST} --port=${MYSQL_PORT} --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} --stream=xbstream  > base.xbstream

아래 설명하는 옵션은 필수가 아닌 옵션들입니다.
--datadir : mysql 데이터가 위치한 곳 (mysql.cnf의 datadir이 /var/lib/mysql이라면 옵션 정의 안해도 됩니다.
--compress : 압축해서 백업을 진행합니다.
--stream=xbstream : xbstream 파일의 압축 데이터를 생성합니다.

위의 소스를 실행할 경우 현재 실행하는 위치에 base.xbstream이라는 전체 백업분 압축된 파일이 생성됩니다.
전체 백업의 경우 데이터가 크므로 압축을 진행하는 것이 효율적입니다.

증분 백업

xbstream -x < base.xbstream 
xtrabackup --decompress --target_dir={base.xbstream이 있는 경로}
xtrabackup --backup --compress --host=${MYSQL_DB_HOST} --port=${MYSQL_PORT} --user=${MYSQL_USER} --password=${MYSQL_PASSWORD} --datadir=${MYSQL_DATA_DIR} --no-lock --stream=xbstream --target-dir=./ --incremental-basedir=./base > diff.xbstream

증분 백업은 이전에 백업된 것 이후의 변경사항을 백업하므로
이전의 백업된 파일인 풀 백업 파일을 기반으로 백업이 진행됩니다. 따라서 풀백업본이 반드시 있어야합니다.

--target-dir : 백업본이 생성될 곳
--incremental-basedir : 베이스가 될 이전에 백업된 파일

여러 번의 증분백업이 진행될 경우 아래와 같이 "--incremental-basedir="에 이전에 백업된 가장 최신의 파일을 넣어 이어서 백업이 진행되도록 합니다.

xtrabackup --backup --target-dir=./xtrabackup_0205/inc1 --incremental-basedir=./xtrabackup_0205/base --user=root --password=root

xtrabackup --backup --target-dir=./xtrabackup_0205/inc2 --incremental-basedir=./xtrabackup_0205/inc1 --user=root --password=root

xtrabackup --backup --target-dir=./xtrabackup_0205/inc3 --incremental-basedir=./xtrabackup_0205/inc2 --user=root --password=root

위와 같이 진행할 경우 결국 ./xtrabackup_0205/inc1 & ./xtrabackup_0205/inc2 & ./xtrabackup_0205/inc3 에 3개의 증분백업이 생깁니다.

✔️ 복구 진행하기

이렇게 백업된 파일로 복구를 진행해보겠습니다.

풀백업본으로 복구하기

# 백업본 위치시킬 파일 생성
rm -rf backup && mkdir -p backup/base

# 백업 파일 압축 해제 및 준비
xbstream -x < base.xbstream
xtrabackup --decompress --remove-original --target-dir./backup/base
xtrabackup --prepare --target-dir=./backup/base

# 백업을 진행하기 위해 서비스 종료
service mysqld stop

# 기존의 데이터 디렉토리 만일 대비 삭제하지 않고 복사해둡니다.
mv ${MYSQL_DATA_DIR} ${MYSQL_DATA_DIR}-old
# mv /var/lib/mysql /var/lib/mysql-old
# 데이터 디렉토리 생성
mkdir ${MYSQL_DATA_DIR}
# 백업
xtrabackup --copy-back --target-dir=./backup/base
# 데이터 디렉토리에 권한 부여
chown -R mysql:mysql /var/lib/mysql
# 서비스 실행
service mysqld start

mkdir -p backup/base
mkdir시 -p 옵션을 붙이면 자동으로 하위의 디렉토리까지 생성해줍니다.

풀백업본 + 증분백업본 복구하기

증분백업본을 함께 복구를 진행하려면 풀백업본을 베이스로 두고 이어서 증분백업본을 붙여서 백업 복구 파일을 생성하므로 전체 백업 파일이 반드시 있어야합니다.

# 백업본 위치시킬 파일 생성
rm -rf backup && mkdir -p backup/{base,diff}

# 저체 백업 파일 압축 해제 및 준비
xbstream -x < base.xbstream
xtrabackup --decompress --remove-original --target-dir=./backup/base
xtrabackup --prepare --apply-log-only --target-dir=./backup/base

# 증분 백업 파일 압축 해제 및 준비 [1번째 파일]
xbstream -x < diff.xbstream
xtrabackup --decompress --remove-original --target-dir=./backup/diff
xtrabackup --prepare --apply-log-only --target-dir=./backup/base --incremental-dir=$createDir

# 증분 백업 파일 압축 해제 및 준비 [2번째 파일]
xbstream -x < diff.xbstream
xtrabackup --decompress --remove-original --target-dir=./backup/diff
xtrabackup --prepare --target-dir=./backup/base --incremental-dir=$createDir

# 백업을 진행하기 위해 서비스 종료
service mysqld stop

# 기존의 데이터 디렉토리 만일 대비 삭제하지 않고 복사해둡니다.
mv ${MYSQL_DATA_DIR} ${MYSQL_DATA_DIR}-old
# mv /var/lib/mysql /var/lib/mysql-old
# 데이터 디렉토리 생성
mkdir ${MYSQL_DATA_DIR}
# 백업
xtrabackup --copy-back --target-dir=./backup/base
# 데이터 디렉토리에 권한 부여
chown -R mysql:mysql /var/lib/mysql
# 서비스 실행
service mysqld start

--apply-log-only : 증분 백업을 사용한 복구 시,
일반 백업( 데이터베이스 일관성을 위해 커밋된 트랜잭션은 로그 파일에서 데이터 파일에 대해 재생 & 커밋되지 않은 트랜잭션은 롤백)과 달리
백업을 준비 시, 커밋되지 않은 트랜잭션 롤백 하지 않음!! → 백업 시점에 커밋되지 않은 트랜잭션이 진행중이어서 다음 증분 백업에서 커밋될 가능성이 높기 때문 → 롤백 단계 방지하려면 —apply-log-only 옵션 사용
롤백 단계를 방지하기 위해 --apply-log-only 옵션을 사용하지 않으면 증분 백업이 쓸모 없게 됩니다.

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글