본문 바로가기

IT/Data|DB

mysql/mariaDB DB 복구 방법

728x90

보통 mysql과 mariaDB는 Graceful하게 종료하기 위해 SIGTERM(15) 을 사용한다.
서비스 stop 등을 통한 형태로 SIGTERM 통해  종료가 되면 DB는 문제가 되지 않지만, 갑자기 전원이 나가거나 하는 일이 있어서 내려간 경우 복구가 필요한 경우가 발생한다.

 

이는 다음과 같은 파일들이나 InnoDB의 파일들이 Write간 내려가서 무결성이 깨지기 때문이다.

ib_logfile0 데이터베이스 변경 사항을 기록하는 활성 로그 파일
ib_logfile1 데이터베이스 변경 사항을 기록하는 백업 로그 파일
ibdata1 데이터베이스의 모든 테이블 데이터와 인덱스를 저장하는 데이터 파일

 

이 경우 다음과 같은 절차로 복구를 할 수 있다.

1단계: DB정지

 service mysqld stop

 

2단계: 응급모드로 DB설정

/etc/my.cnf.d/server.cnf 의 innodb_force_recovery 를 5 로 설정

 

3단계: 응급모드로 시작

service mysqld start

 

4단계: DB덤프

mysqldump -u root -p --databases [저장할DB명] > /dev/shm/덤프대상파일.sql

 

이때 만약 다른 Socket을 통해 열은 곳을 접근해서 하려면 --protocol=socket 와 -S 옵션 등을 같이 사용하고

다른 호스트에 연결해서 하려면 -h 와 -P 옵션 등을 사용한다.

/dev/shm 을 사용하려면 가용 메모리가 여유가 있으면 속도를 위해 사용하고 아니면 일반 Disk 쪽으로 사용해도 된다.

 

5단계: DB정지

 service mysqld stop

 

6단계: 응급모드로 DB해제

/etc/my.cnf.d/server.cnf 의 innodb_force_recovery 를 0 로 설정

 

7단계: 백업경로 설정 및 백업

본래 DB가 /data/mysql 에 있다고 가정 

mkdir /data/db_backup
mv /data/mysql/ibdata1 /data/db_backup
mv /data/mysql/ib_logfile0 /data/db_backup
mv /data/mysql/ib_logfile1 /data/db_backup
mv /data/mysql/대상DB명 /data/db_backup

 

8단계: DB 시작

service mysqld start

 

9단계: 복구 DB 생성

mysql -u root -p
CREATE DATABASE 복구DB명;

 

10단계: dump 했던 부분을 복구

 mysql -uroot -p --databases 복구DB명 < /dev/shm/덤프대상파일.sql

 

당연한 이야기지만 DB에 접속하는 웹서비스나 기타 등등은 DB 복구되는 동안에는 막아야 한다.

728x90

'IT > Data|DB' 카테고리의 다른 글

mysql/mariaDB 한 서버에 다른 포트로 2개 올리기  (2) 2024.01.04