MySQL

[MySQL] Xtrabackup & Mariabackup

bbugge 2020. 7. 17. 18:57

// 백업 생성 및 복구가 빠르고, 테이블을 짧은 시간만 Lock을 잡음. 또한, 증분 백업을 할 수 있음. 등 여러 장점이 있음.

// 주로 hot backup 할 때 사용할 듯함.

// innobackupex는 내부적으로 xtrabackup을 호출해 백업을 실행함.
// innobackupex 스크립트 또는 xtrabackup 실행 파일을 실행하는 리눅스 계정은 백업 파일을 생성할 디스크의 파일 시스템에
읽기,쓰기,실행 권한을 모두 가지고 있어야함.

// xtrabackup에 필요한 권한
 - RELOAD, LOCK TABLES
   데이터 파일 복사를 시작하기 전에 flush tables with read lock 명령을 수행하기 위한 권한.
 - REPPLICATION CLIENT
   백업 시점의 바이너리 로그 파일 및 포지션 정보를 획득하기 위한 권한.
 - PROCESS
   show engine innodb status 명령을 수행하기위한 권한.
 - BACKUP_ADMIN
   backup 후 LSN 정보를 가져오기 위한 SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status 명령을 수행하기 위한 권한.
   
mysql> create user 'backupuser'@'localhost' identified by 'password';
mysql> grant reload, lock tables, replication client, process, backup_admin on *.* to 'backupuser'@'localhost';
mysql> grant select on performance_schema.* to 'backupuser'@'localhost';
mysql> flush privileges;

 

// xtrabackup 동작 원리
 - 백업 단계
1. 백업 시작 시의 LSN을 기록한다. 이 값은 데이터 파일을 복구할 때 데이터 파일의 일관성을 맞추기 위해 사용.
2. 데이터가 변경되는 것을 막기 위해 FLUSH TABLES WITH READ LOCK 명령이 실행됨.
3. 데이터 파일 복사한다. 이 때 백그라운드로 프로세스가 추가로 가동되며 리두 로그를 감시해 데이터가 변경될 때마다
xtrabackup_logfile 파일에 변경 내용을 백업한다.
※ innobackupex로 백업하면 InnoDB와 XtraDB 스토리지 엔진을 제외한 MyISAM 및 기타 스토리지 엔진과 .frm 파일백업을 추가로 진행.
4. MyISAM 스토리지 엔진 테이블을 모두 메모리에서 디스크로 플로시해서 데이터를 동기화한 뒤 MyISAM 스토리지 엔진과 .frm 파일을 
모두 복사한다.
5. LOCK 해제
6. MyISAM,InnoDB,XtraDB 스토리지 엔진 테이블은 동일한 시점에 백업이 종료됨. xtrabackup_checkpoints 파일에 백업의 시작 시점과
마지막 시점의 LSN이 기록됨.

 

 

// rsync 원격서버의 파일을 전송?하는 옵션

// --compress 옵션 사용하여 백업을 하게되면 백업 파일을 압축해 확장자가 .qp인 파일로 백업됨.
// .qp로 압축되여 백업된 파일을 압축 풀 때는 qpress라는 프로그램이 설치돼 있어야함.
qpress -d [압축된 파일명.qp] [압축을 풀 위치]

 

// mariadb에서는 mariabackup으로 사용되고 있음(버전 10.2 부터?).

$ mariabackup --decompress

 

// 백업 (xtrabackup 도 동일)

// 풀 백업

$ mariabackup --backup --rsync --user=username --password=pass --databases=dbname --target-dir=/fullBackup --compress --compress-thread=$(grep -c '^processor' /proc/cpuinfo)

// 증분 백업

$ mariabackup --backup --rsync --user=username --password=pass --incremental-basedir=/fullBackup --target-dir=/incrementBackup --compress --compress-thread=$(grep -c '^processor' /proc/cpuinfo)

 

 - prepare 단계
// xtrabackup을 사용한다면 prepare 옵션을 사용한 명령어를 두 번 수행한다.
// 첫 번째 prepare 단계에서는 xtrabackup_logfile을 백업된 데이터 파일에 적용해 일관성을 맞춘다.
// 두 번째 prepare 단계에서는 일관성이 맞춰진 데이터 파일과 함께 사용할 리두로그를 생성한다.
// 두 번째 prepare단계는 생략을 해도 mysql에서 리두로그 파일을 생성하면서 데이터베이스를 실행시키기 때문에 크게 문제되지는 않음.
$ mariabackup --prepare --target-dir=/fullBackup  --incremental-dir=/backup/incrementbackup

// innobackupex와 mariabackup에서는 xtrabackup의 두 단계를 한 번에 실행시키는 --apply-log 옵션이 있음.
innobackupex /backup/xtrabackup --apply-log

 

- restore 단계

// restore (xtrabackup 도 동일)

$ systemctl stop mysqld

$ rm -rf /var/lib/mysql

$ mariabackup --defaults-file=/clone/my.cnf --copy-back --target-dir=/fullBackup

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

$ systemctl start mysqld

 

※ innobackupex 사용 시 --target-dir 이 없으니 그냥 맨 뒤에 디렉토리 path를 붙여주면 됨