
실수로 모든 테이블을 삭제했습니다. 다시 복원할 수 있나요? 백업 사본이 없습니다.
답변1
말 그대로 백업이 없다면 운이 없을 것이라고 99% 확신합니다.
어떤 형태로든 백업이 있다면, 아무리 오래되었더라도 MySQL 구성 파일(my.ini)에 대한 log-bin 옵션을 통해 바이너리 로깅이 켜져 있습니까? 그렇다면 마지막 백업 이후 복구가 가능할 수도 있습니다.
한 주를 시작하는 나쁜 방법이야, 미안.
답변2
질문이 좀 오래된 것 같은데 긍정적인 답변이 하나도 없어서 추가하겠습니다.
MySQL이 테이블을 삭제한 후에도 데이터는 한동안 미디어에 남아 있습니다. 따라서 레코드를 가져오고 테이블을 다시 작성할 수 있습니다. 나중에 이에 대해 블로그에 올리겠지만 지금은 간단히 스케치해 보겠습니다.
테이블 구조(CREATE TABLE 문)가 필요합니다.
innodb_file_per_table이 ON이면 삭제된 테이블은 디스크 파티션에 있습니다. MySQL을 중지하고 최대한 빨리 읽기 전용으로 다시 마운트하십시오. MySQL이 루트 파티션에 있었다면(좋은 생각은 아니지만) 이미지를 찍거나 디스크를 꺼내서 다른 서버에 연결하세요. 즉, 모든 쓰기를 중지합니다.
innodb_file_per_table이 OFF이면 MySQL을 중지하세요.
그런 다음 다음에서 InnoDB용 삭제 취소 도구를 다운로드하고 컴파일합니다.https://github.com/twindb/undrop-for-innodb/. 자세한 내용은 "[TwinDB 복구 툴킷 컴파일][1]" 게시물을 확인하세요.
그런 다음 stream_parser를 사용하여 디스크 파티션 또는 ibdata1(innodb_file_per_table 설정에 따라)을 구문 분석합니다.
./stream_parser -f /path/to/diskimage_or_ibdata1
그런 다음 InnoDB 사전을 복구하여 삭제된 테이블이 어느 index_id에 있었는지 확인합니다.
그런 다음 테이블 구조를 가져와 레코드를 가져옵니다.
./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page
레코드를 stdout으로 출력하고 LOAD DATA 명령을 stderr로 출력합니다. [1]:https://twindb.com/how-to-recover-innodb-dictionary/
InnoDB용 Undrop에 대한 PS 비디오 튜토리얼 - InnoDB용 Undrop 개요https://youtu.be/-1LeLhGjAWM
답변3
내가 한 일은 다음과 같습니다. mysql 디렉토리(Ubuntu의 경우 /var/lib/mysql, Homebrew를 사용하는 Mac의 경우 /usr/local/var/mysql)에서 일부 파일을 찾았습니다. 먼저 특정 스키마가 포함된 myapp_development/ 디렉터리를 로컬 mysql 디렉터리에 복사했습니다. 그런 다음 로컬 ibdata1을 백업하고 서버의 ibdata1을 mysql 디렉토리에 복사했습니다. mysqld를 죽였습니다. ( ps aux
PID를 찾으려면 kill PID
). mysql을 다시 시작하면 충돌 복구 모드에서 시작되었습니다. 그런 다음 로컬 mysql 클라이언트를 실행하고 필요한 테이블의 전체 덤프를 생성했습니다.
그리고 영원히 사라졌다고 생각했던 메타데이터를 입력하는 몇 주간의 작업을 나타내는 15,000개의 행이 저장되었습니다!!
이것이 누군가에게 도움이 되기를 바랍니다.
답변4
.DROP TABLE
MySQL이바이너리 로깅활성화하면 거기에서 일부 데이터를 추출할 수 있습니다.
그 외에는 MySQL에 대해 잊어버리고 "실수로 내 파일 시스템에서 일부 파일을 삭제했습니다"와 같은 문제에 속할 수 있습니다. 파일 복구를 시도하는 몇 가지 도구가 있으며 전문적으로 이를 수행하는 회사도 있습니다.