.ibd, .frm 및 mysqllogbin 파일에서 MySQL 테이블 복원


10

나는에 저장되어있는 내 테이블을 열어하려고 할 때 어떤 이유로, .frm그리고 .ibd파일 (MySQL의 또는 phpMyAdmin을에 있는지 여부를) 그것은 나에게 구문 오류를 제공, 또는 존재하지 않는 말했다.

나는 이것과 비슷한 문제가있는 다른 게시물을 읽었지만 innodb_file_per_table활성화 되어 있는지 확인하는 방법을 모르겠 으며 전반적으로 혼란 스럽습니다. 또한 mysql-bin.000002파일 사본을 txt 파일 로 변환하여 데이터베이스의 데이터가 완전히 손실되지 않았 음을 알 수 있습니다.

데이터베이스는 작년에 만들어졌습니다. 나는 그 mysql-bin.00000파일 중 6 개를 가지고 있지만 어떤 이유로 든 .000002가장 큰 파일입니다. 지금 은 모든 데이터베이스에 대한 파일 .ibd.frm파일이 있지만 MySQL로 다시 복원하거나 적어도 읽을 수있는 것으로 복원하는 방법에 대한 손실이 있습니다.

Windows 2003 Server에서 WampServer 2.4 및 MySQL 5.6.12를 사용하고 있습니다. 또한 InnoDB에서 플러그인을 다운로드해야합니까?


아니요, 작년에 만들어졌습니다. mysql-bin.00000 파일 중 6 개가 있지만 어떤 이유로 .000002가 가장 큽니다. 현재 모든 데이터베이스에 대한 .ibd 및 .frm 파일이 있지만 MySQL로 다시 복원하거나 적어도 읽을 수있는 파일로 복원하는 방법에 대해 잃어 버렸습니다.
carment

답변:


20

나는 많은 시행 착오를 통해 마침내 내 문제를 파악하고 해결했습니다. 원본 ibdata1 파일이없고 .frm 및 .ibd 파일 만있는 사람들을 위해 다음은 데이터를 복원하는 방법입니다.

  1. -> http://dev.mysql.com/downloads/utilities 에서 MySQL 유틸리티를 다운로드하여 설치 하십시오 .
  2. 명령 / 터미널로 이동하여 MySQL 유틸리티 mysqlfrm을 열고이를 사용하여 복원해야하는 테이블 구조를 찾으십시오. 내가 그렇게 한 방법은 mysqlfrm의 파일 위치로 cd 한 다음 "mysqlfrm --server = user : pwd @ localhost --port = 3307"path_to_.frm_file "> table_name.txt"를 입력 한 것입니다. .txt 파일은 원하는 위치를 지정하지 않은 경우 유틸리티가 저장된 폴더와 동일한 폴더에 저장해야합니다.
  3. 텍스트 파일에는 테이블의 모든 열과 정보 (기본적으로 원래 구조)가 포함 된 CREATE TABLE 문이 표시됩니다. 해당 CREATE 문을 모든 정보와 함께 복사하십시오.
  4. MySQL 명령에서 새 데이터베이스 (CREATE DATABASE database_name)를 작성하십시오. 원래 데이터베이스 이름과 같은 이름으로 만드십시오.
  5. 새 데이터베이스 내에 새 테이블을 만듭니다. 폴더와 이름이 같을 필요는 없습니다. 명령 프롬프트에서 새 테이블을 만들 수 있지만 웹을 통한 MySQL 관리를 처리하는 무료 소프트웨어 도구 인 PhpMyAdmin에서 테이블을 만들었습니다. PhpMyAdmin에서 데이터베이스를 클릭 한 다음 SQL 테이블을 클릭하고 # 3에서 테이블 구조를 붙여 넣었습니다. 참고로 명령 프롬프트에서 테이블 이름을 "table"로 지정하면 항상 오류가 발생하므로 해당 이름을 피하십시오.
  6. MySQL 명령에서 데이터베이스로 이동하여 "ALTER TABLE table_name DISCARD TABLESPACE"를 입력하면이 테이블의 .ibd 파일이 제거됩니다.
  7. 원래 테이블 (복원하려는 테이블)의 .ibd 파일을 새로 만든 테이블에 복사하여 방금 제거한 .ibd 파일을 바꿉니다. 초기 .ibd 파일을 새로 만든 테이블 이름으로 변경하십시오. 방금 삭제 한 이전 .ibd 파일을 모방합니다. 이 폴더는 컴퓨터의 새로 생성 된 데이터베이스 폴더 아래 MySQL 데이터 폴더에서 찾을 수 있습니다.
  8. MySQL 명령으로 돌아가서 데이터베이스로 이동하여 "ALTER TABLE table_Name IMPORT TABLESPACE"를 입력하십시오. "경고"(1) 오류 유형 설명이 표시되지만 무시하십시오.
  9. 그리고 끝났다! 새 테이블에 액세스하려고하면 이전 테이블의 모든 데이터가 포함되어야합니다.

도움이 되었기를 바랍니다. 궁금한 점이나 의견이 있으면 알려주세요! 또한 자세한 내용은 http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file 을 확인 하십시오.


훌륭한 지침이지만 MySQL 5.6에서만 작동합니다 ! 5.5에서는 Got error -1 from storage engine실행할 때 오류가 발생합니다 IMPORT TABLESPACE. 그러나 나를 위해 MySQL 5.6은 MySQL 5.5를 사용하여 만든 테이블에서 작동 했으므로 모두 좋습니다.). 5.5에 갇혀 있다면, chriscalender 링크의 지침을 따라야합니다 .
ostrokach

@carment 나는 당신의 지시를 따랐지만 나는 ERRPR에 직면했다 : 13635 공간, 공간 이름 <dbname> / <tblname>의 페이지 번호 1767006713에 접근하려고하는데, 이것은 테이블 공간 경계 외부에 있습니다. 내가 한 일을 안내해 줄 수 있습니까?
Mohit Mehta

이것은 테이블을 다시 만드는 데 많은 시간을 절약했습니다. 방법은 여전히 MySQL은 5.7.17에 2016에서 작동
앤디 머서

@ostrokach innodb_file_per_table활성화 하지 않은 것 같습니다 .
Yvan

당신은 단지 .. 매우 긴 여행 후 나를 구해주었습니다. 감사합니다!
Amr SubZero

4

ibdataMySQL이 .ibd 파일을 이해하려면 기본 InnoDB 데이터 파일 (일반적으로 이름이 지정됨) 이 필수적입니다.

바이너리 파일을 사용하여 서버간에 데이터를 이동해야하는 경우 MySQL을 완전히 중지 한 다음 ibdata 파일을 포함하여 모든 데이터 파일 을 디렉토리간에 이동해야합니다 .

Windows에서 서버간에 데이터를 이동하는보다 안정적인 메커니즘은 ( mysqldump) 또는 PHPMyAdmin (또는 유사한 도구)에서 데이터베이스 내보내기 를 사용하는 것 입니다.

서버가 계속 실행되는 동안 이진 로깅을 활성화 한 경우 (주석에 따라 다를 수 있음) mysqlbinlogmysql-bin 파일에서 서버에서 실행 한 모든 SQL 문을 복구 하는 데 사용할 수도 있습니다. 그런 식으로 데이터베이스를 다시 만듭니다. mysql-bin 파일에는 유닉스 타임 스탬프 가 있어야합니다 .

원본 데이터베이스 파일을 잃어 버렸고 남은 모든 개별 .ibd 파일 인 경우 주석에서 akuzminsky의 제안에 따라 데이터를 복구해야 할 수도 있습니다.

MySQL 5.6에는 InnoDB .ibd 데이터 파일 ( 이동식 테이블 스페이스 ) 이동을위한 몇 가지 새로운 기능 이 있지만 약간의 노력이 필요하며, 데이터베이스 크기가 작 으면 mysqldump.


0

akuzminsky에 의해 질문 코멘트에서 생성 된 위키 답변


*.ibdfiles가 보이면 innodb_file_per_tableis는 ON, 그렇지 않으면 모든 테이블이에있는 것입니다 ibdata1.

테이블이 존재하지 않으면 InnoDB 사전에서 테이블이 누락 된 것입니다. 모든 테이블을 별도의 SQL 덤프 (하나의 테이블-하나의 파일)로 덤프하십시오. 덤프 할 수없는 테이블은 TwinDB 복구 툴킷으로 복원 할 수 있습니다 .

아직 바이너리 패키지가 없습니다. GitHub에서 소스 코드를 가져 와서 컴파일해야합니다. InnoDB 사전 복구 지침을 참조하십시오 . 매우 간단합니다.

git clone git@github.com:twindb/undrop-for-innodb.git

그리고

make all
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.