Mysql 8과 Mariadb 10의 Backup 이슈(2) [mariabackup]

Database/Mysql & Mariadb / /
728x90

Mariadb 10이 되면서 Mariadb MariaBackup을 같이 지원하게 되었다.

Mariadb 10.5 부터는 Xtrabackup을 더 이상 지원하지 않고 MariaBackup을 사용해야 한다.

이에 따라 Mariabackup의 사용법을 다음과 같이 서술한다.

 

MariaBackup 설치

현재 stable한 최신 버전이 10.6이나 system characterutf8mb3로 변경되면서

Tools 사용불가 이슈가 생겨 10.5로 이용한다.

(.net framework driver에서 utf8mb3 지원하지 않음)

apt update

apt install -y software-properties-common

apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

add-apt-repository "deb [arch=amd64,arm64,ppc64el] https://mirror.yongbok.net/mariadb/repo/10.5/ubuntu $(lsb_release -sc) main"

apt update

apt install -y mariadb-backup

 

설치 후 xtrabackup과 같이 백업 권한을 가진 계정을 생성해야 한다.

1.      Process

A.     SHOW ENGINE INNODB STATUS 실행

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

2.      RELOAD, LOCK TABLES

A.     FLUSH TABLES WITH READ LOCK 실행 권한

B.      FLUSH ENGINE LOGS를 실행 권한

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

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

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

CREATE USER 'bkMaria'@'%' IDENTIFIED BY 'Your_password';

GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkMaria'@'%';

GRANT CREATE ON PERCONA_SCHEMA.* TO 'bkMaria'@'%';

GRANT INSERT ON PERCONA_SCHEMA.* TO 'bkMaria'@'%';

FLUSH PRIVILEGES;

 

만약 DB엔진이 MyRocks라면 SUPER 글로벌 권한도 줘야 한다.

Mariadb-Backuprocksdb_create_checkpoint 시스템 변수를 사용하여

데이터 검사점을 생성하기 때문이다.

GRANT SUPER ON *.* TO 'bkMaria'@'%';

FLUSH PRIVILEGES;

 

MariaBackup을 이용한 백업

기본적인 사용법은 xtrabackup과 매우 유사하다.

아래 방법은 full backup 관련 명령이다.

mariabackup \

--backup \

--history \ 백업 기록 남김

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

--password='Your Password' 

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

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

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

 

위와 같은 명령어를 진행하면 target-dir에 다음과 같이 백업되는 것을 확인할 수 있다.

drwx------ 5 root root 4.0K Oct 13 02:28 .

drwxr-xr-x 3 root root 4.0K Oct 13 02:28 ..

-rw-r----- 1 root root  72K Oct 13 02:28 aria_log.00000001

-rw-r----- 1 root root   52 Oct 13 02:28 aria_log_control

-rw-r----- 1 root root  297 Oct 13 02:28 backup-my.cnf

-rw-r----- 1 root root  976 Oct 13 02:28 ib_buffer_pool

-rw-r----- 1 root root 8.5K Oct 13 02:28 ib_logfile0

-rw-r----- 1 root root  12M Oct 13 02:28 ibdata1

drwx------ 2 root root 4.0K Oct 13 02:28 mysql

drwx------ 2 root root 4.0K Oct 13 02:28 performance_schema

drwx------ 2 root root 4.0K Oct 13 02:28 test

-rw-r----- 1 root root   73 Oct 13 02:28 xtrabackup_checkpoints

-rw-r----- 1 root root  501 Oct 13 02:28 xtrabackup_info

 

xtrabackup과 마찬 가지로 xtrabackup_checkpoints 파일에서 백업된 LSN을 확인할 수 있다.

backup_type = full-backuped

from_lsn = 0

to_lsn = 45118

last_lsn = 51221

 

증분 백업은 full backup이 진행된 이 후 다음과 같은 명령어를 통해 백업한다.

xtrabackup과 마찬가지로 full backup 이후 또는 증분 백업 이후 LSN으로부터 현재 LSN까지 백업한다.

mariabackup \

--backup \

--user=bkMaria \

--password='Your Password'

--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 = 45118

to_lsn = 45118

last_lsn = 57750

 

이후 LSN 증가를 확인할 수 있고 추가적은 증분 백업을 진행하려면 다음과 같이 진행한다.

mariabackup \

--backup \

--user=bkMaria \

--password='Your Password' \

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

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

 

backup_type = incremental

from_lsn = 45118

to_lsn = 45118

last_lsn = 59720

 

MariaBackup을 이용한 복원

복원 또한 xtrabackup과 마찬가지로 prepare  무결성 및 일관성을 확인 후 복원한다.

먼저 mysql 서비스를 종료하고 기존에 있는 데이터 폴더를 비워준다.(또는 백업 후 비워준다.)

systemctl stop mysql

cp -r /var/lib/mysql /home/user/mysql/

rm -rf /var/lib/mysql

 

--apply-log-only 옵션은 10.2 이후부터 자동 설정되어 수동 지정이 지원되지 않는 점이 xtrabackup과 다르다.

mariabackup \

--prepare \

--target-dir=/mnt/backups/mysql/

 

mariabackup \

--prepare \

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

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

 

mariabackup \

--prepare \

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

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

 

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

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

 

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

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

systemctl start mysql

 

MariaBackup을 압축 백업

xtrabackup과 마찬가지로 압축 백업을 지원하는데 Mariabakcup은 압축 알고리즘을 지원한다.

기본적으로 알고리즘을 선택하지 않을 시 quicklz 알고리즘을 사용한다.

하지만 mariadb는 해당 옵션이 아닌 서드파티의 압축과 암호화를 사용하기를 권장한다.

압축 백업을 이용하기 위해서는 gpress가 필요하다.(decompress 시 사용)

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 install -y qpress

 

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

mariabackup \

--backup \

--compress 압축 옵션

--compress-threads=4 압축 실행 쓰레드

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

--password='Your Password' 

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

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

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

 

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

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

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

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

mariabackup \

--decompress \

--parallel=1 \

--remove-original \

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

 

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

systemctl stop mysql

cp -r /var/lib/mysql /home/user/mysql/

rm -rf /var/lib/mysql

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

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

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

systemctl start mysql

 

MariaBackup을 이슈

1.     default datadir 없음 이슈

Mariadb 10.3.10 이전 버전의 cnf에는 datadir이 주석으로 빠져 있다.

cnf 파일에 datadir을 지정해주지 않으면 다음과 같은 오류를 발생 시킬 수 있다.

Error: datadir must be specified.

 

2.     Backup과 동시에 DDL 발생

Mariadb 10.3.10 이전 버전에서 발생됨

한 가지 예로 Backup Tables Space ID가 변경되면

( : TRUNCATE TABLE 또는 RENAME TABLE )

테이블이 백업과 일치 않게 되고 다음과 같은 오류를 발생 시킬 수 있다.

2018-12-07 07:49:32 7f51b3184820  InnoDB: Error: table 'DB1/TAB_TEMP'

InnoDB: in InnoDB data dictionary has tablespace id 1355633,

InnoDB: but a tablespace with that id does not exist. There is

InnoDB: a tablespace of name DB1/TAB_TEMP and id 1354713, though. Have

InnoDB: you deleted or moved .ibd files?

InnoDB: Please refer to

InnoDB: http://dev.mysql.com/doc/refman/5.6/en/....../hooting-datadict.html

InnoDB: for how to resolve the issue.

 

2018-07-12 21:24:14 139666981324672 

[Note] InnoDB: Ignoring data file 'db1/tab1.ibd' with space ID 200485, 

since the redo log references db1/tab1.ibd with space ID 200484.

 

3.     수동으로 innodb redo log 복사 복구 시 오류

Mariadb 10.2.10 이전 버전에서 발생됨

ib_logfile 파일을 기준으론 mariabackup이 진행되기 때문에

ib_logfile[N] 파일이 남아 있을 시 복원할 DB가 백업된 N 번호 이후의 로그와

맞지 않기 때문에 복원 시 오류가 발생된다.

 

4.     테이블 파일이 너무 많을 시 이슈

Mariadb 10.3.14 이전 버전에서 발생됨

mariabackup의 구성이 허용한 것보다 많은 파일을 백업하면 다음과 같은 오류 발생

2019-02-12 …… InnoDB: Operating system error number 23 in a file operation.

InnoDB: Error number 23 means 'Too many open files in system'.

InnoDB: Some operating system error numbers are described at

InnoDB: http://dev.mysql.com/doc/refman/5.6/en/operating-system-error-codes.html

InnoDB: Error: could not open single-table tablespace file ./db1/tab1.ibd

InnoDB: We do not continue the crash recovery, because the table may become

InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.

InnoDB: To fix the problem and start mysqld:

InnoDB: 1) If there is a permission problem in the file and mysqld cannot

InnoDB: open the file, you should modify the permissions.

InnoDB: 2) If the table is not needed, or you can restore it from a backup,

InnoDB: then you can remove the .ibd file, and InnoDB will do a normal

InnoDB: crash recovery and ignore that table.

InnoDB: 3) If the file system or the disk is broken, and you cannot remove

InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf

InnoDB: and force InnoDB to continue crash recovery here.

 

해당 오류를 해결하기 위해서는 cnf 파일에 명시적으로 limit-size 설정한다.

[mariabackup]

open_files_limit=65535

 

참조

https://runebook.dev/ko/docs/mariadb/mariabackup-overview/index

https://runebook.dev/ko/docs/mariadb/full-backup-and-restore-with-mariabackup/index

https://runebook.dev/ko/docs/mariadb/incremental-backup-and-restore-with-mariabackup/index

https://mariadb.com/kb/en/mariabackup-options/

 

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