Skip to content
> giho's blog
Go back

~/posts/mariadb-backup-restore

MariaDB/MySQL 백업·복구 실전 정리 — mariabackup와 mysqldump

· 6 min read
-- contents

물리 백업(mariabackup)과 논리 백업(mysqldump)을 상황별로 정리했다. 명령의 IP·계정·비밀번호는 전부 예시 플레이스홀더다.

Warning

백업 스크립트에 평문 비밀번호를 박아두지 말 것. mysql_config_editor(로그인 패스), ~/.my.cnf(권한 600), 또는 실행 시 -p로 프롬프트 입력을 쓴다. 스크립트를 노트/저장소에 올릴 때 특히 조심(실제 자격증명 유출의 단골).

mariabackup 물리 백업

논리 덤프보다 빠르고, 대용량에서 특히 유리하다. --backup → --prepare → --copy-back 3단계가 핵심.

설치

# yum으로 DB를 설치했다면
yum install MariaDB-backup

백업 → prepare

# 1) 백업 (mysql OS 계정 또는 root로 수행)
mariabackup --user=backup_user --password=**** --backup \
  --no-lock --target-dir=/backup

# 2) prepare (필수)
mariabackup --prepare --target-dir=/backup

--prepare를 왜 하냐면, 백업이 진행되는 동안 발생한 변경분을 반영해 정합성을 맞추기 위해서다. 그 변경은 리다이렉트 로그(ib_logfile)에 기록돼 있고, prepare 단계에서 데이터 파일에 적용된다. 서버와 통신하지 않으므로 원격지로 옮긴 뒤 prepare 해도 된다.

Tip

--no-lock을 빼면 백업 동안 락이 걸린다. 온라인 백업이 목적이면 넣는다(InnoDB 기준).

복원 (copy-back)

systemctl stop mariadb
rm -rf /var/lib/mysql/*                       # 기존 데이터 디렉토리 비우기
mariabackup --copy-back --target-dir=/backup  # (--move-back 도 가능)
chown -R mysql:mysql /var/lib/mysql/*         # root로 했다면 소유권 원복
systemctl start mariadb

원격지로 스트리밍

디스크에 떨구지 않고 SSH로 바로 다른 노드에 푼다.

mariabackup --user=backup_user --password=**** --backup --no-lock \
  --target-dir=/backup --stream=mbstream \
  | ssh user@db02 "mbstream -x -C /backup"

복구 후 복제 연결

copy-back 한 복제본을 마스터에 붙일 때는 백업 시점의 위치가 필요하다. 그 정보는 백업 디렉토리에 있다.

cat /backup/xtrabackup_binlog_info   # binlog 파일명, position, GTID

binlog position 방식

CHANGE MASTER TO
  master_host='db01', master_port=3306,
  master_user='repl', master_password='****',
  master_log_file='mysql-bin.000040', master_log_pos=123456789;
START SLAVE;
SHOW SLAVE STATUS\G

GTID 방식 (권장)

STOP SLAVE;
CHANGE MASTER TO
  master_host='db01', master_port=3306,
  master_user='repl', master_password='****',
  master_use_gtid=slave_pos;
START SLAVE;
Important

GTID로 복제를 구성해야 MaxScale의 자동 failover/switchover가 정상 동작한다. binlog position으로 붙여두면 마스터가 바뀌는 순간 슬레이브가 따라오지 못한다.

mysqldump 논리 백업

이식성이 좋고 부분 백업에 유리하다. 옵션 몇 개가 성패를 가른다.

mysqldump -h db01 -u backup_user -p \
  -R --single-transaction --quick --master-data=2 \
  --databases mydb > mydb.sql

Aurora / RDS 주의점

관리형 환경은 권한 제약이 있어 옵션을 바꿔야 한다.

mysqldump -h myinstance.xxxx.ap-northeast-2.rds.amazonaws.com -u backup_user -p \
  --skip-lock-tables --set-gtid-purged=OFF --max-allowed-packet=1G \
  --databases mydb > mydb.sql

덤프에서 특정 테이블만 뽑기

전체 덤프 파일에서 테이블 하나만 필요할 때, 다시 덤프 뜨지 말고 sed로 잘라낸다.

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' full-dump.sql > mytable.sql

데이터만, 조건부로 백업

스키마 없이 특정 조건의 데이터만 뽑을 때.

mysqldump -u backup_user -p --no-create-info --complete-insert \
  mydb mytable --where="created_at > '2026-01-01 00:00:00'" > data.sql

정리



-- related


Previous Post
MySQL 모니터링 스택 구축 — Prometheus/exporter와 PMM
Next Post
MariaDB MaxScale 운영 정리 — 자동 failover와 읽기/쓰기 분리
giho=#searchesc