Mysql 8과 Mariadb 10의 Backup 이슈(1) [xtrabackup]

Database/Mysql & Mariadb / /
728x90

 

현재 MySQL 8로의 버전 업이 stable 해지고 Mariadb 또한 버전업이 지속되면서

기존에 사용하던 Backup 방식에 대한 차이가 발생되었다.

 

MySQL 8 XtraBackup 8 버전 이상을 사용해야 하고

Mariadb 10.5 부터는 Mariadb Xtrabackup을 더 이상 지원하지 않고

MariadbBackup을 사용해야 한다.

 

XtraBackup MariadbBackup의 사용법을 살펴보고 왜 더 이상의 지원이 불가해졌는지에

대해 알아보고자 한다.

 

MySQL 8 – Percona XtraBackup 8 설치

설치는 다음과 같이 진행한다.

apt update

apt install -y wget

패키지 파일 다운로드

wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb

dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

apt update

apt search percona | grep percona-xtrabackup-

 

# xtrabackup, qpress(파일 압축 사용설치 

apt install -y percona-xtrabackup-80 qpress

 

백업 용 계정 생성 또는 동일한 권한을 가진 계정이 있어야 한다.

XtraBackup이 필요한 권한은 다음과 같다.

1.      BACKUP_ADMIN

A.     performance_schema.log_status 테이블 쿼리

B.      LOCK INSTANCE FOR BACKUP 실행 권한

C.      LOCK BINLOG FOR BACKUP 실행 권한

D.     LOCK TABLES FOR BACKUP 실행 권한

2.      PROCESS

A.     SHOW ENGINE INNODB STATUS 실행

B.      서버에서 실행중인 모든 스레드를 보기 위한 권한

3.      RELOAD, LOCK TABLES

A.     FLUSH TABLES WITH READ LOCK 실행 권한

B.      FLUSH ENGINE LOGS를 실행 권한

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

5.      CREATE TABLESPACE : import tables 를 위한 권한

6.      SUPER

A.     복제구성에서 복제 스레드 시작/중지를 위한 권한

B.      FLUSH TABLES WITH READ LOCK 실행 권한(증분백업을 위한 변경 페이지 추적)

7.      CREATE : PERCONA_SCHEMA.xtrabackup_history 데이터베이스, 테이블을 생성 권한

8.      INSERT : PERCONA_SCHEMA.xtrabackup_history 테이블에 히스토리 INSERT 권한

9.      SELECT

A.     PERCONA_SCHEMA.xtrabackup_history 테이블에서 innodb_to_lsn 조회

B.      --incremental-history-name 또는 --incremental-history-uuid 을 사용 권한

계정 생성 예제는 다음과 같다.

CREATE USER 'bkXtra'@'%' IDENTIFIED BY 'testPassword';

GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT 

ON *.* TO 'bkXtra'@'%';

GRANT SELECT ON performance_schema.log_status TO 'bkXtra'@'%';

GRANT SELECT ON performance_schema.keyring_component_status 

TO 'bkXtra'@'%';

FLUSH PRIVILEGES;

 

Percona XtraBackup을 이용한 백업

XtraBakcup을 이용한 full bakcup

xtrabackup --default-file=/etc/my.cnf \

--user=bkXtra #(백업 실행 계정)

--password=a12345 

--backup \

--host=10.0.04 #접속할 MySQL서버 ip 

--port=3032 #접속할 MySQL서버 포트 

--socket=/var/run/mysqld/mysqld.socket #접속할 MySQL 서버 소켓파일(mysqld.cnf 확인

--target-dir=/mnt/backups/mysql #백업할 디렉토리

 

Server가 재시작 가능한 상태라면 mysqld.cnf에 다음과 같이 target을 지정할 수 있다.

[xtrabackup]

target_dir=/mnt/backups/mysql/

 

위와 같이 연결테스트 겸 full backup을 진행하면 다음과 같이

해당 위치에 백업이 완료되는 것을 확인할 수 있다.

drwxr-x--- 6 root root 4.0K Oct  8 05:03 .

drwxr-xr-x 3 root root 4.0K Oct  8 05:03 ..

-rw-r----- 1 root root  475 Oct  8 05:03 backup-my.cnf

-rw-r----- 1 root root  156 Oct  8 05:03 binlog.000040

-rw-r----- 1 root root   16 Oct  8 05:03 binlog.index

-rw-r----- 1 root root 3.4K Oct  8 05:03 ib_buffer_pool

-rw-r----- 1 root root  12M Oct  8 05:03 ibdata1

drwxr-x--- 2 root root 4.0K Oct  8 05:03 mysql

-rw-r----- 1 root root  24M Oct  8 05:03 mysql.ibd

drwxr-x--- 2 root root 4.0K Oct  8 05:03 performance_schema

drwxr-x--- 2 root root 4.0K Oct  8 05:03 sys

drwxr-x--- 2 root root 4.0K Oct  8 05:03 test

-rw-r----- 1 root root  16M Oct  8 05:03 undo_001

-rw-r----- 1 root root  16M Oct  8 05:03 undo_002

-rw-r----- 1 root root   18 Oct  8 05:03 xtrabackup_binlog_info

-rw-r----- 1 root root  102 Oct  8 05:03 xtrabackup_checkpoints

-rw-r----- 1 root root  596 Oct  8 05:03 xtrabackup_info

-rw-r----- 1 root root 2.5K Oct  8 05:03 xtrabackup_logfile

-rw-r----- 1 root root   39 Oct  8 05:03 xtrabackup_tablespaces

 

증분 백업은 기존에 full backup되었던 내용 중 xtrabackup_checkpoint를 기준으로 백업된 LSN에서 현재까지의 LSN으로 백업한다.

backup_type = full-prepared

from_lsn = 0

to_lsn = 18377651

last_lsn = 18377651

flushed_lsn = 18377651

 

다음과 같이 to_lsn 으로 마지막 백업된 LSN을 확인할 수 있다.

해당 명령어를 통해 증분 백업을 진행한다.

xtrabackup --backup \

--target-dir=/mnt/backups/inc1 \

--incremental-basedir=/mnt/backups/mysql

 

--incremental-basedirfull backup Path를 지정하여 주면

해당 pathxtrabackup_checkpoint를 확인하여 다음 lsn 까지 백업한다.

증분백업된 xtrabackup_checkpoint를 확인해보면 다음과 같다.

backup_type = incremental

from_lsn = 18377651

to_lsn = 18411442

last_lsn = 18411442

flushed_lsn = 18411442

 

다음과 같이 full backup 부터 이후 진행된 lsn 까지 backup되는 것을 확인할 수 있다.

증분 백업된 데이터를 기준으로 추가 증분 백업 또한 위의 예제와 같이 진행 한다.

xtrabackup --backup \

--target-dir=/mnt/backups/inc2 \

--incremental-basedir=/mnt/backups/inc1

 

백업된 내용에서 xtrabackup_checkpoint를 확인해보면

backup_type = incremental

from_lsn = 18411442

to_lsn = 18412082

last_lsn = 18412082

flushed_lsn = 18412082

 

다음과 같이 증가된 내용을 확인할 수 있다.

 

Percona XtraBackup을 이용한 복원

xtrabackup은 기본적으로 데이터의 파일을 그대로 복사하는 시스템으로 백업하기 때문에

ServiceStop 후 복원해야 한다.(system database도 같이 백업되기 때문)

systemctl stop mysql

 

또한, 기존의 data 파일을 폴더를 비워놓아야 한다.

rm -rf /var/lib/mysql

 

먼저 --prepare 옵션을 통해 백업파일의 무결성, 일관성 검증을 진행한다.

--apply-log-only 옵션을 이용하여 발생될 커밋되지 않은 트랜잭션의 롤백 단계를 방지한다.

해당 옵션은 마지막 복원할 증분 백업에서는 사용하지 않는다.

xtrabackup --prepare --apply-log-only --target-dir=/mnt/backups/mysql/

xtrabackup --prepare --apply-log-only --target-dir=/mnt/backups/mysql/ \

--incremental-dir=/mnt/backups/inc1

xtrabackup --prepare --apply-log-only --target-dir=/mnt/backups/mysql/ \

--incremental-dir=/mnt/backups/inc2

 

복원은 --copy-back, --move-back 을 이용하여 복원이 가능하다.

xtrabackup --copy-back --target-dir=/mnt/backups/mysql/

 

복원 후 생성된 데이터 폴더에 권한을 변경하고 서비스를 재시작 한다.

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

systemctl start mysql

 

Percona XtraBackup을 압축 백업

압축 백업을 이용하기 위해서는 gpress가 필요하다.

다음과 같이 명령어로 백업한다. --compress-threads 옵션을 통해 압축 쓰레드수를 지정해 속도를 높일 수 있다.

xtrabackup --backup --compress --compress-threads=4 \

--target-dir=/mnt/backups/compressed/

 

압축된 백업을 복원하기 위해서는 다음과 같은 압축 해제가 필요하다.

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

복원 시 압축된 파일은 복사되지 않는다.

--remove-original 옵션을 사용하면 압축해제 시 압축되었던 파일은 제거된다.

xtrabackup --decompress \

--parallel=1 \

--remove-original \

--target-dir=/mnt/backups/compressed/

 

압축 해제되면 본래 복원과 같이 prepare --copy-back, --move-back 등으로 복원한다.

xtrabackup --prepare --target-dir=/mnt/backups/compressed/

xtrabackup --copy-back --target-dir=/mnt/backups/compressed/

 

Percona XtraBackup 이 버전간 복원에 따른 이슈

Xtrabackup을 통한 Backup 데이터를 이용하여 이 버전간 Replica를 시도하면 이슈가 발생된다.

Mysql 8Percona xtrabackup 8을 이용해야 하고

Mysql 5.7 Percona xtrabackup 2.4를 이용하게 됨으로

백업 데이터간 Process가 동일해야 하는데 xtrabackup 2.48은 다음과 같은 Process를 따른다.


 

xtrarbackup performance_schema.log_statusgtid를 기반으로 작동하는 시스템이다.

gtidsource_id:transaction_Id를 말하고 source_idserver_uuid 이다.

xtrarbackup 8의 경우 write가 빈도가 높게 발생 시 bin Loggtid가 일치하지 않는 현상이 발생된다.

이 때 마지막 bin Log을 복사함으로 써 모든 로그를 커버하게 하는 구조이다.

따라서 백업이 복원된 후 2.4gtid가 매칭되지 않는 이슈가 발생되면서 Replica에 이슈가 발생된다.

 

참조

https://developpaper.com/problem-location-summary-of-peronca-xtrabackup-8-0-the-difference-between-xtrabackup-2-4-and-8-0/

https://idea-sketch.tistory.com/45

https://myinfrabox.tistory.com/125

https://cipleme.tistory.com/20

https://kimdubi.github.io/mysql/mysql_gtid/

https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/apt_repo.html

 

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기