본문 바로가기

MySQL

[MySQL] 테이블을 지우지도 만들지도 못할 때.. 테이블만이라도 복구하기

무슨 이유인지..? 개발 환경에서 MySQL 시스템이 이상해졌음
개발 실력 부족으로 원인은 모르겠고 데이터 복구도 어려워보여 테이블이라도 살려보기로 함
우선 에러를 보자

CREATE TABLE foo(
    id INT(10) UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB;
- 위의 테이블을 다시 만든다고 가정했을 때 아래와 같은 에러가 발생한다.
// 처음 시도시
Lookup Error - MySQL Database Error: Table 'foo' already exists

// 이후 시도시
Lookup Error - MySQL Database Error: Can't create table 'foo' (errno: -1)
- 에러 내용만 보면 ..뭐지? foo라는 테이블이 이미 존재한다고 하고 이 후로 계속 생성할 수 없다.
- 그런데 SELECT 쿼리를 수행하면 테이블이 없다고 뜬다.
DROP TABLE foo;
Lookup Error - MySQL Database Error: Unknown table 'foo'
- foo라는 테이블은 알수없단다.. 미칠 노릇이다.

해결

- 주의 : 데이터 복구는 할 수 없고 기존 테이블 이름으로 빈 테이블을 생성할 수 있도록 고치는 방법입니다.
CREATE TABLE foo_temp(
    id INT(10) UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB;
- foo테이블을 생성할 수 없으니 foo의 동일한 DDL을 가진 foo_temp 테이블을 만듭니다.

DB 서버 접속
서버로 접속 후 명령어를 통해 현재 위치에서 frm파일의 위치를 찾아봅니다.
find -name '*.frm'
- frm 경로 중에 문제가 있는 DB이름(bar)의 디렉토리로 이동합니다.
- /home/sample/db/mysql/data/bar
- 이동했으면 금방 생성한 foo_temp에 대한 foo_temp.frm, foo_temp.ibd 파일이 보일겁니다.
- cp 명령어를 이용해 두 파일을 foo.frm, foo.ibd로 복사합니다.
- 이 후 DROP 명령어를 다시 수행해보면...
DROP TABLE foo;
- 이전과 달리 성공 result를 받을 수 있습니다.
- 생성하기 전에 서버를 다시 확인해봅니다.
- foo.ibd 파일은 여전히 남아있을 수 있습니다. 이 파일을 직접 rm 명령어로 제거합니다. (rm 명령어는 항상 주의해서..)
CREATE TABLE foo(
    id INT(10) UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB;
- foo와 관련된 파일을 깔끔하게 지웠다면 foo에 대한 빈 테이블이 생성됩니다.
- DESC, INSERT, DELETE, SELECT 쿼리등이 잘 수행됩니다.
- 이제 필요없는 foo_temp 테이블은 제거합니다.
DROP TABLE foo_temp;
- 이렇게하면 복구가 되는데, 데이터는 복구가 되지 않으니.. 아쉽네요. 테이블 하나하나 손으로 해야한다는 것도 단점
- 더 좋은 방법이 있을 것 같은데..

이거라도 도움이 되면 좋겠네요.