파일이 이동 한 InnoDB 테이블을 복구하는 방법


13

그래서 복제 스트림에 설정된 테스트 DB 서버가 있습니다. 이름 이상으로 슬레이브 데이터 디렉토리의 공간을 빠르게 채운 최적화가 이루어졌습니다. MySQL은 정당하게 더 많은 공간을 기다리고있었습니다.

이 datadir은 mysql의 datadir로만 사용되는 파일 시스템이므로 여유 공간이 없습니다.

복제 스트림의 일부가 아닌 4 기가 innodb 테스트 테이블이 있었기 때문에 그것이 작동하는지 확인하기 위해 무언가를 시도하고 테스트 환경이되어서 끔찍한 일이 발생하더라도 너무 걱정하지 않았다고 생각했습니다.

내가 취한 단계는 다음과 같습니다.

  1. 움직일 테이블을 플러시
  2. 아무것도 기록하지 않았고 복제 스트림에 없었더라도 읽기 잠금을 설정했습니다.
  3. .frm 및 .ibd를 일부 여유 공간이있는 파일 시스템에 복사했습니다.
  4. 테이블 잠금 해제
  5. 해당 테이블이 잘 렸습니다. 이렇게하면 최적화를 완료하기에 충분한 공간이 확보되어 복제가 다시 시작됩니다.
  6. 슬레이브 / 종료 mysql 중지
  7. tmp에서 파일을 데이터 디렉토리로 다시 복사하십시오.
  8. MySQL을 다시 시작

.err 로그에 아무것도 표시되지 않습니다. mydb를 연결하고 사용합니다. 쇼 테이블에서 내가 엉망인 테이블을 참조하십시오. 하지만 시도하면

select * from testtable limit 10;

오류가 발생합니다

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

내가 지금까지 말할 수있는 것에서 나는 다른 모든 테이블에서 잘 읽을 수 있으며 복제는 불만없이 다시 시작되었습니다.

이 시점부터 복구 할 수있는 작업이 있습니까? 필요하다면 처음부터 다시 만들 수는 있지만 다른 사람들이이 벤처에 대해 일반적으로 어떻게 생각하는지 궁금했습니다. 내가 취한 일련의 단계에 대해 더 완벽한 결과가 나오지 않았습니까?

이것이 테스트 서버가 아니라면 '실제로'할 수 없었으며 어떻게되는지 볼 수 없었습니까? 프로덕션 슬레이브에서 임시 공간을 확보하는 가장 좋은 방법은 무엇입니까?

답변:


15

대부분의 사람들이 TRUNCATE TABLE에 대해 잊어 버린 가장 큰 것은 TRUNCATE TABLE이 DML이 아니라 DDL 이라는 것 입니다. InnoDB에서 ibdata1 내의 메타 데이터는 번호가 매겨진 InnoDB 테이블 목록을 포함합니다. TRUNCATE TABLE을 사용하면 InnoDB 테이블의 내부 메타 데이터 ID가 이동합니다. TRUNCATE TABLE이 효과적으로 다음을 수행하기 때문에 발생합니다.

예 : mydb.mytb라는 InnoDB 테이블을 자르려면

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

새로운 mytb는 다른 내부 메타 데이터 ID를 가질 것이다.

.ibd 파일을 다른 위치로 복사하면 .ibd에 원래 내부 메타 데이터 ID가 포함됩니다. .ibd 파일을 다시 넣으면 내부 메타 데이터 ID와 ibdata1의 ID가 일치하지 않습니다.

당신이해야 할 일은 이것입니다 :

InnoDB 테이블의 .ibd 파일을 복사하십시오. 그런 다음 이것을 실행하십시오.

ALTER TABLE tablename DISCARD TABLESPACE;

나중에 다시 가져 오려면 .ibd 파일을 datadir에 다시 복사 한 다음 실행하십시오.

ALTER TABLE tablename IMPORT TABLESPACE;

이것은 내부 메타 데이터 ID를 보존했을 것입니다.

.frm이 항상 존재하는지 확인하십시오.

한 번은 클라이언트가 동일한 방식으로 호스 닝 한 30 개의 InnoDB 테이블을 복원하도록 도와주었습니다. 다른 DB 서버를 사용하고 InnoDB 테이블을 추가 및 삭제하여 올바른 내부 메타 데이터 ID를 찾기 위해 일부 게임을해야했습니다.

클라이언트는 http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file 기사를 찾았습니다 . 우리는 그것을 사용했고 그것은 큰 도움이되었습니다. 도움이 되길 바랍니다.


1
모든 테이블에 2 개의 데이터베이스가 있습니다 Table 'X' doesn't exist in engine. 모든 테이블에 대해 위의 방법을 수행해야합니까? 아니면 더 나은 방법으로 해결할 수 있습니까?
파파 니토

-2

친구에게 판매하기 전에 Mac에서 XAMPP 폴더를 내 하드 드라이브에만 복사하기 만하면 Mac을 경험했습니다. (성공하지 않음) 불행히도 다음 단계를 시도했기 때문에 문제가 발생했습니다.-새로운 XAMPP를 설치하고 \ httdocs 및 var \ mysql 전체를 새 Mac에 복사합니다. 작동하지 않습니다, 여전히 PHPMyAdmin 내부의 테이블에 액세스 할 수 없습니다 ...-동일한 xampp 버전을 설치하고 위의 단계를 반복했지만 여전히 작동하지 않습니다. -자러 가기로 결정했습니다.

(성공)-오늘 아침에 백업 디스크를 가져 와서 Windows 7을 사용해보십시오.-Windows 용 최신 최신 XAMPP, c : \ xampp를 설치하십시오. \ httdocs의 백업에서 웹 사이트 (폴더) 중 하나가 있고 \ var \ mysql은 Windows 7에 준비되어 있습니다. httdocs \ 및 \ var \ mysql 내부에 많은 프로젝트가 있기 때문에 하나의 웹 사이트로 시도한 다음 나머지를 시도하고 싶습니다-httdocs \ 폴더를 Windows c : \ xampp \에 복사합니다. httdocs 및 \ var \ mysql을 c : \ xampp \ mysql \ data로 복사하십시오.

아직은 아닙니다. 백업 파일에서 ib_logfile0, ib_logfile1, ibdata1을 Windows xampp c : \ xampp \ mysql \ data로 복사합니다.

http : // localhost / mywebsite를 새로 고 칩니다.

와우 와우 완료 ... 작동 중 ...

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