현재 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-basedir로 full backup의 Path를 지정하여 주면
해당 path의 xtrabackup_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은 기본적으로 데이터의 파일을 그대로 복사하는 시스템으로 백업하기 때문에
Service를 Stop 후 복원해야 한다.(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 8은 Percona xtrabackup 8을 이용해야 하고
Mysql 5.7 은 Percona xtrabackup 2.4를 이용하게 됨으로
백업 데이터간 Process가 동일해야 하는데 xtrabackup 2.4와 8은 다음과 같은 Process를 따른다.
xtrarbackup 은 performance_schema.log_status의 gtid를 기반으로 작동하는 시스템이다.
gtid란 source_id:transaction_Id를 말하고 source_id는 server_uuid 이다.
xtrarbackup 8의 경우 write가 빈도가 높게 발생 시 bin Log과 gtid가 일치하지 않는 현상이 발생된다.
이 때 마지막 bin Log을 복사함으로 써 모든 로그를 커버하게 하는 구조이다.
따라서 백업이 복원된 후 2.4와 gtid가 매칭되지 않는 이슈가 발생되면서 Replica에 이슈가 발생된다.
참조
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
'Database > Mysql & Mariadb' 카테고리의 다른 글
Mysql 8과 Mariadb 10의 Backup 이슈(3) [backup conflict] (0) | 2021.10.13 |
---|---|
Mysql 8과 Mariadb 10의 Backup 이슈(2) [mariabackup] (0) | 2021.10.13 |
MySQL 8 기본 collation 이슈 (0) | 2021.10.07 |
MySQL 8 계정 이슈 (0) | 2021.10.06 |
Mysql JDBC Connector TimeZone 에러 (0) | 2021.10.05 |
최근댓글