ibd 파일에서 ibdata1없이 데이터 폴더에서 MySQL 데이터베이스 복구


15

다른 사용자가 실수로 WAMP 디렉토리를 삭제했습니다. MySQL의 데이터 폴더 만 사용할 수 있습니다. 그리고 데이터베이스 폴더 (데이터베이스 이름이 포함 된 "\ bin \ mysql \ mysql5.6.12 \ data \"의 폴더) 만 사용할 수 있습니다. "\ bin \ mysql \ mysql5.6.12 \ data \"의 루트에있는 " ibdata1 "을 포함한 모든 파일 도 삭제됩니다.

데이터베이스 폴더에는 아래 확장자를 가진 파일 만 있습니다.

* .frm, * .ibd

및 "db.opt"파일.

데이터베이스를 어떻게 복구 할 수 있습니까?

이미 bdata1을 복구하려고했습니다. 그러나 그것을 다시 얻을 수 없습니다. 그리고 일부 데이터베이스에는 MYISAM도 포함되어 있습니다.

답변:


16

MyISAM

MyISAM 테이블 mydb.mytable의 경우 세 개의 파일이 있어야합니다.

  • \bin\mysql\mysql5.6.12\data\mydb\mytable.frm
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
  • \bin\mysql\mysql5.6.12\data\mydb\mytable.MYI

각 파일에는 필요한 데이터, 메타 데이터 및 색인 정보가 포함되어 있으므로 이미 테이블로 액세스 할 수 있어야합니다. 종합적으로 그들은 테이블을 형성합니다. 액세스 할 외부 스토리지 엔진 메카니즘이 없습니다.

InnoDB

이 InnoDB의 그림 표현을 살펴보십시오

InnoDB 아키텍처

ibdata1을 .ibd파일에 첨부하는 유일한 것은 데이터 사전입니다.

당신의 임무는 당신이 그것을 수락하기로 결정한다면, 각 테이블을 생성하고 .ibd

어떤 작업을 수행하기 전에 "\ bin \ mysql \ mysql5.6.12 \ data"의 전체 사본을 다른 사본으로 작성하십시오.

여기 샘플이 있습니다

mydb테이블 이있는 데이터베이스가 있다고 가정 합니다 mytable. 이것은 의미

  • 폴더가 있습니다 \bin\mysql\mysql5.6.12\data\mydb
  • 그 폴더 안에는
    • mytable.frm
    • mytable.ibd

당신이 필요합니다 .frm. 내 게시물을 보면 어떻게 .frm 파일에서 테이블 스키마를 추출 할 수 있습니까? , 테이블 작성에 필요한 SQL을 생성 할 수있는 MySQL 유틸리티를 다운로드 할 수 있습니다.

이제 다음을 수행해야합니다

  • 이동 mytable.ibd\bin\mysql\mysql5.6.12\data
  • SQL을 실행하여 InnoDB 테이블을 작성하십시오.
  • mysql에 로그인하고 실행하십시오 ALTER TABLE mydb.mytable DISCARD TABLESPACE;(삭제됩니다 \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd)
  • 복사 \bin\mysql\mysql5.6.12\data\mytable.ibd\bin\mysql\mysql5.6.12\data\mydb
  • mysql에 로그인하고 실행하십시오 ALTER TABLE mydb.mytable IMPORT TABLESPACE;( \bin\mysql\mysql5.6.12\data\mydb\mytable.ibd데이터 사전에 등록 됩니다)

그 후에는 테이블에 mydb.mytable완전히 액세스 할 수 있어야합니다. 다음을 간단히 실행하여 접근성을 테스트 할 수 있습니다.

SELECT * FROM mydb.mytable LIMIT 10;

시도 해봐 !!!

DRINK (데이터 복구에 필요한 지식 통합)


이 훌륭한 답변을 완료하려면 innodb의 경우 테이블 스페이스를 삭제하기 전에 테이블을 참조하는 FK 제약 조건을 제거해야합니다. 가져온 후 FK를 다시 만들어야합니다.
SebaGra

테이블 스페이스 반입 후 information_schema.key_column_usage(아마도 다른 테이블도) 첫 번째 데이터를 리턴하지 않으므로 select최소한 하나의 쿼리를 실행하고 다음 쿼리가 작동하기 전에 몇 초 동안 기다려야합니다. (EditLine 래퍼를 사용하는 linux-glibc2.12 (x86_64)의 경우 mysql Ver 14.14 Distrib 5.7.19)
user3338098
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.