인디노트

MySQL DB 의 ibdata1 파일이 날라갔을 때 복구 본문

개발 플랫폼 및 언어

MySQL DB 의 ibdata1 파일이 날라갔을 때 복구

인디개발자 2018. 1. 31. 18:19

MySQL 의 ibdata1 파일이 날라가면 DB 실행조차 안된다. ㅠㅠ

이것을 해결하려고 하루 종일 걸렸다.

방법은. 이 파일을 지우거나 혹은 예전에 백업받아두었던 DB 로 복귀를 한다.

이 ibdata1 파일과 ib_logfile0, ib_logfile1 파일을 삭제하고

MYSQL 의 cnf 파일의 innodb_force_recovery=1 를 하고 재실행하면 MySQL 은 그 상태에서

이 파일들을 새로 생성된다. 물론 이때 DB 뷰 같은것으로 테이블을 선택하면 먹통 되듯이

문제가 발생됨을 알 수 있다. 즉, 깨진 (혹은 새로 생성된) ibdata1 파일로는 DB 테이블을 구동할 수

없는 것이다.


만약 복구하려는 db 이름이 jira 라면 jira 폴더 안에 있는 frm과 ibd 파일을 백업 해 놓는다. (중요함)


우선, 위에서 언급한 3개의 파일을 삭제하고 innodb_force_recovery=1 옵션으로 DB 를 구동한다.

구동된 DB 를 연결해서 테이블의 structure 만을 sql dump 파일로 만들어 놓는다.

그런 후 DB 의 모든 테이블을 삭제한다. (위에서 frm, ibd 파일 백업 안했으면 큰일. 여기서 모두 삭제되기 때문이다.)

이제 후 export 한 sql dump 를 import 한다. 

그러면 그러면 테이블 구조만 생성 db (jira) 폴더에 기본적으로 frm, ibd 파일들이 생성되어 있을 것이다.


모든 테이블 명을 이용해서 DISCARD TABLESPACE 를 수행한다.

다음 예제 같이.... show tables; 로 테이블 명 모두 꺼내고 엑셀 같은데 붙혀넣기 하여 다음 명령들을 만들어 내면 편하다.

ALTER TABLE issuetypescreenscheme DISCARD TABLESPACE;


구동 되었던 DB 를 중지하고. 모든 ibd 파일을 삭제한다.

이제 다시 DB 를 구동한다.

이제 백업 받아두었던 ibd 파일들을 db 폴더 (jira) 에 모두 복사한다.

DB 를 중지한다.

innodb_force_recovery=1 옵션을 cnf 에서 제거하고 DB 를 실행시킨다.

모든 테이블 명을 이용해서 IMPORT TABLESPACE 를 수행한다.


다음 예제 같이.... show tables; 로 테이블 명 모두 꺼내고 엑셀 같은데 붙혀넣기 하여 다음 명령들을 만들어 내면 편하다.


ALTER TABLE issuetypescreenscheme IMPORT TABLESPACE;

ALTER TABLE issuetypescreenschemeentity IMPORT TABLESPACE;

ALTER TABLE jiraaction IMPORT TABLESPACE;

ALTER TABLE jiradraftworkflows IMPORT TABLESPACE;

ALTER TABLE jiraeventtype IMPORT TABLESPACE;

ALTER TABLE jiraissue IMPORT TABLESPACE;

ALTER TABLE jiraperms IMPORT TABLESPACE;

ALTER TABLE jiraworkflows IMPORT TABLESPACE;


이 SQL 을 돌리면 DB 가 복구된다. 깨진 ibdata1 이 복구되는 것이다.

휴....




반응형
Comments