mysqldump - = 연산자를 사용하면 모든 행을 가져오지 못하는 경우

mysqldump - = 연산자를 사용하면 모든 행을 가져오지 못하는 경우

현재 특정 테이블에 4페타바이트의 데이터가 포함되어 있다고 생각하는 상황이 있습니다. 멋있게 들리겠지만 장담컨대 60GB 파티션에만 있다는 것입니다.

이 테이블에는 9개의 필드가 있습니다. 그 중 하나가 domain_id밭입니다. 약 6300개만 있으므로 행을 식별하는 데 가장 적합한 필드입니다. 일치시킬 수 있는 유일한 다른 필드 옵션에는 200만 개가 넘는 레코드가 있는데 이는 훨씬 더 어렵습니다.

mysqldump는 4PB의 데이터를 모두 출력하고 그에 가까워지기 오래 전에 드라이브를 채우려고 시도하기 때문에 직접 mysqldump를 수행할 수 없습니다. 따라서 좋은 항목을 외과적으로 제거하고 db를 파괴하고 다시 생성해야 합니다.

domain_id각 레코드에 대해 덤프를 수행할 수 있다면 그 레코드에서 대부분의 사용 가능한 데이터를 얻을 수 있을 것이라고 믿습니다 . 이것이 내가 사용하려는 것입니다:

mysqldump -u root --skip-opt -q --no-create-info --skip-add-drop-table \
 --max_allowed_packet=1000000000 database table --where="domain_id=10" \
 > domains10.sql

domain_id 10이것을 사용하면 가 있는 모든 행을 내보낼 수 있을 것으로 예상됩니다 .

하지만 내보내기를 확인하면 행이 1개만 표시되고, DB를 보면 행이 많이 있습니다. 이는 마치 운영자가 하나를 찾은 다음 포기하는 것과 같습니다.

다양한 연산자를 사용해 보았습니다. <또는를 사용하면 >더 많은 데이터를 얻을 수 있지만 데이터가 손상된 특정 행에서는 내보내기가 중단됩니다. 6000개가 넘는 항목을 처리해야 하므로 내보내기에서 어떤 행이 영향을 받는지 충분히 쉽게 좁힐 수 없습니다.

따라서 나에게 필요한 것은 기본적으로 내가 =할 것이라고 생각한 작업을 수행하고 특정 필드와 일치하는 모든 레코드를 내보낼 수 있는 연산자입니다.

또한 이 DB에 액세스할 수 있는 유일한 방법은 innodb 강제 복구 3을 통해서입니다. 따라서 이 작업이 완료되면 mysql이 다시 기능하도록 하려면 db를 삭제해야 하기 때문에 이를 올바르게 해야 합니다.

도움이 되는 답변을 기다리겠습니다.

답변1

작성하신 내용에 따르면 데이터베이스가 손상된 것 같습니다(60GB 대신 4PB가 일종의 경품이라고 생각함).

DB를 먼저 복구하지 않으면 검색된 정보의 신뢰성을 확신할 수 없을 것 같습니다. 이것을 시도해 보셨나요?

그렇지 않고 오류가 발생하더라도 계속하려면 "-f" 키를 사용하면 어떻게 됩니까?

답변2

테이블이 실제로 얼마나 커야 한다고 생각하시나요?

myisam으로 변환해 볼 수 있습니다:

alter table ggg engine=myisam;

그러나 데이터베이스가 손상된 것 같습니다.

가장 좋은 계획은 innodb 담당자에게 지원을 요청하는 것입니다.

http://www.innodb.com/

답변3

저는 데이터베이스 관리자가 아니므로 이 아이디어가 완전히 잘못된 것일 수도 있지만, 텍스트 문자열이 있는 모든 레코드에서 일관성을 유지해야 하는 덤프 데이터가 있습니까? 손상된 데이터가 유효한 문자열이 아닌 경우 디스크에 기록되지 않도록 "4페타바이트" 데이터베이스를 덤프하고 grep/strings 필터를 통해 리디렉션할 수 있는지 궁금합니다. 이것은 손상된 데이터가 단지 이해할 수 없는 쓰레기인지 여부에 따라 다릅니다...

그렇지 않으면 여기 있는 다른 누군가가 데이터베이스를 수정하기 위한 복구 도구를 제안해야 합니다.

답변4

. --skip-extended-insert​파일에 쓸 때 내용이 엉망이 될 수도 있습니다.

관련 정보