MySQL 테이블이 재생성 후 누락/손상됨

MySQL 테이블이 재생성 후 누락/손상됨

어제 MySQL 데이터베이스를 SQL 파일에 덤프하고 ibdata1 파일 이름을 바꿨습니다. 그런 다음 이를 다시 생성하고 SQL 파일을 가져온 다음 새 ibdata1 파일을 내 MySQL 데이터 디렉터리로 이동하고 이전 파일을 삭제했습니다.

예전에는 문제 없이 해봤는데 이번에는 뭔가 잘못되었습니다. (MySQL 구성이 아닌 개인용) 데이터베이스를 조사해 보면 모두 거기에 있지만 비어 있습니다. 데이터 디렉터리에는 여전히 올바른 콘텐츠가 포함된 .ibd 파일이 있으며 테이블을 볼 수 있습니다.목록데이터베이스에는 있지만 테이블 자체에는 없습니다. (저는 테이블당 파일을 활성화했으며 모든 것에 대해 기본값으로 InnoDB를 사용하고 있습니다.)

예를 들어URL데이터베이스와 그URL테이블에서 mysql.exe 또는 phpMyAdmin을 성공적으로 열 수 있으며 use urls;. 예상한 테이블 도 볼 수 있지만 또는 을 show tables;시도하면 테이블이 존재하지 않는다고 불평합니다.describe urls;select * from urls;단지나열했습니다). (MySQL 관리자는 데이터베이스를 나열하지만 테이블도 나열하지 않습니다. 이는 db가 완전히 비어 있음을 나타냅니다.)

이제 문제는 SQL 파일을 이미 삭제했다는 것입니다(하드 드라이브를 검색한 후에도 복구할 수 없습니다). 그래서 저는 이러한 데이터베이스/테이블을 복구하는 방법을 찾으려고 노력하고 있습니다. 테이블 복구 기능은 테이블이 없다고 불평하기 때문에 사용할 수 없고, 또 테이블이 없다고 불평하기 때문에 덤프할 수 없습니다.

내가 말했듯이 데이터 자체는 여전히 .ibd 파일에 존재하며 테이블 이름도 존재합니다. 데이터베이스에 테이블이 존재한다는 것을 MySQL이 인식하도록 하는 방법이 필요합니다(16진수 편집기를 사용하여 ibdata1 파일에서 문제의 테이블의 열 이름을 찾을 수 있습니다).

이러한 유형의 손상을 어떻게 복구할 수 있는지 아시나요? 나는 소매를 걷어붙이고, 파고들고, 문제를 해결하기 위해 여러 단계를 밟아도 괜찮습니다.

정말 감사합니다.

대체 텍스트

답변1

글쎄요, 저는 여러 가지를 시도하고 여러 가지 명령, 스위치 및 구조를 조사했습니다(놀랍지도 않게도 MySQL 문서는 바늘/건초 더미처럼 광범위하다면 가장 도움이 되었습니다). 결국 내 트릭 중 일부는 성공했습니다. (다른 사람들도 같은 트릭을 생각한 것으로 밝혀졌지만 테이블 구조 복구와 데이터 복구라는 두 가지 주요 부분을 한곳에서 볼 수 없었기 때문에 함께 게시합니다.) 여기).

내가 해야 할 일은 IBDATA1 파일을 다시 만드는 것이었습니다. 불행하게도 데몬을 실행하는 동안 데이터베이스(디렉터리)를 감지하지만 내부의 Innodb 테이블(IBD/FRM 파일)을 선택하지 않습니다. 그래서 제가 한 일은 다음과 같습니다.

  1. 데이터 디렉토리를 비우십시오(또는 원본을 이동하고 빈 디렉토리를 생성하십시오).
  2. 데몬을 실행하여 비어 있는 새 IBDATA1 파일을 생성하도록 합니다.
  3. SQL 스크립트를 사용하여 시스템 테이블을 가져옵니다.…\MySQL\share
  4. 동일한 이름의 더미 데이터베이스 및 테이블 생성
  5. 원본 FRM 파일 위에 복사
  6. 테이블 구조를 추출하려면 둘 DESCRIBE중 하나 이상을 사용하십시오 .SHOW TABLE CREATE
  7. DISCARD TABLESPACE다음은 테이블 위에 올려서 사용했어요
  8. 원본 IBD 파일 위에 복사됨
  9. 그런 다음 나는IMPORT TABLESPACE
  10. 마지막으로 다음을 사용하여 데몬을 다시 실행했습니다.innodb-force-recovery=6
  11. mysqldump그리고 구조와 데이터를 추출하기 위해 달려갔습니다.

물론 항상 순탄했던 것은 아니다. 일부 테이블은 괜찮았지만 일부 테이블은 데이터를 가져오기 전에 테이블과 데이터베이스를 삭제 SHOW TABLE CREATE하고 이를 사용하여 테이블을 다시 생성해야 했습니다. 다른 것들은 그렇게까지 작동하지 않았고, 나는 16진수 편집기를 사용하여 FRM 파일에서 열의 주석과 이름을 수동으로 가져와야 했습니다. (하지만 데이터 유형과 속성, 키 등이 무엇인지 알아내는 것은 쓰레기였습니다. 사격). 또한 데몬과 클라이언트가 다시 시작되는 일이 너무 많았습니다.

(저는 여전히 FRM/IBD 파일을 직접 구문 분석하거나 최소한 FRM 파일의 테이블 구조를 표시하는 도구를 찾고 있지만, 오픈 소스임에도 불구하고 아무도 "리버스 엔지니어링"하려고 하지 않은 것 같습니다. 파일 형식은 공개적으로 사용 가능합니다. 모든 사람이 공식 MySQL 도구를 사용하는 데 만족하는 것 같습니다. 따라서 데이터 복구 회사와 독점/상업 도구에 좋은 기회가 됩니다.

핵심은 항상 절대 최소값(예: MYSQL 디렉토리, 즉 시스템 테이블)으로 작업하는 것이었습니다. 불행하게도 이는 작업이 단순화되고 작업하기가 더 쉬워진다는 의미이기도 하지만 한 번에 하나의 테이블을 복구해야 한다는 의미이기도 했습니다. 이는 나에게는 큰 문제가 아니었지만 어떤 사람들에게는 그럴 수도 있었습니다.

어쨌든, 지난 며칠 동안 인터넷에서 본 수많은 MySQL 복구 페이지 중 아주 유용한 페이지가 몇 개 있었고, 기록을 뒤져 찾아본 후 추가하겠습니다.


이것이 비슷한 상황에 있는 다른 사람들에게도 도움이 되기를 바랍니다.

답변2

모든 테이블과 데이터베이스를 나열할 수 있다는 것은 일반적으로 *.frm 파일이 있다는 것을 의미합니다. 그들에 대한 데이터가 있다는 의미는 아닙니다. mysqld 프로세스를 시작하려고 했습니까?innodb 복구 강제? 그렇지 않다면 시도해 보세요. 예, 시작할 때 mysql 로그에 뭐라고 기록됩니까?

그런 다음에는 절대 그런 백업을 다시 사용하지 마십시오.

관련 정보