DATABASE

MYSQL 파일 단위 백업 - InnoDB, MyISAM 파일 복원

예나부기 2022. 10. 20.

MyISAM 파일 복원

- MyISAM의 구성 

/mysql/data/DB명/테이블명.frm 테이블의 구조를 정의하는 파일
/mysql/data/DB명/테이블명.MYD 데이터 파일(actual data of MyISAM table)
/mysql/data/DB명/테이블명.MYI 인덱스 파일

- 위 .frm, .myd, .myi 파일이 있다면 데이터베이스 폴더 (/var/lib/mysql)에 간단히 복사+붙여넣기 하는 것 만으로 복원 끝!

 

문제는, innoDB 엔진의 경우이다.

InnoDB 파일 복원

-InnoDB는 MyISAM처럼 단순하고 간단하게 파일을 이용한 복구를 하기 어려운데, 이는 InnoDB의 구조 때문이다.

출처 : https://www.percona.com/blog/2010/04/26/xtradb-innodb-internals-in-drawing/

-굉장히 복잡한데, 결론적으로는 .frm, .ibd 파일만으로 복구하기 위해서는

.ibd 파일의 Tablespace ID가 ibdata1의 메타데이터에 있는 Tablespace ID과 100% 일치함을 보장할 수 있을 때만이다.

 

이 외의 경우 파일 단위 백업 복원 시 오류가 발생할 수 밖에 없는 구조를 가지고 있다.

 

-하지만 InnoDB 파일 복구를 검색해서 찾아다니는 사람의 대부분은 .frm, .ibd 파일로 복구 하다가 오류가 나는 경우일 것이다.

 

InnoDB 파일 단위 복구 중 오류 났을 때 해결법 

(출처: https://sysdocu.tistory.com/1246 )

ERROR 1932 (42S02): Table [테이블명] doesn't exist in engine

 

  1. 서비스 종료
  2. ibd, frm 파일들을 data 경로에서 다른 경로로 이동 (복사 아님)
  3. 서비스 다시 시작 후 이동한 테이블 삭제된 상태 확인
  4. 제거된 테이블 다시 생성 (생성 query)
  5. 테이블 스페이스 제거: Alter table [테이블명] discard tablespace;
  6. 이동된 테이블 파일(ibd, frm)을 다시 data 경로로 복사
  7. 테이블 스페이스 복원: alter table [테이블명] import tablespace;

하지만, 위 방법으로는 테이블 크기가 조금이라도 크면 Lost connection to MySQL server during query 에러 발생과 함께 서비스가 종료되는데,

그럴 땐 아래와 같이 한다.

 

  1. 백업된 DB와 동일한 이름의 DB(gradius) 생성
  2. 서비스 종료
  3. 백업된 gradius 데이터 파일(frm, idb) ibdata1(data 밑에 있음)을 함께 이관
  4. 서비스 시작

서비스 시작 시 DB 자동 복구가 실행된다.

댓글