2010-04-21 3 views
1

프로덕션 데이터베이스에 큰 문제가 있음을 알려주십시오. 실수로 자동 증가 열에 매우 큰 값을 가진 키를 삽입했는데 큰 재건 시간 없이는이 값을 변경할 수 없습니다.테이블을 재구성하지 않고 myISAM에서 AUTO_INCREMENT 재설정하기

ALTER TABLE tracks_copy AUTO_INCREMENT = 661482981 

초 저속인가요?

프로덕션 환경에서 어떻게 해결할 수 있습니까? 나는이 효과를 얻을 수 없다. (아무런 효과가 없다) :

myisamchk tracks.MYI --set-auto-increment=661482982 

어떤 아이디어라도?

는 기본적으로, 아무리 내가 뭘 나는 오버 플로우를 얻을 :

SHOW CREATE TABLE tracks 
CREATE TABLE tracks (
... 
) ENGINE=MYISAM AUTO_INCREMENT=2147483648 DEFAULT CHARSET=latin1 
+0

mySQL은 어디에서이 값을 저장합니까? 아마도 내가 그 위치에 해킹 할 수있다 – Artem

답변

2

과 사투를 벌인 후 (이 큰 AUTO_INCREMENT 값이 기존 레코드가있는 경우, 더 높거나) 새 레코드가 주어진 값에서 시작하는 번호 이 시간 동안, 나는 그것을 마침내 해결할 수있었습니다. myISAM에 대한 auto_increment 정보는 TableName.MYI에 저장됩니다. 상태 -> auto_increment는 http://forge.mysql.com/wiki/MySQL_Internals_MyISAM에 있습니다. 그 파일을 수정하는 것이 올바른 방법이었습니다.

그러나 myisamchk에는 update_auto_increment 함수 또는 호출하는 곳의 오버플로 버그가 있으므로 큰 값에 대해서는 작동하지 않으며 현재 값이 이미 2^31보다 크면 업데이트하지 않습니다 (소스 파일은 여기에 - http://www.google.com/codesearch/p?hl=en#kYwBl4fvuWY/pub/FreeBSD/distfiles/mysql-3.23.58.tar.gz%7C7yotzCtP7Ko/mysql-3.23.58/myisam/mi_check.c&q=mySQL%20%22AUTO_INCREMENT=%22%20lang:c)

이걸 발견 한 후, "xxd"를 사용하여 MYI 파일을 hexfile에 덤프하고, 바이트 60 주위에서 편집하고, hex_file에서 수동으로 auto_increment 값을 대체했습니다. "xxd -r"그러면 16 진수 파일에서 2 진 파일을 복원합니다. 편집 할 항목을 정확히 찾으려면 훨씬 작은 테이블에서 ALTER TABLE을 사용하고 diff를 사용하여 효과를 살펴 보았습니다. 재미는 없지만 결국 효과가있었습니다. 포맷에 체크섬이있는 것 같지만 무시됩니다.

0

당신이 매우 큰 키를 사용하여 기록을 떨어 적이 있습니까? 그 레코드가 여전히 존재한다면 auto_increment를 더 낮은 값으로 변경할 수 있다고 생각하지 않습니다. 에서

docs on myisamchk :

포스 AUTO_INCREMENT

+0

예, 나는 그것을 떨어 뜨렸다 : (어떤 이유로 도움이되지 않습니다.) 다른 아이디어? – Artem

+0

이 프로그램을 성공적으로 사용 했습니까? – Artem

+0

@Artem 너무 나쁘고 이상합니다. 'auto_increment' 값을 기억할 수있는 한 변경 한 적이 없습니다. 마음에 떠오르는 아이디어는 값을 지정하지 않고'--set-auto-increment'를 시도하는 것입니다. –

관련 문제