ibdata에서 데이터를 복구하는 손실된 Frm 파일

ibdata에서 데이터를 복구하는 손실된 Frm 파일

저는 mysql innodb datbase로 작업하고 있었습니다. mysqlworkbench로 작업할 때 실수로 모든 .frm 파일이 mysql 데이터 폴더에서 삭제되었지만 데이터 폴더에는 여전히 ibdata 파일이 있습니다. innodb_file_per_table을 사용하지 않았다는 것은 모든 innodb 테이블 데이터가 단일 ibdata 파일에 있다는 것을 의미합니다.

불행히도 복원할 백업이 없습니다. 누구든지 ibdata 파일에서 데이터를 복구하는 방법을 제안해 주실 수 있나요?

답변1

귀하의 질문은 다음과 같습니다이것은 스택 오버플로에 있습니다.
여기에 허용된 답변의 일부를 재현했습니다.


간단한 해결책은 저장된 SQL 사본을 찾아서 CREATE TABLE 실행하는 것입니다.개발MySQL 인스턴스를 만든 다음 생성된 FRM 파일을 복원된 인스턴스에 복사합니다.

문에 액세스할 수 없는 경우 CREATE TABLE다음을 시도해 볼 수 있습니다.

  1. 복원된 데이터베이스에서 다음을 실행합니다.create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. 테이블 모니터 데이터가 덤프될 때까지(보통 약 1분) MySQL 서버 오류 파일을 관찰합니다.
  3. 달리다drop table innodb_table_monitor
  4. 복원된 데이터베이스 중지

  5. 테이블 모니터 출력과 일치하도록 SQL을 작성합니다. 예:

    TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828
    COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45;     
    DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; 
    DB_ROLL_PTR: DATA_SYS prtype 258 len 7;
    INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1
    root page 3, appr.key vals 1828, leaf pages 9, size pages 10
    FIELDS:  DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name
    

    다음과 같이 표현될 수 있습니다:

    drop table if exists mylosttable;
    create table mylosttable (
        id char(12) NOT NULL,
        name varchar(45) NOT NULL
    );
    

    테이블 모니터 출력이 혼동되는 경우 알려진 스키마가 있는 테이블의 출력을 살펴보세요.

  6. 위의 SQL을개발MySQL의 인스턴스

  7. 개발서버에서 생성된 FRM 파일을 복원된 데이터베이스에 복사합니다. 해당 데이터베이스의 하위 디렉터리에 있는 MySQL 데이터 디렉터리에서 찾을 수 있습니다.

  8. 복원된 데이터베이스 다시 시작

    개발 시스템의 FRM 파일을 라이브 데이터베이스 인스턴스로 복사할 수 있습니다. 위에서 서버를 중지하는 이유는 innodb_table_monitor 테이블을 만든 후 데이터베이스에 충돌이 발생하면 ibdata 파일이 일관성 없는 상태로 남게 되어 백업부터 다시 시작해야 하기 때문입니다.

  9. 명령문을 사용하여 테이블이 작동하는지 테스트합니다 select *. 당신이 틀렸다면 당신은 볼 것입니다 :

    ERROR 2013 (HY000): Lost connection to MySQL server during query
    

이는 데이터베이스가 충돌했음을 의미합니다. 이런 일이 발생하면 create table innodb_table_monitor...개발 인스턴스에서 작업을 수행하고 출력을 복원된 인스턴스의 원래 출력과 비교하십시오. NOT NULL이나 이와 유사한 작은 것을 놓친 것을 볼 수 있습니다.

관련 정보