MariaDB Galera Cluster 복구 가이드
환경: Rocky Linux 9 + MariaDB 10.11.16 Galera Cluster + NetApp NFS 백업 위치:
/bkup001/dump/작성일: 2026-05-15 / 버전 1.0
이 문서는
mariadb-dump 로 뜬 백업 파일을 사용해 데이터베이스를 원상 복구 하는 절차서입니다.
평시 백업 동작 점검은 별도 문서 mariadb-galera-backup-verify-guide.md 참고.
환경 정보
| 항목 | 값 |
|---|---|
| 클러스터 노드 | db-node-1, db-node-2, db-node-3 |
| MariaDB 버전 | 10.11.16 |
| 백업 위치 | /bkup001/dump/ |
| 데이터 디렉터리 | /var/lib/mysql/ |
| MariaDB 서비스 | mariadb |
| 백업 timer | mariadb-backup-dump.timer |
⚠️ 명령어 실행 중 묻는
Enter password:는 모두 MariaDB root 비밀번호 입니다.
복구 흐름
소요 시간: 데이터 크기에 따라 30분 ~ 2시간.
1. 복구 전 준비
1.1 자동 백업 timer 정지
복구 전 반드시 먼저 자동 백업을 정지합니다. 평상시에는 백업 전담 노드인 3번 노드(db-node-3)에서 수행하지만, 만약 3번 노드 장애로 인해 백업 노드가 타 노드로 이관되었다면 현재 백업 타이머가 활성화되어 실행 중인 대체 노드(1번 또는 2번)에서 아래 명령을 실행해야 합니다.
sudo systemctl stop mariadb-backup-dump.timer
sudo systemctl status mariadb-backup-dump.timer | grep Active
예상 출력:
⚠️ 중요: 3번 노드가 완전히 죽어서(다운) 접속할 수 없는 경우, 당연히 3번 노드에서는 중지 명령을 내릴 수 없습니다. 이 경우 백업 노드가 다른 노드로 이관되어 타이머가 작동 중인지 확인하고, 해당 대체 노드에서 타이머를 정지시키십시오. 복구 완료 후 7장에서 반드시 재가동합니다.
1.2 백업 파일 확인
예상 출력 예시:
-rw-r-----. 1 mysql mysql 795M May 15 02:00 mariadb_full_20260515_020003.sql.gz
-rw-r-----. 1 mysql mysql 792M May 14 02:00 mariadb_full_20260514_020001.sql.gz
...
복구에 사용할 파일을 정합니다 (보통 가장 최근 정상 백업):
1.3 백업 파일 무결성 검증
예상 출력:
⚠️
gzip FAILED면 해당 파일 사용 금지. 한 단계 이전 백업으로 재시도.
1.4 백업 사본 보관 (필수)
복구 도중 원본이 손상되거나 덮어쓰일 위험을 차단합니다.
sudo cp "${TARGET_BACKUP}" /var/tmp/restore_source.sql.gz
sudo ls -lh /var/tmp/restore_source.sql.gz
이후 모든 복구 명령은 이 사본을 사용합니다.
1.5 백업 내용 미리보기 (선택)
복구 전 백업에 어떤 DB 가 들어있는지 확인:
예상 출력 예시:
복구하려는 DB 가 포함되어 있는지 확인합니다.
2. 모든 노드 MariaDB 정지
각 노드에서 실행합니다. 순서는 상관없고, 가능한 빨리 세 노드 모두 정지시킵니다.
# db-node-1, db-node-2, db-node-3 각각에서
sudo systemctl stop mariadb
sudo systemctl status mariadb | grep Active
예상 출력:
세 노드 모두 inactive (dead) 인 것을 확인합니다.
3. 부트스트랩 노드 초기화
부트스트랩 노드 1대를 정합니다(보통 1번 node).
부트스트랩 노드에서만 실행:
# 기존 데이터 디렉터리를 백업으로 옮김 (삭제 아님 — 만약을 위해 보존)
sudo mv /var/lib/mysql /var/lib/mysql.bak.$(date +%Y%m%d_%H%M%S)
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
ls -ld /var/lib/mysql
예상 출력:
⚠️
mv한 백업 디렉터리 (/var/lib/mysql.bak.*) 는 복구 성공 확인까지 절대 삭제 금지. 7장 정리 단계에서 처리합니다.
4. 부트스트랩 + 백업 import
4.1 부트스트랩으로 기동
부트스트랩 노드에서:
예상 출력:
확인:
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_local_state_comment';"
예상 출력:
cluster_size = 1 정상 (아직 부트스트랩 노드만 떠 있음).
4.2 백업 import
비밀번호 입력 후 import 시작.
진행 중 주의사항:
- 출력은 거의 없습니다 (조용히 진행)
- 데이터 크기에 따라 수 분 ~ 수십 분 소요
- 절대 Ctrl+C 누르지 마세요
진행 상황 모니터링이 필요하면 별도 터미널 에서:
데이터 디렉터리 용량이 증가하면 정상 진행 중.
4.3 import 결과 1차 확인
예상 출력: 복구된 DB 목록이 보여야 합니다.
+--------------------+
| Database |
+--------------------+
| app_db |
| information_schema |
| log_db |
| mysql |
| performance_schema |
| sys |
+--------------------+
1.5 절에서 확인한 DB 목록이 모두 들어있는지 비교합니다.
5. 나머지 노드 순차 join
5.1 db-node-2 기동
db-node-2 에서:
# 기존 데이터 디렉터리도 보존 후 비우기
sudo mv /var/lib/mysql /var/lib/mysql.bak.$(date +%Y%m%d_%H%M%S)
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
sudo systemctl start mariadb
기동 후 SST(State Snapshot Transfer) 가 자동으로 시작됩니다. 부트스트랩 노드에서 데이터를 받아오는 과정이며 데이터 크기에 따라 시간이 걸립니다.
상태 확인 (Synced 될 때까지 30초 간격으로 반복):
예상 진행 순서:
Synced 가 나오면 다음 노드로.
5.2 db-node-3 기동
db-node-3 에서 5.1 과 동일하게:
sudo mv /var/lib/mysql /var/lib/mysql.bak.$(date +%Y%m%d_%H%M%S)
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
sudo systemctl start mariadb
Synced 확인:
6. 복구 후 검증
6.1 클러스터 최종 확인
아무 노드에서:
sudo mysql -u root -p -e "
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_local_state_comment';
"
✅ 통과 기준:
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_local_state_comment | Synced |
세 노드 모두에서 같은 결과가 나와야 합니다.
6.2 데이터 확인
# DB 별 테이블 개수
sudo mysql -u root -p -e "
SELECT table_schema, COUNT(*) AS table_count
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'performance_schema')
GROUP BY table_schema;
"
# 주요 테이블의 행 수 (필요한 만큼 반복)
sudo mysql -u root -p -e "SELECT COUNT(*) FROM <DB>.<주요_테이블>;"
장애 발생 직전 수치와 비교합니다.
⚠️ 백업이 새벽 02:00 기준이므로 그 이후 ~ 장애 시점 사이의 데이터는 손실됩니다. 이는 정상이며 백업 정책(매일 1회)에 따른 결과입니다.
6.3 애플리케이션 연결 테스트
애플리케이션이 정상 동작하는지 확인:
7. 마무리
7.1 자동 백업 timer 재가동 (필수)
복구 완료 후 백업이 지속적으로 수행되도록 자동 백업 타이머를 재가동합니다.
예상 출력:
NEXT 가 다음 날 02:00 으로 잡혀 있어야 정상.
⚠️ 백업 노드가 이관되어 복구를 진행한 경우의 타이머 재기동 규칙: 1. 3번 노드가 정상 복구되어 정상 기동된 경우: - 복구 과정에서 3번 노드가 정상 복구(Synced)되어 정상 동작한다면, 3번 노드(db-node-3)에서 백업 타이머를 재가동하고 활성화(
systemctl enable --now)합니다. - 이때 타 노드(1번 혹은 2번)에 임시로 켜두었던 백업 타이머가 있다면 반드시 중지 및 비활성화(systemctl disable --now)하여 중복 백업을 방지합니다. 2. 3번 노드가 여전히 장애 상태이거나 임시 대체 노드에서 계속 백업을 돌아야 하는 경우: - 현재 백업을 담당하고 있는 대체 백업 노드(1번 혹은 2번)에서 백업 타이머를 재가동합니다.
7.2 정리 (24시간 후 권장)
복구가 안정적이라고 확인된 후, 아래 파일들을 정리합니다:
# 데이터 디렉터리 백업 (각 노드)
sudo ls -ld /var/lib/mysql.bak.*
sudo rm -rf /var/lib/mysql.bak.<타임스탬프> # 충분히 확인 후 실행
# 복구 작업용 사본
sudo rm -f /var/tmp/restore_source.sql.gz
⚠️ 정리는 최소 24시간 모니터링 후 진행하세요. 그 사이 이상이 발견되면 8장 롤백이 가능합니다.
8. 롤백 (복구가 잘못된 경우)
3장에서 mv 로 보존한 /var/lib/mysql.bak.<타임스탬프> 디렉터리를 사용해 원래 상태로 되돌립니다.
# 1. 모든 노드 MariaDB 정지
sudo systemctl stop mariadb # 각 노드
# 2. 각 노드: 새로 만든 디렉터리 제거 후 원본 복원
sudo rm -rf /var/lib/mysql
sudo mv /var/lib/mysql.bak.<원래_타임스탬프> /var/lib/mysql
# 3. 부트스트랩 노드부터 재기동
sudo galera_new_cluster # 부트스트랩 노드
# 4. 나머지 노드 순차 기동
sudo systemctl start mariadb # 노드 2, 3 순서대로
각 노드 Synced 확인까지 4.1 / 5장 절차와 동일하게 진행합니다.
9. 트러블슈팅
| 증상 | 단계 | 해결 |
|---|---|---|
gzip: invalid magic |
1.3 | 백업 파일 손상. 이전 날짜 백업으로 재시도 |
ERROR 1045: Access denied for user 'root' |
전체 | MariaDB root 비밀번호 오류. 비밀번호 재확인 |
galera_new_cluster 후 다른 노드 join 안 됨 |
5.1 / 5.2 | 부트스트랩 노드의 방화벽/네트워크 확인 (4567, 4568, 4444 포트) |
wsrep_local_state_comment 가 Joining 에서 멈춤 |
5.1 / 5.2 | SST 진행 중. 큰 데이터는 수십 분 걸릴 수 있음. sudo tail -f /var/log/mariadb/mariadb.log 로 확인 |
| import 가 비정상적으로 느림 | 4.2 | NFS 지연 가능성. df -h /bkup001 확인. 사본을 로컬 디스크로 옮기는 것 고려 (1.4 의 /var/tmp/ 가 로컬이면 이미 OK) |
| import 중 디스크 풀 | 4.2 | /var/lib/mysql 용량 부족. import 중단 → 8장 롤백 → 디스크 확보 후 재시도 |
Backup End 메시지 없는 백업 파일 |
1.3 통과 후 발견 | import 가 도중에 끊겼던 백업일 수 있음. 이전 날짜 백업으로 재시도 |
9.1 로그 위치
| 로그 | 위치 |
|---|---|
| MariaDB 에러 로그 | /var/log/mariadb/mariadb.log |
| MariaDB 저널 | sudo journalctl -u mariadb -n 200 |
| 백업 작업 로그 | /bkup001/logs/dump_*.log |
부록: 자주 쓰는 명령어
클러스터 상태 한눈에
sudo mysql -u root -p -e "
SHOW STATUS LIKE 'wsrep_cluster_size';
SHOW STATUS LIKE 'wsrep_cluster_status';
SHOW STATUS LIKE 'wsrep_local_state_comment';
SHOW STATUS LIKE 'wsrep_ready';
"
디스크 확인
MariaDB 서비스 제어
sudo systemctl status mariadb
sudo systemctl stop mariadb
sudo systemctl start mariadb # 일반 시작 (기존 클러스터에 join)
sudo galera_new_cluster # 부트스트랩 시작 (첫 노드 전용)
체크리스트
□ 1.1 timer 정지
□ 1.2 사용할 백업 파일 확인
□ 1.3 gzip 무결성 검증 통과
□ 1.4 사본 보관 (/var/tmp/restore_source.sql.gz)
□ 2 모든 노드 mariadb 정지
□ 3 부트스트랩 노드 데이터 디렉터리 초기화
□ 4.1 galera_new_cluster 기동, cluster_size=1 + Synced
□ 4.2 백업 import 완료
□ 4.3 SHOW DATABASES 결과 정상
□ 5.1 db-node-2 join, Synced
□ 5.2 db-node-3 join, Synced
□ 6.1 cluster_size=3, Primary, 모든 노드 Synced
□ 6.2 데이터 행 수 확인
□ 6.3 애플리케이션 정상 동작
□ 7.1 timer 재가동, 다음 NEXT 가 다음날 02:00
□ 7.2 24시간 후 정리 (백업 디렉터리, 사본 파일)
변경 이력
| 일자 | 버전 | 변경 내용 |
|---|---|---|
| 2026-05-15 | 1.0 | 최초 작성. 덤프 import 중심의 클러스터 전체 복구 절차 |
| 2026-06-01 | 1.1 | 백업 노드 장애 시 타이머 제어 지침 추가 |