wiki:MariaDB mariabackup

mariabackup

mariabackup은 MariaDB 10.1.23부터 사용 가능한 백업 방법이다. InnoDB, Aria와 MyISAM 테이블을 백업할 수 있다. 아래 내용은 10.3 버전부터 테스트했기 때문에 10.2 이하 바전에서 사용할 때는 주의할 것.

mysqldump라는 훌륭한 백업 방법이 있음에도 mariabackup을 사용하는 이유는 mysqldump의 단점이 있기 때문이다.

  1. 데이터가 크면 클수록 백업과 복원 시간이 오래 걸린다. 특히 인덱스 등이 많은 경우에는 특히 복원 시간이 더 걸린다. 백업 파일이 큰 편이기도 하다.

mariabackup의 장점은

  1. 백업과 복원이 빠르다. 과장해서 말하면 mysqldump를 이용하지 않고 mariabackup을 이용하는 단 하나의 이유라고 볼 수 있다.
    • mysqldump든 mariabackup이든 MyISAM 을 백업할 때는 백업이 끝날 때까지 모든 테이블에 글로벌 읽기 잠금을 해야 한다. 백업 시간이 길면 길수록 그 시간동안 데이터베이스를 읽는 것만 가능하고 쓰기가 되지 않기 때문에 문제가 된다. 물론 잠금을 걸지 않는 옵션도 있다. 하지만 잠금을 걸지 않으면 백업된 데이터베이스의 일관성이 보장되지 않는다.

단점은 다음과 같다.

  1. InnoDB, Aria, MyISAM, MyRocks 스토리지 엔진만 지원한다.
  2. 백업한 mariabackup의 버전과 복원할 때의 mariabackup의 버전이 다르면 복원이 안될 수 있다.
  3. 원격 서버에서 백업하기 어렵다. 즉 로컬 서버에서만 실행해야 한다.
  4. 백업 파일이 크기가 큰 경우가 있다. 특히 부분 백업일 때 그렇다.
  5. 10.1.23 버전 이후부터만 사용할 수 있다.

설치

배포판 패키지 설치

RHEL 7에서는 MariaDB 10.x 대를 디폴트로 지원하진 않는다.

RHEL 8에서는 디폴트로 MariaDB 10.3을 지원한다. mariadb-backup 패키지를 설치하면 된다.

dnf install mariadb-backup

MariaDB 사이트 패키지 설치

배포판에서 지원하는 MariaDB를 설치하지 않고 MariaDB 사이트에서 제공하는 MariaDB 패키지를 설치한 경우에는 패키지 이름이 조금 다르다. MariaDB-backup 패키지를 설치하면 된다.

dnf install MariaDB-backup

호환성

일반적으로 MariaDB 서버 버전과 mariabackup의 버전이 소숫점 둘 째 자리까지 같다면 백업에 별 문제가 없다. 예를 들어 MariaDB 10.2.21 은 10.2.22 버전의 mariabackup으로 백업할 수 있다. 반대로 MariaDB 10.2.22를 10.2.21 버전의 mariabackup으로 백업할 수도 있다.

그러나 MariaDB 서버나 mariabackup 에 버그 픽스가 포함되었을 때는 이전 버전과의 호환성이 깨질 수 있다. 예를 들어 10.2.19 버전.

따라서 MariaDB 서버와 같은 버전의 mariabackup으로 백업하고 같은 버전의 MariaDB 서버에 복원하는 것을 권장한다. mysqldump를 쓰던 습관대로 mariabackup을 버전에 상관없이 사용하다보면 백업을 복원하지 못하는 문제가 생길 수 있다.

실행 권한

파일 시스템 권한

MariaDB 서버에 접속해서 SQL문을 실행해 백업하는 mysqldump와 달리 mariabackup은 MariaDB의 파일을 직접 백업한다. 따라서 mysqldump는 MariaDB 권한이 필요한 반면, mariabackup은 테이블스페이스 파일을 읽을 수 있는 파일 시스템 권한이 있어야 한다.

일반 사용자가 mariabackup을 실행하면 MariaDB 디렉토리에 접근할 수 없다는 에러가 발생하면서 core dump가 된다.

[Warning] InnoDB: Unable to open "./ib_logfile0" to check native AIO read support.
[Warning] InnoDB: Linux Native AIO disabled.
[ERROR] InnoDB: Operating system error number 13 in a file operation.
[ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.
...
중지됨 (core dumped)

파일 시스템 권한이 필요하기 때문에 원격 서버를 백업하기 어려운 단점이 있다. 그래서 —host 옵션도 존재하긴 하지만 쓸모가 없다.

MariaDB 권한

mariabackup은 MariaDB의 파일이 어디에 저장되어 있는지 등의 정보를 파악하고 테이블을 잠그는 등의 작업을 하기 위해 MariaDB에 접속한다.

따라서 파일 권한만 있으면 되는 것이 아니라 MariaDB에도 적절한 권한(RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 글로벌 권한)이 필요하다.

CREATE USER 'mariabackup'@'localhost' IDENTIFIED BY 'mypassword';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mariabackup'@'localhost';

MyRocks 스토리지 엔진을 사용한다면 SUPER 글로벌 권한도 추가로 필요하다.

—history 옵션을 사용하기 위해서는 다음 권한도 추가해야 한다. 향후에는 사용하는 테이블 명이 바뀔 걸로 예상한다.

GRANT CREATE ON PERCONA_SCHEMA.* TO 'mariabackup'@'localhost';
GRANT INSERT ON PERCONA_SCHEMA.* TO 'mariabackup'@'localhost';

1. full 백업과 복원

https://mariadb.com/kb/en/full-backup-and-restore-with-mariabackup/

1.1. full 백업

데이터베이스를 백업하기 위해선 —backup 옵션과 함께 백업한 파일을 저장할 타겟 디렉토리를 —target-dir 옵션에 지정해야 한다. full 백업을 할 때는 타겟 디렉토리가 비어있어야 한다. 타겟 디렉토리로 지정한 디렉토리가 없으면 새로 만든다. 다만 부모 디렉토리는 존재해야 한다.

# mariabackup --backup --target-dir=/var/mariadb/backup/ --user=mariabackup --password=mypassword

타겟 디렉토리가 비어있지 않으면 에러가 발생한다.

1.2. 복원

1.2.1. 전체 복원 준비

mariabackup으로 타겟 디렉토리에 백업한 파일은 각각 백업한 시각이 다르다. 따라서 이를 바로 복원하면 데이터에 일관성이 없어서 복원이 되지 않는다.

따라서 복원하기 전에 먼저 —prepare 옵션으로 데이터에 일관성이 있도록 만들어야 한다. mariabackup은 InnoDB redo 로그를 이용해 일관성을 맞춘다.

# mariabackup --prepare  --target-dir=/var/mariadb/backup/

1.2.2. 전체 복원

백업은 —copy-back 이나 —move-back 옵션으로 복원할 수 있다. —copy-back 옵션은 백업 파일을 지우지 않는다. 반면에 —move-back 옵션은 백업 파일을 지운다.

절차는 다음과 같다.

  1. MariaDB를 중지한다.
    # systemctl stop mariadb
    
  2. data 디렉토리 안에 있는 파일을 모두 지운다.
    # \rm -r /var/lib/mysql/*
    
  3. —copy-back 이나 —move-back 옵션으로 mariabackup을 실행한다.
    # mariabackup --copy-back --target-dir=/var/mariadb/backup/
    
  4. 복원된 파일의 소유권과 권한을 수정한다.
    # chown -R mysql.mysql /var/lib/mysql/*
    # restorecon -R /var/lib/mysql/
    
  5. MariaDB를 시작한다.
    # systemctl start mariadb
    

1.2.3. 전체 복원하는 다른 방법

full backup한 것을 —prepare 옵션으로 일관성있게 만들었다면 MariaDB data 디렉토리와 완벽히 동일하다. 따라서 MariaDB 서버를 중지하고 타겟 디렉토리의 파일을 data 디렉토리에 옮기면 데이터를 복원할 수 있다. 다음은 rsync를 이용해 복원하는 예이다.

# rsync -avrP /var/mariadb/backup /var/lib/mysql/
# chown -R mysql.mysql /var/lib/mysql/
# restorecon -R /var/lib/mysql/

MariaDB 10.2.10 이전 버전을 사용한다면 기존의 InnoDB redo 로그 파일을 삭제해야 한다.

# rm /var/lib/mysql/ib_logfile*

1.2.4. 특정 테이블/파티션 복원

full 백업 등에서 특정 테이블만 골라 복원하려면 부분백업을 복원하는 것과 동일한 방법을 쓰면 된다.

https://mariadb.com/kb/en/restoring-individual-tables-and-partitions-with-mariabackup/

2. 부분 백업과 복원

https://mariadb.com/kb/en/partial-backup-and-restore-with-mariabackup/

테이블이나 파티션당 InnoDB 테이블스페이스 파일(.ibd 파일)이 따로 생성되기만 하면, 원하는 데이터베이스나 테이블을 골라 부분 백업을 할 수 있다.

테이블스페이스란 데이터와 인덱스가 저장되어 있는 파일 시스템을 말한다. innodb_file_per_table 값을 ON으로 설정하면, InnoDB 테이블 당 .ibd 확장자를 가진 하나의 테이블스페이스 파일이 만들어진다.

MariaDB> show variables like 'innodb_file_per%'';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+

InnoDB가 아니라면 부분 백업을 못한다는 뜻인가 하면 그렇진 않다. MyISAM인 경우에는 MariaDB 서버를 중지하고 백업한 .frm, .MYD, .MYI 파일을 적절한 장소에 옮기고 권한을 조정한 다음 MariaDB 서버를 재시작하면 복원이 가능하다.

다만 InnoDB인 경우에는 서버를 중지하지 않은 상태에서 복원이 가능하다. 테이블 하나하나씩 수작업으로 복원해야 하는 불편은 있다.

2.1. 부분 백업

특정 데이터베이스나 테이블만 백업하려면 —databases 옵션을 사용한다.

# mariabackup --backup --target-dir=/hems-backup/ --databases="openfire hems.account" --user=mariabackup --password=mypassword
  • —databases 옵션을 지정할 때는 정규식을 쓸 수 없다. 반드시 명시적인 이름을 적어야 한다. 데이터베이스 이름을 명시적으로 지정하고 않고 다음처럼 정규식을 사용해서 백업한 경우에는 백업할 때 오류 메시지는 나오지 않았으나 백업 파일이 제대로 생성되지 않아 복구에 실패했다.
    mariabackup --backup --target-dir=/var/mariadb/backup/ --databases='app1_.*' --user=mariabackup --password=mypassword
    
  • —databases 옵션에는 스페이스로 구분해서 여러 데이터베이스를 지정할 수도 있고, '데이터베이스.테이블' 형식으로 테이블도 지정할 수 있다.
  • 데이터베이스를 지정하지 않고 테이블만 지정할 때는 —tables 옵션을 사용한다. —tables 옵션에는 정규식을 사용할 수 있다. 그러나 —databases 옵션처럼 스페이스로 여러 테이블을 지정할 수는 없다.
  • —databases 와 —tables 옵션을 같이 썼을 때는 —tables 옵션을 무시한다.

데이터베이스에서 특정 테이블만 제외하고 모두 백업하려면 —tables-exclude 옵션을 사용한다. —tables-exclude 옵션에도 정규식을 사용할 수 있다. 그러나 —databases 옵션처럼 스페이스로 여러 테이블을 지정할 수는 없다. —tables 옵션과 —tables-exclude 옵션을 같이 썼을 때는 —tables-exclude 옵션이 우선한다.

# mariabackup --backup --target-dir=/hems-backup/ --databases=hems --tables-exclude=switch_trans_json --user=mariabackup --password=mypassword

특정 데이터베이스나 테이블을 제외하고 모두 백업하려면 —databases-exclude 옵션을 사용한다. —databases 옵션과 —databases-exclude 옵션을 같이 썼을 때는 —databases-exclude 옵션이 우선한다.

# mariabackup --backup --target-dir=/hems-backup/ \
    --databases-exclude="hems.aircon_trans_json hems.occupant_json hems.switch_trans_json hems.meter_hour test" \
    --user=mariabackup --password=mypassword

2.2. 부분 백업 복원

부분 백업을 복원하는 것은 full 백업을 복원하는 것과는 많이 다르다. 테이블이 저장된 개별 InnoDB 파일을 복원하려는 서버에 옮겨서 수작업으로 임포트를 해야 한다. 임포트하는 과정은 파티션이 포함되어 있는지 아닌지에 따라 달라진다. 여기서는 파티션이 안된 경우에 대해서만 적는다.

2.2.1. 복원 준비

mariabackup으로 타겟 디렉토리에 백업한 파일은 각각 백업한 시각이 다르다. 따라서 이를 바로 복원하면 데이터에 일관성이 없어서 복원이 되지 않는다.

따라서 full 백업을 복원할 때처럼 부분 백업을 복원하기 전에 먼저 —prepare 옵션으로 데이터에 일관성이 있도록 만들어야 한다. full 백업을 복원할 때와의 차이점은 —export 옵션도 같이 적어줘야 한다는 것이다. —export 옵션을 적어줘야 .cfg 확장자를 가진 파일이 생성된다. .ibd와 .cfg 파일이 있어야 부분 백업을 복원할 수 있다.

# mariabackup --prepare --export --target-dir=/var/mariadb/backup/

2.2.2. 파티션되지 않은 테이블 임포트

부분 백업한 파티션되지 않은 테이블을 복원하려면 다음과 같이 한다.

  1. 먼저 서버에 복원할 테이블을 만든다. 원본 서버의 테이블을 만들 때와 동일한 CREATE TABLE 명령을 써서 테이블을 만든다. 이 과정 때문에 부분 백업할 때 DDL 문도 같이 백업해야 한다.
    CREATE TABLE test.t1 (
       id INT PRIMARY KEY AUTO_INCREMENT,
       name VARCHAR(50)
    ) ENGINE=InnoDB;
    
  2. DDL 문으로 테이블을 만든 후에는 ALTER TABLE … DISCARD TABLESPACE 명령으로 새로 만든 테이블의 테이블스페이스를 삭제한다. (.frm 파일만 남기고 .ibd 파일을 지우는 명령이다.)
    ALTER TABLE test.t1 DISCARD TABLESPACE;
    
  3. 그 다음에는 .ibd 파일과 .cfg 파일을 복원할 서버의 적절한 위치(.frm 파일이 있는 디렉토리)에 옮긴다. 어떤 이유로든 .cfg 파일이 없고 .ibd 파일만 있는 경우에는 .ibd 파일만으로 복원을 시도해볼 가치는 있다.
    # scp /data/tablespaces/t1.ibd target-server.com:/var/lib/mysql/test/
    # scp /data/tablespaces/t1.cfg target-server.com:/var/lib/mysql/test/
    
  4. 옮긴 .ibd 파일과 .cfg 파일의 소유자를 mysql.mysql로 바꿔준다.
    # chown mysql.mysql /var/lib/mysql/test/t1.cfg
    # chown mysql.mysql /var/lib/mysql/test/t1.ibd
    # restorecon -R /var/lib/mysql/
    
  5. ALTER TABLE … IMPORT TABLESPACE 명령으로 새로 옮긴 .ibd 파일을 인식시킨다.
    ALTER TABLE test.t1 IMPORT TABLESPACE;
    

3. 증분 백업과 복원

https://mariadb.com/kb/en/incremental-backup-and-restore-with-mariabackup/

InnoDB 페이지는 로그 시퀀스 번호(LSN)를 포함하고 있다.InnoDB을 변경할 때마다 로그 시퀀스 번호는 증가한다. 증분 백업을 할 때 mariabackup은 데이터베이스와 백업의 가장 최근의 LSN을 확인하고 이전 백업 이후의 변경 사항을 백업한다.

InnoDB가 아닌 MyISAM 테이블 같은 경우에는 LSN을 활용할 수 없기 때문에 증분 백업 명령을 내려도 실제적으로는 증분만 백업하는 것이 아니라 전체 데이터를 백업한다. 따라서 MyISAM이 대부분인 데이터베이스에서는 full 백업을 하는게 더 나을 수 있다.

3.1. 증분 백업

증분 백업을 하기 위해서는 먼저 full 백업이 필요하다. full 백업하는 방법은 1.1. full 백업 참조.

full 백업의 타겟 디렉토리에 보면 xtrabackup_checkpoints 파일이 있는데, 파일 내용은 다음과 비슷하다.

# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 35909276172
last_lsn = 35909276181

full 백업 이후에 증분 백업을 한다.

# mariabackup --backup \
   --target-dir=/var/mariadb/inc1/ \
   --incremental-basedir=/var/mariadb/backup/ \
   --user=mariabackup --password=mypassword
  • 증분 백업을 하기 위해서는 반드시 —incremental-basedir 옵션으로 이전 백업의 타겟 디렉토리를 적어줘야 한다. 그래야 이전 백업 이후의 변경 사항을 백업할 수 있다.
  • —target-dir 옵션에는 변경 사항이 백업될 디렉토리를 지정한다. 비어 있어야 하는 점은 full 백업 때와 마찬가지다. 타겟 디렉토리로 지정한 디렉토리가 없으면 새로 만든다. 다만 부모 디렉토리는 존재해야 한다.

증분 백업의 타겟 디렉토리에도 xtrabackup_checkpoints 파일이 있는데, 파일 내용은 다음과 비슷하다.

# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 35909276172
to_lsn = 35909310501
last_lsn = 35909310510

증분 백업을 한 이후에 다시 증분 백업을 하려면 마찬가지로 —incremental-basedir 옵션으로 이전 백업의 타겟 디렉토리를 적어주고 타겟 디렉토리로 비어있는 디렉토리를 지정하면 된다.

# mariabackup --backup \
   --target-dir=/var/mariadb/inc2/ \
   --incremental-basedir=/var/mariadb/inc1/ \
   --user=mariabackup --password=mypassword

3.2. 증분 백업 복원

3.2.1. 복원 준비

  1. full 백업을 먼저 —prepare 옵션으로 mariabackup을 실행해 데이터에 일관성이 있도록 만들어야 한다.
    # mariabackup --prepare --target-dir=/var/mariadb/backup
    
  2. full 백업에 증분 백업의 변화를 차례대로 적용한다. 타겟 디렉토리는 full 백업의 타겟 디렉토리임에 주의할 것.
    # mariabackup --prepare --target-dir=/var/mariadb/backup --incremental-dir=/var/mariadb/inc1
    # mariabackup --prepare --target-dir=/var/mariadb/backup --incremental-dir=/var/mariadb/inc2
    ...
    

3.2.2. 증분 백업 복원

순차적으로 증북 백업의 변화를 full 백업에 적용한 다음에는 백업을 복원한다. 백업을 복원하는 절차는 full 백업을 복원할 때의 절차와 동일하다.

  1. MariaDB를 중지한다.
    # systemctl stop mariadb
    
  2. data 디렉토리 안에 있는 파일을 모두 지운다.
    # \rm -r /var/lib/mysql/*
    
  3. —copy-back 이나 —move-back 옵션으로 mariabackup을 실행한다. —copy-back 옵션은 백업 파일을 지우지 않는다. 반면에 —move-back 옵션은 백업 파일을 지운다.
    # mariabackup --copy-back --target-dir=/var/mariadb/backup/
    
  4. 복원된 파일의 소유권과 권한을 수정한다.
    # chown -R mysql.mysql /var/lib/mysql/*
    # restorecon -R /var/lib/mysql/
    
  5. MariaDB를 시작한다.
    # systemctl start mariadb
    

처음으로

Last modified 4 weeks ago Last modified on Nov 11, 2025, 6:25:52 PM
Note: See TracWiki for help on using the wiki.