Mariadb 10이 되면서 Mariadb는 MariaBackup을 같이 지원하게 되었다.
Mariadb 10.5 부터는 Xtrabackup을 더 이상 지원하지 않고 MariaBackup을 사용해야 한다.
이에 따라 Mariabackup의 사용법을 다음과 같이 서술한다.
MariaBackup 설치
현재 stable한 최신 버전이 10.6이나 system character가 utf8mb3로 변경되면서
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-Backup이 rocksdb_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/
'Database > Mysql & Mariadb' 카테고리의 다른 글
MySQL Online DDL(1) [Algorithm] (0) | 2021.10.18 |
---|---|
Mysql 8과 Mariadb 10의 Backup 이슈(3) [backup conflict] (0) | 2021.10.13 |
Mysql 8과 Mariadb 10의 Backup 이슈(1) [xtrabackup] (0) | 2021.10.12 |
MySQL 8 기본 collation 이슈 (0) | 2021.10.07 |
MySQL 8 계정 이슈 (0) | 2021.10.06 |
최근댓글