2012-10-11 4 views
6

6 개의 INT 열, 1 개의 SMALLINT, 2 개의 TINYINT 및 1 개의 FLOAT 열이있는 MyISAM 엔진을 사용하는 MySQL 테이블이 있습니다. 수십억 개의 행이 있습니다 (데이터 파일은 100GB입니다). 키를 사용하여 에있는 모든에 대한 색인을 만들려고했지만 그럴 수 없었습니다.큰 테이블 복구/색인 생성 및 myisam_sort_buffer_size

- recovering (with sort) MyISAM-table 'tableName'        
Data records: 662929483               
- Fixing index 1                 
myisamchk: error: myisam_sort_buffer_size is too small       
MyISAM-table 'tableName' is not fixed because of errors       
Try fixing it by using the --safe-recover (-o), the --force (-f) option or by not using the --quick (-q) flag 

(가 keycache 방법,하지 정렬 방법을 사용 아마도 때문에) 대신 영원히 다시한다 "myisamchk를 -rov TABLENAME을"사용 "myisamchk를 -r TABLENAME"를 시도 다음과 같은 오류를했다.

이 경우 myisam_sort_buffer_size를 늘리는 것이 의미가 없으므로 (myisam_sort_buffer_size vs sort_buffer_size에 대한 대답은 값을 늘리는 것이 바람직하지 않음을 의미합니다). 컴퓨터에는 32GB의 RAM이 있습니다.

답변

1

100GB 데이터를 오프라인으로 처리하는 경우. 데이터를 별도의 테이블로 분할하여 일괄 처리 테이블을 생성합니다. 각 테이블에는 적절한 인덱스 및 데이터베이스 엔진을 사용하여 수천만 개의 데이터가 저장됩니다.

실시간 응용 프로그램에서 해당 데이터를 온라인으로 사용하는 경우 대용량 데이터 볼륨 관리에 대한 아래 링크를 참조하십시오. What database works well with 200+GB of data?

3

myisamchk의 정렬 버퍼 크기를 늘리면됩니다.

myisamchk -r -q TABLE.MYI --sort_buffer_size=2G 

여기를 발견 https://ma.ttias.be/mysql-myisamchk-error-myisam_sort_buffer_size-is-too-small/

+0

(이상적?)를 sort_buffer_size 값은 가장 큰 인덱스 + 약간의 오버 헤드를 보유 할 수 있어야한다 - 모든 인덱스의 합,하지만 최대의 크기를. 버퍼가 충분히 크지 않은 경우 세그멘테이션 오류가 발생했습니다. – user3127882