2010-01-17 3 views
3

mysqldump가 만든 데이터베이스 덤프를 다시 가져 오는 데 문제가 있습니다. 나는 order-by-primary 옵션으로 mysqldump를 돌렸다. 그리고 고유 한 키 (그리고 명백한 기본 키가 없으므로 고유 한 키로 정렬 됨)가있는 테이블에서 실행했다. 이 경우 내 목표는 고유 키를 기본 키로 만드는 테이블을 다시 만드는 것이 었습니다.두 개의 인덱스 항목 사이에 행이 있습니까?

이 덤프는 매우 오랜 시간이 걸렸으며 (약 10 일) 다시 실행하기에는 큰 어려움이 될 것입니다. 적절한 스키마 변경으로 덤프를 다시 가져 왔지만 mysql은 중간에 숨 막히게되었습니다. 나는 딱딱 거리는 장소에서 덤프 파일을 들여다 보았습니다. 누군가 덤프 파일의 텍스트에 스팸 전자 메일을 삽입 한 것처럼 보입니다.

다행히도, 피해가 격리 된 것처럼 보였습니다. 쓰레기 직전에 열쇠를 볼 수 있었고 바로 그 후에 볼 수있었습니다.

tl, dr : 방금 쓰레기를 스플 라이스 한 경우 이전과 이전 사이에 누락 된 키 수를 알지 못합니다. 덤프는 고유 키로 정렬되므로 수명이 더 쉬워집니다. 그 점에서. mysql은 인덱스의 두 항목 사이에있는 모든 행을 검색하는 방법이 있습니까?

키는 32 자의 16 진수 문자열이며 CHAR (32) 유형 열에 저장됩니다. 나는 문자열에 대해 < 또는 연산자를 사용할 수 없다고 확신합니다 ... 그래서 제안 사항이 있습니까?

+0

안녕하세요. SO! 매우 정교한 첫 번째 질문입니다. 좋은 답변을 찾을 수 있기를 바랍니다. –

답변

2

기본 키 (또는 고유 키)에 mysqldump를 정렬하면 오래 걸릴 수 있습니다. 10 일은 꽤 믿을 수 없다.

MyISAM 테이블을 백업하고 InnoDB 테이블에 복원하려는 경우에만이 정렬 작업이 유용합니다. 당신이하는 일인가요?

MySQL에는 확실히 테이블의 하위 집합을 덤프 할 수있는 방법이 있습니다. mysqldump의 --where 옵션을 확인하십시오. 이렇게하면 손상된 행을 백업 할 수 있습니다.

예, <>을 SQL의 문자열에 사용할 수 있습니다. BETWEEN 술어를 사용할 수도 있습니다.

+0

실제로 innodb에서 덤프하여 innodb 테이블에 삽입하고 있습니다. 나는 innodb에 집어 넣을 때해야 할 일은 주문 별 주문이라는 것을 다른 곳에서 읽었다. 그것은 43GB 테이블입니다. 그래서 나는 오래 지연 될 것으로 예상 했었습니다. 나는 두 번해야 할 것이라고 기대하지 않았습니다! – frank

1

내 첫 번째 질문은 어떻게 스팸 메일을 데이터베이스 덤프에 넣고 파기 할 수 있는가하는 것입니다.

나는 그것이 데이터 열 중 하나에서 오는 것 같은데, 맞습니까? 이 전자 메일과 어떻게 덤프의 구조를 방해 할 수 있었는지 보여줄 수 있습니까?

어쩌면 그것은 덤프가 줄 바꿈을 삽입해야하는 일종의 머리글 주입 이었을지 모르겠다. 어쨌든, 내 의견으로는이를 정리하는 것을 최우선으로 생각합니다.

+0

가장 이상한 점입니다. Bill이 권장하는 BETWEEN 쿼리를 수행했는데 행에 데이터가 없어서 내 덤프가 손상된 것으로 보입니다. – frank

+0

덤프 파일이 손상되었지만 데이터베이스가 손상되었을 수 있습니다. –

관련 문제