MySQL InnoDB 테이블이 손실되었지만 파일이 존재 함


33

모든 데이터베이스 테이블 파일이있는 MySQL InnoDB가 있지만 MySQL은 파일을 보지 못하고로드하지 않습니다.

문제는 내가이 세 개의 파일을 삭제하기 때문에 일어난 ibdata1, ib_logfile0그리고ib_logfile1

MySQL을 시작하는 데 문제가 있었기 때문에 MySQL이 재생성하기 때문에 제거해야했습니다.

MySQL이 테이블을 다시 볼 수 있도록하려면 어떻게해야합니까?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

해당 파일을 복원하려고 했습니까? 로그 파일은 삭제 된 상태로 유지 될 수 있습니다. ibdata1
Ramhound를

파일이있는 오래된 mysql 버전에서 파일을 복사했지만 테이블이 표시되지 않습니다.
내 잔디밭

답변:


36

다음은 MySQL이 해당 파일을 볼 수없는 이유입니다. 시스템 테이블 스페이스 (ibdata1)에는 InnoDB가 잠재적 인 테이블 사용량을 매핑 할 수있는 스토리지 엔진 별 데이터 사전이 있습니다.

InnoDB 아키텍처

한 장소에서 다른 장소로 InnoDB 테이블을 이동하려면 다음과 같은 명령이 필요합니다

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

다음은 고려해야 할 사항을 설명 하는 MySQL 5.5 설명서 의 일부입니다.

.ibd 파일의 이식성 고려 사항

MyISAM 테이블 파일과 마찬가지로 데이터베이스 디렉토리간에 .ibd 파일을 자유롭게 이동할 수 없습니다. InnoDB 공유 테이블 스페이스에 저장된 테이블 정의에는 데이터베이스 이름이 포함됩니다. 테이블 스페이스 파일에 저장된 트랜잭션 ID 및 로그 시퀀스 번호도 데이터베이스마다 다릅니다.

.ibd 파일과 관련 테이블을 한 데이터베이스에서 다른 데이터베이스로 이동하려면 RENAME TABLE 문을 사용하십시오.

RENAME TABLE db1.tbl_name TO db2.tbl_name; .ibd 파일의 "클린"백업이있는 경우 다음과 같이 원래 위치에서 MySQL 설치로 파일을 복원 할 수 있습니다.

.ibd 파일을 복사 한 후 테이블 공간 내에 저장된 테이블 ID가 변경되므로 테이블이 삭제되거나 잘리지 않아야합니다.

이 ALTER TABLE 문을 발행하여 현재 .ibd 파일을 삭제하십시오.

ALTER TABLE tbl_name DISCARD TABLESPACE; 백업 .ibd 파일을 적절한 데이터베이스 디렉토리에 복사하십시오.

이 ALTER TABLE 문을 실행하여 InnoDB가 테이블에 새 .ibd 파일을 사용하도록 지시하십시오.

ALTER TABLE tbl_name IMPORT TABLESPACE; 이와 관련하여“깨끗한”.ibd 파일 백업은 다음 요구 사항이 충족되는 파일입니다.

.ibd 파일의 트랜잭션에 의해 커밋되지 않은 수정이 없습니다.

.ibd 파일에 병합되지 않은 삽입 버퍼 항목이 없습니다.

제거가 .ibd 파일에서 삭제 표시 인덱스 레코드를 모두 제거했습니다.

mysqld는 .ibd 파일의 모든 수정 된 페이지를 버퍼 풀에서 파일로 플러시했습니다.

이러한 경고와 프로토콜을 고려할 때 제안 된 조치 과정은 다음과 같습니다.

이 예에서는 tags테이블을 mydb데이터베이스 로 복원 해 보겠습니다.

1 단계

해당 파일 .frm.ibd파일의 백업이 있는지 확인하십시오 ./tmp/innodb_data

2 단계

가져 오기 CREATE TABLE tags문을과로 실행 CREATE TABLE mydb.tags .... 원본과 정확히 동일한 구조인지 확인하십시오tags.frm

3 단계

tags.ibdMySQL을 사용 하여 빈 삭제

ALTER TABLE mydb.tags DISCARD TABLESPACE;

4 단계

의 백업 사본을 가져와 tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

5 단계

tagsInnoDB 데이터 사전에 테이블 추가

ALTER TABLE mydb.tags IMPORT TABLESPACE;

6 단계

테이블의 접근성 테스트

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

정상적인 결과가 나오면 InnoDB 테이블을 가져 오신 것을 축하합니다.

7 단계

앞으로 ibdata1 및 해당 로그를 삭제하지 마십시오

시도 해봐 !!!

나는 전에 이와 같은 것들을 논의했다

경고

테이블 구조를 모르면 어떻게해야 tags합니까?

.frm파일을 사용하여 CREATE TABLE 문을 가져 오는 도구가 있습니다. 이것에 관한 게시물도 썼습니다 : .frm 파일에서 테이블 스키마를 추출하는 방법은 무엇입니까? . 이 게시물에서 Linux 상자에서 .frm 파일을 Windows 시스템으로 복사하고 Windows 도구를 실행하고 CREATE TABLE명령문을 얻었습니다 .


멋진 답변 감사합니다! 나는 여전히 문제를 일으키기 때문에 하나의 테이블을 가져 오는 과정에 있지만 결국 거기에 도착할 것이고 그것이 어떻게 작동하는지 알려줄 것입니다! 감사!
내 잔디를

1
create를 실행하면 다음 오류weblyizetags 가 발생합니다. ERROR 1813 (HY000) : 'table for table' . 존재합니다. IMPORT 전에 테이블 스페이스를 폐기하십시오. 그런 다음 먼저 alter tablespace를 실행하려고 시도하고 다음 오류가 발생합니다. ERROR 1146 (42S02) : 'weblyize.tags'테이블이 없습니다 . 내가 무엇을 할 수 있을지?
내 잔디밭

감사! 내 오류를 해결하기 위해 새 데이터베이스를 만들고 실행 CREATE TABLE ...한 다음 단계를 수행했습니다! 당신은 처음부터 그들을 100 % 다시 쓰지 않아도되었습니다! 외래 키를 가져 오지 않았지만 직접 할 수는 있습니다! 다시 한번 감사합니다!
내 잔디밭

이 방법으로 수정 해야하는 100 개의 테이블이 있으면 어떻게됩니까? 나는 손으로 각 테이블에 대한 작업을 수행하지 않습니다. 어떻게 자동화 할 수 있습니까?
Oleg Abrazhaev

10

상황이 동일합니다. 특정 tblname을 삭제하거나 만들 수 없습니다. 내 수정 절차는 다음과 같습니다

  1. MySQL을 중지하십시오.

    service mysql stop
    
  2. ib_logfile0 및 ib_logfile1을 제거하십시오.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. tblname 파일을 제거하십시오. 경고 : 데이터가 영구적으로 삭제됩니다

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. MySQL을 시작하십시오.

    service mysql start
    

1
감사합니다.이 문제를 해결하고 3 단계를 수행하지 않았으며 단순히 로그 파일을 제거하고 mysql 백업을 시작했습니다.
Jeff Wilbert

당신은 절대적으로 환상적입니다! 내 문제를 해결했습니다.
Alex GP

2

나도이 문제가 있었다. ibdata1실수로 삭제 했으며 모든 데이터가 손실되었습니다.

구글과 SO에서 1-2 일 동안 검색 한 후 마침내 나는 생명을 구할 수있는 해결책을 찾았습니다 (거대한 기록을 가진 데이터베이스와 테이블이 너무 많았습니다).

  1. 백업을 받다 /var/lib/mysql

  2. dbsake를 사용 하여 .frm파일 에서 테이블 스키마를 복구하십시오 (다른 옵션이 있습니다! mysqlfrm . 그러나 그것은 나를 위해 작동하지 않았습니다)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. 내 보낸 스키마를 사용하여 새 이름으로 새 테이블을 만듭니다.

  2. 이 명령으로 새 테이블 데이터를 삭제하십시오.

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. 이전 테이블의 데이터를 복사하여 새 데이터 대신 붙여넣고 올바른 권한을 설정하십시오.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. 데이터를 새 테이블로 가져옵니다.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. 다 좋아! 새 테이블에 데이터가 있고 기존 테이블을 삭제할 수 있습니다.
DROP TABLE `tbl`;
  1. 이전 테이블에 대한 /var/lib/mysql/database-name데이터 ( .ibd파일) 가 있는지 확인 하고 삭제하십시오.
rm tbl.ibd
  1. 마지막으로 새 테이블의 이름을 원래 이름으로 바꿉니다.
ALTER TABLE `tbl-new` RENAME `tbl`;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.