Changes between Initial Version and Version 1 of MariaDB mariabackup


Ignore:
Timestamp:
Nov 11, 2025, 6:25:52 PM (4 weeks ago)
Author:
yongwoo
Comment:

Legend:

Unmodified
Added
Removed
Modified
  • MariaDB mariabackup

    v1 v1  
     1[[PageOutline]]
     2= mariabackup =
     3mariabackup은 MariaDB 10.1.23부터 사용 가능한 백업 방법이다. InnoDB, Aria와 MyISAM 테이블을 백업할 수 있다. 아래 내용은 10.3 버전부터 테스트했기 때문에 10.2 이하 바전에서 사용할 때는 주의할 것.
     4
     5["MariaDB mysqldump" mysqldump]라는 훌륭한 백업 방법이 있음에도 mariabackup을 사용하는 이유는 ["MariaDB mysqldump" mysqldump]의 단점이 있기 때문이다.
     61. 데이터가 크면 클수록 백업과 복원 시간이 오래 걸린다. 특히 인덱스 등이 많은 경우에는 특히 복원 시간이 더 걸린다. 백업 파일이 큰 편이기도 하다.
     7
     8
     9mariabackup의 장점은
     101. 백업과 복원이 빠르다. 과장해서 말하면 ["MariaDB mysqldump" mysqldump]를 이용하지 않고 mariabackup을 이용하는 단 하나의 이유라고 볼 수 있다.
     11 - ["MariaDB mysqldump" mysqldump]든 mariabackup이든 MyISAM 을 백업할 때는 백업이 끝날 때까지 모든 테이블에 글로벌 읽기 잠금을 해야 한다. 백업 시간이 길면 길수록 그 시간동안 데이터베이스를 읽는 것만 가능하고 쓰기가 되지 않기 때문에 문제가 된다. 물론 잠금을 걸지 않는 옵션도 있다. 하지만 잠금을 걸지 않으면 백업된 데이터베이스의 일관성이 보장되지 않는다.
     12
     13단점은 다음과 같다.
     14 1. InnoDB, Aria, MyISAM, ["MariaDB MyRocks" MyRocks] 스토리지 엔진만 지원한다.
     15 1. 백업한 mariabackup의 버전과 복원할 때의 mariabackup의 버전이 다르면 복원이 안될 수 있다.
     16 2. 원격 서버에서 백업하기 어렵다. 즉 로컬 서버에서만 실행해야 한다.
     17 3. 백업 파일이 크기가 큰 경우가 있다. 특히 부분 백업일 때 그렇다.
     18 1. 10.1.23 버전 이후부터만 사용할 수 있다.
     19
     20== 설치 ==
     21=== 배포판 패키지 설치 ===
     22RHEL 7에서는 MariaDB 10.x 대를 디폴트로 지원하진 않는다.
     23
     24RHEL 8에서는 디폴트로 MariaDB 10.3을 지원한다. mariadb-backup 패키지를 설치하면 된다.
     25{{{
     26dnf install mariadb-backup
     27}}}
     28
     29=== MariaDB 사이트 패키지 설치 ===
     30배포판에서 지원하는 MariaDB를 설치하지 않고 ["MariaDB 설치#MariaDB사이트패키지" MariaDB 사이트에서 제공하는 MariaDB 패키지를 설치]한 경우에는 패키지 이름이 조금 다르다. MariaDB-backup 패키지를 설치하면 된다.
     31{{{
     32dnf install MariaDB-backup
     33}}}
     34
     35== 호환성 ==
     36일반적으로 MariaDB 서버 버전과 mariabackup의 버전이 소숫점 둘 째 자리까지 같다면 백업에 별 문제가 없다. 예를 들어 MariaDB 10.2.21 은 10.2.22 버전의 mariabackup으로 백업할 수 있다. 반대로 MariaDB 10.2.22를 10.2.21 버전의 mariabackup으로 백업할 수도 있다.
     37
     38그러나 MariaDB 서버나 mariabackup 에 버그 픽스가 포함되었을 때는 이전 버전과의 호환성이 깨질 수 있다. 예를 들어 10.2.19 버전.
     39
     40따라서 MariaDB 서버와 '''같은 버전의 mariabackup으로 백업하고 같은 버전의 MariaDB 서버에 복원'''하는 것을 권장한다. ["MariaDB mysqldump" mysqldump]를 쓰던 습관대로 mariabackup을 버전에 상관없이 사용하다보면 백업을 복원하지 못하는 문제가 생길 수 있다.
     41
     42== 실행 권한 ==
     43=== 파일 시스템 권한 ===
     44MariaDB 서버에 접속해서 SQL문을 실행해 백업하는 ["MariaDB mysqldump" mysqldump]와 달리 mariabackup은 MariaDB의 파일을 직접 백업한다. 따라서 ["MariaDB mysqldump" mysqldump]는 MariaDB 권한이 필요한 반면, mariabackup은 테이블스페이스 파일을 읽을 수 있는 파일 시스템 권한이 있어야 한다.
     45
     46일반 사용자가 mariabackup을 실행하면 MariaDB 디렉토리에 접근할 수 없다는 에러가 발생하면서 core dump가 된다.
     47{{{
     48[Warning] InnoDB: Unable to open "./ib_logfile0" to check native AIO read support.
     49[Warning] InnoDB: Linux Native AIO disabled.
     50[ERROR] InnoDB: Operating system error number 13 in a file operation.
     51[ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.
     52...
     53중지됨 (core dumped)
     54}}}
     55
     56파일 시스템 권한이 필요하기 때문에 원격 서버를 백업하기 어려운 단점이 있다. 그래서 --host 옵션도 존재하긴 하지만 쓸모가 없다.
     57
     58=== MariaDB 권한 ===
     59mariabackup은 MariaDB의 파일이 어디에 저장되어 있는지 등의 정보를 파악하고 테이블을 잠그는 등의 작업을 하기 위해 MariaDB에 접속한다.
     60
     61따라서 파일 권한만 있으면 되는 것이 아니라 MariaDB에도 적절한 권한(RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 글로벌 권한)이 필요하다.
     62{{{
     63CREATE USER 'mariabackup'@'localhost' IDENTIFIED BY 'mypassword';
     64GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mariabackup'@'localhost';
     65}}}
     66
     67["MariaDB MyRocks" MyRocks 스토리지 엔진]을 사용한다면 SUPER 글로벌 권한도 추가로 필요하다.
     68
     69--history 옵션을 사용하기 위해서는 다음 권한도 추가해야 한다. 향후에는 사용하는 테이블 명이 바뀔 걸로 예상한다.
     70{{{
     71GRANT CREATE ON PERCONA_SCHEMA.* TO 'mariabackup'@'localhost';
     72GRANT INSERT ON PERCONA_SCHEMA.* TO 'mariabackup'@'localhost';
     73}}}
     74
     75
     76== 1. full 백업과 복원 ==
     77https://mariadb.com/kb/en/full-backup-and-restore-with-mariabackup/
     78=== 1.1. full 백업 ===
     79데이터베이스를 백업하기 위해선 --backup 옵션과 함께 백업한 파일을 저장할 타겟 디렉토리를 --target-dir 옵션에 지정해야 한다. full 백업을 할 때는 타겟 디렉토리가 비어있어야 한다. 타겟 디렉토리로 지정한 디렉토리가 없으면 새로 만든다. 다만 부모 디렉토리는 존재해야 한다.
     80{{{
     81# mariabackup --backup --target-dir=/var/mariadb/backup/ --user=mariabackup --password=mypassword
     82}}}
     83
     84타겟 디렉토리가 비어있지 않으면 에러가 발생한다.
     85
     86=== 1.2. 복원 ===
     87==== 1.2.1. 전체 복원 준비 ====
     88mariabackup으로 타겟 디렉토리에 백업한 파일은 각각 백업한 시각이 다르다. 따라서 이를 바로 복원하면 데이터에 일관성이 없어서 복원이 되지 않는다.
     89
     90따라서 복원하기 전에 먼저 --prepare 옵션으로 데이터에 일관성이 있도록 만들어야 한다. mariabackup은 InnoDB redo 로그를 이용해 일관성을 맞춘다.
     91
     92{{{
     93# mariabackup --prepare  --target-dir=/var/mariadb/backup/
     94}}}
     95==== 1.2.2. 전체 복원 ====
     96백업은 --copy-back 이나 --move-back 옵션으로 복원할 수 있다. --copy-back 옵션은 백업 파일을 지우지 않는다. 반면에 --move-back 옵션은 백업 파일을 지운다.
     97
     98절차는 다음과 같다.
     99 1. MariaDB를 중지한다.
     100{{{
     101# systemctl stop mariadb
     102}}}
     103 2. data 디렉토리 안에 있는 파일을 모두 지운다.
     104{{{
     105# \rm -r /var/lib/mysql/*
     106}}}
     107 3. --copy-back 이나 --move-back 옵션으로 mariabackup을 실행한다.
     108{{{
     109# mariabackup --copy-back --target-dir=/var/mariadb/backup/
     110}}}
     111 4. 복원된 파일의 소유권과 권한을 수정한다.
     112{{{
     113# chown -R mysql.mysql /var/lib/mysql/*
     114# restorecon -R /var/lib/mysql/
     115}}}
     116 5. MariaDB를 시작한다.
     117{{{
     118# systemctl start mariadb
     119}}}
     120
     121==== 1.2.3. 전체 복원하는 다른 방법 ====
     122full backup한 것을 --prepare 옵션으로 일관성있게 만들었다면 MariaDB data 디렉토리와 완벽히 동일하다. 따라서 MariaDB 서버를 중지하고 타겟 디렉토리의 파일을 data 디렉토리에 옮기면 데이터를 복원할 수 있다. 다음은 rsync를 이용해 복원하는 예이다.
     123{{{
     124# rsync -avrP /var/mariadb/backup /var/lib/mysql/
     125# chown -R mysql.mysql /var/lib/mysql/
     126# restorecon -R /var/lib/mysql/
     127}}}
     128MariaDB 10.2.10 이전 버전을 사용한다면 기존의 InnoDB redo 로그 파일을 삭제해야 한다.
     129{{{
     130# rm /var/lib/mysql/ib_logfile*
     131}}}
     132==== 1.2.4. 특정 테이블/파티션 복원 ====
     133full 백업 등에서 특정 테이블만 골라 복원하려면 [#a2.2.부분백업복원 부분백업을 복원]하는 것과 동일한 방법을 쓰면 된다.
     134
     135https://mariadb.com/kb/en/restoring-individual-tables-and-partitions-with-mariabackup/
     136
     137
     138== 2. 부분 백업과 복원 ==
     139https://mariadb.com/kb/en/partial-backup-and-restore-with-mariabackup/
     140
     141테이블이나 파티션당 InnoDB 테이블스페이스 파일(.ibd 파일)이 따로 생성되기만 하면, 원하는 데이터베이스나 테이블을 골라 부분 백업을 할 수 있다.
     142
     143테이블스페이스란 데이터와 인덱스가 저장되어 있는 파일 시스템을 말한다. innodb_file_per_table 값을 ON으로 설정하면, InnoDB 테이블 당 .ibd 확장자를 가진 하나의 테이블스페이스 파일이 만들어진다.
     144{{{
     145MariaDB> show variables like 'innodb_file_per%'';
     146+-----------------------+-------+
     147| Variable_name         | Value |
     148+-----------------------+-------+
     149| innodb_file_per_table | ON    |
     150+-----------------------+-------+
     151}}}
     152
     153InnoDB가 아니라면 부분 백업을 못한다는 뜻인가 하면 그렇진 않다. MyISAM인 경우에는 MariaDB 서버를 중지하고 백업한 .frm, .MYD, .MYI 파일을 적절한 장소에 옮기고 권한을 조정한 다음 MariaDB 서버를 재시작하면 복원이 가능하다.
     154
     155다만 InnoDB인 경우에는 서버를 중지하지 않은 상태에서 복원이 가능하다. 테이블 하나하나씩 수작업으로 복원해야 하는 불편은 있다.
     156
     157=== 2.1. 부분 백업 ===
     158특정 데이터베이스나 테이블만 백업하려면 --databases 옵션을 사용한다.
     159{{{
     160# mariabackup --backup --target-dir=/hems-backup/ --databases="openfire hems.account" --user=mariabackup --password=mypassword
     161}}}
     162 * --databases 옵션을 지정할 때는 정규식을 쓸 수 없다. 반드시 명시적인 이름을 적어야 한다. 데이터베이스 이름을 명시적으로 지정하고 않고 다음처럼 정규식을 사용해서 백업한 경우에는 백업할 때 오류 메시지는 나오지 않았으나 백업 파일이 제대로 생성되지 않아 복구에 실패했다.
     163{{{
     164mariabackup --backup --target-dir=/var/mariadb/backup/ --databases='app1_.*' --user=mariabackup --password=mypassword
     165}}}
     166 * --databases 옵션에는 스페이스로 구분해서 여러 데이터베이스를 지정할 수도 있고, '데이터베이스.테이블' 형식으로 테이블도 지정할 수 있다.
     167 * 데이터베이스를 지정하지 않고 테이블만 지정할 때는 --tables 옵션을 사용한다. --tables 옵션에는 정규식을 사용할 수 있다. 그러나 --databases 옵션처럼 스페이스로 여러 테이블을 지정할 수는 없다.
     168 * --databases 와 --tables 옵션을 같이 썼을 때는 --tables 옵션을 무시한다.
     169
     170데이터베이스에서 특정 테이블만 제외하고 모두 백업하려면 --tables-exclude 옵션을 사용한다. --tables-exclude 옵션에도 정규식을 사용할 수 있다. 그러나 --databases 옵션처럼 스페이스로 여러 테이블을 지정할 수는 없다. --tables 옵션과 --tables-exclude 옵션을 같이 썼을 때는 --tables-exclude 옵션이 우선한다.
     171{{{
     172# mariabackup --backup --target-dir=/hems-backup/ --databases=hems --tables-exclude=switch_trans_json --user=mariabackup --password=mypassword
     173}}}
     174
     175특정 데이터베이스나 테이블을 제외하고 모두 백업하려면 --databases-exclude 옵션을 사용한다. --databases 옵션과 --databases-exclude 옵션을 같이 썼을 때는 --databases-exclude 옵션이 우선한다.
     176{{{
     177# mariabackup --backup --target-dir=/hems-backup/ \
     178    --databases-exclude="hems.aircon_trans_json hems.occupant_json hems.switch_trans_json hems.meter_hour test" \
     179    --user=mariabackup --password=mypassword
     180}}}
     181
     182=== 2.2. 부분 백업 복원 ===
     183부분 백업을 복원하는 것은 full 백업을 복원하는 것과는 많이 다르다. 테이블이 저장된 개별 InnoDB 파일을 복원하려는 서버에 옮겨서 수작업으로 임포트를 해야 한다. 임포트하는 과정은 파티션이 포함되어 있는지 아닌지에 따라 달라진다. 여기서는 파티션이 안된 경우에 대해서만 적는다.
     184
     185==== 2.2.1. 복원 준비 ====
     186mariabackup으로 타겟 디렉토리에 백업한 파일은 각각 백업한 시각이 다르다. 따라서 이를 바로 복원하면 데이터에 일관성이 없어서 복원이 되지 않는다.
     187
     188따라서 full 백업을 복원할 때처럼 부분 백업을 복원하기 전에 먼저 --prepare 옵션으로 데이터에 일관성이 있도록 만들어야 한다. full 백업을 복원할 때와의 차이점은 --export 옵션도 같이 적어줘야 한다는 것이다. --export 옵션을 적어줘야 .cfg 확장자를 가진 파일이 생성된다. .ibd와 .cfg 파일이 있어야 부분 백업을 복원할 수 있다.
     189{{{
     190# mariabackup --prepare --export --target-dir=/var/mariadb/backup/
     191}}}
     192==== 2.2.2. 파티션되지 않은 테이블 임포트 ====
     193부분 백업한 파티션되지 않은 테이블을 복원하려면 다음과 같이 한다.
     194
     195 1. 먼저 서버에 복원할 테이블을 만든다. 원본 서버의 테이블을 만들 때와 동일한 CREATE TABLE 명령을 써서 테이블을 만든다. 이 과정 때문에 부분 백업할 때 DDL 문도 같이 백업해야 한다.
     196{{{
     197CREATE TABLE test.t1 (
     198   id INT PRIMARY KEY AUTO_INCREMENT,
     199   name VARCHAR(50)
     200) ENGINE=InnoDB;
     201}}}
     202 2. DDL 문으로 테이블을 만든 후에는 ALTER TABLE ... DISCARD TABLESPACE 명령으로 새로 만든 테이블의 테이블스페이스를 삭제한다. (.frm 파일만 남기고 .ibd 파일을 지우는 명령이다.)
     203{{{
     204ALTER TABLE test.t1 DISCARD TABLESPACE;
     205}}}
     206 3. 그 다음에는 .ibd 파일과 .cfg 파일을 복원할 서버의 적절한 위치(.frm 파일이 있는 디렉토리)에 옮긴다. 어떤 이유로든 .cfg 파일이 없고 .ibd 파일만 있는 경우에는 .ibd 파일만으로 복원을 시도해볼 가치는 있다.
     207{{{
     208# scp /data/tablespaces/t1.ibd target-server.com:/var/lib/mysql/test/
     209# scp /data/tablespaces/t1.cfg target-server.com:/var/lib/mysql/test/
     210}}}
     211 4. 옮긴 .ibd 파일과 .cfg 파일의 소유자를 mysql.mysql로 바꿔준다.
     212{{{
     213# chown mysql.mysql /var/lib/mysql/test/t1.cfg
     214# chown mysql.mysql /var/lib/mysql/test/t1.ibd
     215# restorecon -R /var/lib/mysql/
     216}}}
     217 5. ALTER TABLE ... IMPORT TABLESPACE 명령으로 새로 옮긴 .ibd 파일을 인식시킨다.
     218{{{
     219ALTER TABLE test.t1 IMPORT TABLESPACE;
     220}}}
     221
     222== 3. 증분 백업과 복원 ==
     223https://mariadb.com/kb/en/incremental-backup-and-restore-with-mariabackup/
     224
     225InnoDB 페이지는 로그 시퀀스 번호(LSN)를 포함하고 있다.InnoDB을 변경할 때마다 로그 시퀀스 번호는 증가한다. 증분 백업을 할 때 mariabackup은 데이터베이스와 백업의 가장 최근의 LSN을 확인하고 이전 백업 이후의 변경 사항을 백업한다.
     226
     227InnoDB가 아닌 MyISAM 테이블 같은 경우에는 LSN을 활용할 수 없기 때문에 증분 백업 명령을 내려도 실제적으로는 증분만 백업하는 것이 아니라 전체 데이터를 백업한다. 따라서 MyISAM이 대부분인 데이터베이스에서는 full 백업을 하는게 더 나을 수 있다.
     228
     229=== 3.1. 증분 백업 ===
     230증분 백업을 하기 위해서는 먼저 full 백업이 필요하다. full 백업하는 방법은 [#a1.1.full백업 1.1. full 백업] 참조.
     231
     232full 백업의 타겟 디렉토리에 보면 xtrabackup_checkpoints 파일이 있는데, 파일 내용은 다음과 비슷하다.
     233{{{
     234# cat xtrabackup_checkpoints
     235backup_type = full-backuped
     236from_lsn = 0
     237to_lsn = 35909276172
     238last_lsn = 35909276181
     239}}}
     240
     241full 백업 이후에 증분 백업을 한다.
     242{{{
     243# mariabackup --backup \
     244   --target-dir=/var/mariadb/inc1/ \
     245   --incremental-basedir=/var/mariadb/backup/ \
     246   --user=mariabackup --password=mypassword
     247}}}
     248 * 증분 백업을 하기 위해서는 반드시 --incremental-basedir 옵션으로 이전 백업의 타겟 디렉토리를 적어줘야 한다. 그래야 이전 백업 이후의 변경 사항을 백업할 수 있다.
     249 * --target-dir 옵션에는 변경 사항이 백업될 디렉토리를 지정한다. 비어 있어야 하는 점은 full 백업 때와 마찬가지다. 타겟 디렉토리로 지정한 디렉토리가 없으면 새로 만든다. 다만 부모 디렉토리는 존재해야 한다.
     250
     251증분 백업의 타겟 디렉토리에도 xtrabackup_checkpoints 파일이 있는데, 파일 내용은 다음과 비슷하다.
     252{{{
     253# cat xtrabackup_checkpoints
     254backup_type = incremental
     255from_lsn = 35909276172
     256to_lsn = 35909310501
     257last_lsn = 35909310510
     258}}}
     259
     260증분 백업을 한 이후에 다시 증분 백업을 하려면 마찬가지로 --incremental-basedir 옵션으로 이전 백업의 타겟 디렉토리를 적어주고 타겟 디렉토리로 비어있는 디렉토리를 지정하면 된다.
     261{{{
     262# mariabackup --backup \
     263   --target-dir=/var/mariadb/inc2/ \
     264   --incremental-basedir=/var/mariadb/inc1/ \
     265   --user=mariabackup --password=mypassword
     266}}}
     267
     268=== 3.2. 증분 백업 복원 ===
     269
     270==== 3.2.1. 복원 준비 ====
     271 1. full 백업을 먼저 --prepare 옵션으로 mariabackup을 실행해 데이터에 일관성이 있도록 만들어야 한다.
     272{{{
     273# mariabackup --prepare --target-dir=/var/mariadb/backup
     274}}}
     275 2. full 백업에 증분 백업의 변화를 차례대로 적용한다. 타겟 디렉토리는 full 백업의 타겟 디렉토리임에 주의할 것.
     276{{{
     277# mariabackup --prepare --target-dir=/var/mariadb/backup --incremental-dir=/var/mariadb/inc1
     278# mariabackup --prepare --target-dir=/var/mariadb/backup --incremental-dir=/var/mariadb/inc2
     279...
     280}}}
     281
     282==== 3.2.2. 증분 백업 복원 ====
     283순차적으로 증북 백업의 변화를 full 백업에 적용한 다음에는 백업을 복원한다. 백업을 복원하는 절차는 [#a1.2.2.전체복원 full 백업을 복원]할 때의 절차와 동일하다.
     284
     285 1. MariaDB를 중지한다.
     286{{{
     287# systemctl stop mariadb
     288}}}
     289 2. data 디렉토리 안에 있는 파일을 모두 지운다.
     290{{{
     291# \rm -r /var/lib/mysql/*
     292}}}
     293 3. --copy-back 이나 --move-back 옵션으로 mariabackup을 실행한다. --copy-back 옵션은 백업 파일을 지우지 않는다. 반면에 --move-back 옵션은 백업 파일을 지운다.
     294{{{
     295# mariabackup --copy-back --target-dir=/var/mariadb/backup/
     296}}}
     297 4. 복원된 파일의 소유권과 권한을 수정한다.
     298{{{
     299# chown -R mysql.mysql /var/lib/mysql/*
     300# restorecon -R /var/lib/mysql/
     301}}}
     302 5. MariaDB를 시작한다.
     303{{{
     304# systemctl start mariadb
     305}}}
     306
     307
     308----
     309[WikiStart 처음으로]