CentOS 에서 yum 으로 xtrabackup 설치

# Percona yum repository 설치 
yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# Enable the repository:
percona-release enable-only tools
# xtrabackup 설치 
yum -y install percona-xtrabackup-80
# 압축 백업을 사용하기 위해 qpress 설치 
yum -y install qpress

CentOS 6 에서 xtrabackup 을 설치하기 위해서는 libev 패키지가 설치되어 있어야한다. 

rpm 설치 

# 필요 패키지 설치 
yum install -y libev perl-DBD-MySQL perl-Time-HiRes
# xtrabackup 설치 rpm 다운로드 
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
# xtrabackup 설치 
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm

서버에 연결 

xtrabackup --default-file=/etc/my.cnf --user=MySQL계정(백업 실행 권한 필요) --password=패스워드 --backup \
--host=접속할 MySQL서버 ip --port=접속할 MySQL서버 포트 --socket=접속할 MySQL 서버 소켓파일 \
--target-dir=백업할 디렉토리

xtrabackup 기본 백업 디렉토리 설정 

my.cnf 파일에 아래와 같이 지정할 수 있다. 

[xtrabackup]
target_dir=/data/backups/mysql/

필요 권한 

- BACKUP_ADMIN : performance_schema.log_status 테이블 쿼리,  LOCK INSTANCE FOR BACKUP, LOCK BINLOG FOR BACKUP, LOCK TABLES FOR BACKUP 실행 권한 

- PROCESS : SHOW ENGINE INNODB STATUS 실행과, 서버에서 실행중인 모든 스레드를 보기위한 권한 

- RELOAD, LOCK TABLES : 파일 복사를 시작하기전에 FLUSH TABLES WITH READ LOCK, FLUSH ENGINE LOGS를 실행하기 위한 권한 (백업 잠금이 사용될때 필요한 권한)

- REPLICATION CLIENT : binary log position 확인을 위한 권한 

- CREATE TABLESPACE : import tables 를 위한 권한 (개발 테이블 복원시)

- SUPER : 복제구성에서 복제 스레드 시작/중지를 위한 권한, XtraDB에서 증분백업을 위한 변경 페이지 추적을 위한FLUSH TABLES WITH READ LOCK를 사용하기 위한 권한

- CREATE : PERCONA_SCHEMA.xtrabackup_history 데이터베이스, 테이블을 생성하기 위한 권한

- INSERT : PERCONA_SCHEMA.xtrabackup_history 테이블에 히스토리 레코드를 추가하기 위한 INSERT 권한

- SELECT : PERCONA_SCHEMA.xtrabackup_history 테이블에서 innodb_to_lsn 값 조회, --incremental-history-name 또는 --incremental-history-uuid 을 사용하기 위한 권한 

전체 백업에 필요한 최소 권한을 가진 데이터베이스 사용자 생성 예제

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cr%T';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'localhost'
mysql> FLUSH PRIVILEGES;

전체백업

- xtrabackup 실행시 --backup, --target-dir 을 지정하여 실행

- --target-dir 로 지정된 디렉토리가 비어있는 경우에만 백업이 진행됨

  지정 디렉토리에 파일이 있는경우 에러가 발생한다.

xtrabackup --backup --target-dir=/data/backups/

전체백업 복원 

준비 단계 

- xtrabackup 실행시 --prepare, --target-dir 을 지정하여 실행

  백업파일 무결성, 일관성 검증실행 

- --prepare 옵션을 주고 xtrabackup 프로세스 실행중에 중지하지 않는것이 좋다. 

  데이터파일이 손상되고 백업을 사용할수 없게 될수도 있다. 

xtrabackup --prepare --target-dir=/data/backups/

복원 

- xtrabackup 실행시 --copy-back 또는 --move-back 옵션을 사용

  기존의 data 디렉토리에 자동으로 복원됨 

  data 디렉토리는 비어있어야 하며, mysql 서버도 종료된 상태여야함 

- --copy-back, --move-back 대신 rsync를 사용할수도 있다. 

 rsync -avrP /data/backup/ /var/lib/mysql/

- mysql 을 구동하기 전에 data 디렉토리의 소유권을 변경한다. 

chown -R mysql:mysql /var/lib/mysql

 

증분 백업

- xtrabackup 은 증분 백업을 지원한다. 

  마지막 백업 이후 변경된 데이터만 복사할 수 있다. 

- 증분 백업은 각 InnoDB 페이지에 로그 시퀀스번호 또는 LSN이 포함되어 있기 때문에 작동한다. 

  LSN은 전체 데이터베이스의 시스템 버전 번호.

- 증분 백업은 LSN이 이전 증분, 전체 백업의 LSN보다 최신인 각 페이지를 복사한다. 

- 복사할 페이지 세트를 찾는데 사용되는 알고리즘 

  - 모든 데이터 페이지를 읽어 페이지 LSN을 직접 확인 

  - 변경된 페이지 추적 기능 사용 (Percona Server for MySQL 에서만 사용가능)

- 증분 백업은 실제로 데이터 파일을 이전 백업 파일과 비교하지 않는다.  

  부분 백업후 증분 백업을 실행하면 데이터가 일치하지 않을 수도 있다. 

- 증분 백업으로 증분 변경사항을 복구하라면 전체 백업이 필요하다. 

- LSN 을 알고 있는 경우 --incremental-lsn 옵션을 사용하여 이전 백업 없이도 증분 백업 수행 가능 

 

증분 백업 생성

- 중분 백업을 수행하려면 전체 백업본이 필요하다. 

xtrabackup --prepare --target-dir=/data/backups/base

- xtrabackup 백업 대상 디렉토리에 xtrabackup_checkpoints 라는 백업 기록 파일이 있다. 

  이 파일에는 백업 시작,  종료 lsn 정보(from_lsn, to_lsn) 가 있다. 

backup_type = full-backuped
from_lsn = 0
to_lsn = 1626007
last_lsn = 1626007
compact = 0
recover_binlog_info = 1

- 전체 백업을 기반으로 증분 백업 진행 

xtrabackup --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base

- /data/backups/inc1 디렉토리의 xtrabackup_checkpoints 파일에는 아래와 같이 백업 시작,  종료 lsn 정보(from_lsn, to_lsn) 가 있다. 

backup_type = incremental
from_lsn = 1626007
to_lsn = 4124244
last_lsn = 4124244
compact = 0
recover_binlog_info = 1

- /data/backups/inc1 디렉토리를 다른 증분 백업의 기반으로 사용할 수 있다.

 xtrabackup --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1

- /data/backups/inc2 디렉토리의 xtrabackup_checkpoints 파일에는 아래와 같이 백업 시작,  종료 lsn 정보(from_lsn, to_lsn) 가 있다. 

backup_type = incremental
from_lsn = 4124244
to_lsn = 6938371
last_lsn = 7110572
compact = 0
recover_binlog_info = 1

증분 백업 복원

준비 단계 

- 증분 백업을 복원하기 위한 준비 단계는 전체 백업과 동일하지 않다. 

- 전체 백업에서는 데이터베이스 일관성을 유지하기 위해 두기지 유형의 작업이 수행된다. 

  커밋된 트랜잭션은 데이터파일에 대해 로그파일에서 재생되고 커밋 되지 않은 트랜잭션은 롤백된다. 

  백업시 커밋되지 않은 트랜잭션이 진행중 일수 있고 다음 증분 백업에서 키밋 될 가능성이 있으므로 

  증분 백업을 준비할 때 커밋되지 않은 트랜잭션의 롤백을 건너 뛰어야 한다. 

  롤백 단계를 방지하기 위해서 --apply-log-only 옵션을 사용해야 한다. 

- --apply-log-only 옵션을 사용하지 않으면 증분백업이 소용 없다. 

  트랜잭션이 롤백된 이후에는 추가 증분 백업을 적용할 수 없다. 

- 롤 백 단계를 건너 뛰고 복원해도 안전하다.

  복원하고 MySQL을 시작하면 InnoDB는 롤백 단계가 수행되지 않았음을 감지하고 일반적으로 시작시 충돌 복구에 

  대해 수행하는 것처럼 백그라운드에서 복구를 수행한다. 

 

예제 ) 다음과 같은 백업이 있을 때 복원 

/data/backups/base
/data/backups/inc1
/data/backups/inc2

- 기본 백업을 준비하려면 --perpare 옵션에  --apply-log-only 옵션을 사용하여 롤백 단계를 방지한다. 

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

- 첫번째 증분 백업을 전체 백업에 적용

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1

- 두번째 증분 백업을 전체 백업에 적용

※ --apply-log-only 옵션은 마지막 증분 백업을 적용할때는 사용하지 않는다.

xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2

복원은 전체 백업과 동일하게 xtrabackup 실행시 --copy-back 또는 --move-back 옵션을 사용한다. 

 

압축 백업

- 압축 백업을 만들려면 --compress 옵션을 사용한다. 

 xtrabackup --backup --compress --target-dir=/data/compressed/

- 압축 백업을 사용하려면 qpress 패키지가 필요하다.

- --compress-threads 옵션으로 압축 속도를 높일 수 있다.

# 4개의 스레드를 사용한 압축 백업
trabackup --backup --compress --compress-threads=4 \
--target-dir=/data/compressed/

압축 백업본으로 복원 준비

- --decompress 옵션으로 압축을 해제한다. 

 xtrabackup --decompress --target-dir=/data/compressed/

- --parallel 옵션을 사용해서 동시에 여러파일의 압축을 해제할 수 있다.

- 압축이 해제되도 압축된 백업파일은 삭제되지 않는다. 

  --copy-back, --move-back 옵션 사용시에 압축된 백업 파일은 복사되지 않는다. 

  --remove-original 옵션을 사용할 경우 압축된 백업파일이 삭제된다. 

- 백업 파일의 압축이 해제되면 --prepare 옵션을 사용하여 복원을 준비할 수 있다.

xtrabackup --prepare --target-dir=/data/compressed/

백업 복원 

- xtrabackup 실행시 --copy-back 또는 --move-back 옵션을 사용하여 기존의 data 디렉토리에 복원한다.

xtrabackup --copy-back --target-dir=/data/backups/

 

참고

https://www.percona.com/doc/percona-xtrabackup/8.0/index.html

'MySQL' 카테고리의 다른 글

MySQL JSON, Generated Columns  (0) 2022.09.15
MySQL Performance Best Practice  (0) 2021.12.26
xtrabackup 8.0 (1)  (0) 2021.06.30
Hash join in MySQL 8  (0) 2021.06.25
Redo Log  (0) 2021.06.25

+ Recent posts