2009-06-03 2 views
5

MySQL 데이터베이스 (InnoDB)에 거대한 BLOB를 어떻게 삽입 할 수 있습니까?MySQL에서 거대한 BLOB 처리하기?

LONGBLOB 유형의 필드는 MySQL 매뉴얼에 따라 최대 4GB의 데이터 크기를 지원합니다. 그런 엄청난 크기의 데이터는 어떻게 데이터베이스에 저장됩니까?

나는 hugefile의 크기가 약 500 MB보다 더 큰 경우 실패

INSERT INTO table (bindata) VALUES (LOAD_FILE('c:/tmp/hugefile')); 

을 사용했습니다. 적절한 크기로 max_allowed_packet을 설정했습니다. innodb_buffer_pool_size의 값은 영향을 미치지 않는 것 같습니다.

내 서버 시스템은 Windows Server 2003을 실행하며 2GB RAM이 있습니다. MySQL 5.0.74-enterprise-nt를 사용하고 있습니다.

+0

당신이 할 수 있다고해서 꼭해야한다는 것은 아닙니다. – Kekoa

+3

@kekoav 특정 환경에서는 DB보다 파일 시스템에 파일을 저장하는 것이 더 낫다는 것을 알고 있지만,이 토론과는 별도로이 데이터를 저장하고 의견을 형성하기 위해 데이터를 저장하는 방법을 알아야합니다. 두 솔루션의 장단점 (파일 시스템에 저장하고 DB에 저장). 미리 양해 해 주셔서 감사합니다! –

답변

2

BLOB가 메모리에 캐시되므로 BLOB가 데이터베이스에 삽입 될 때 BLOB 사본을 갖게됩니다.

500MB BLOB는 RAM이 1,500MB를 차지하며 메모리 제한을 초과하는 것으로 보입니다.

+0

그래서 4GB BLOB를 삽입 할 수 있으려면 12GB 이상의 RAM이 필요한 64Bit 머신이 필요합니까? –

+0

@oli_arborum : 그렇게 보입니다. http://www.mysql.com/news-and-events/newsletter/2003-09/a0000000237.html – Quassnoi

1

당신이 사용하는 클라이언트/api를 모르지만 자신의 Java 및 Objective-C 클라이언트에서 BLOB를 사용하려고 할 때 MySQL은 BLOB 스트리밍을 실제로 지원하지 않습니다. RAM (서버 및 클라이언트 측)에 바이트 배열로 전체 BLOB를 두 번 이상 보유하려면 충분한 메모리가 필요합니다! 64 비트 리눅스로 이동하는 것은 도움이되지만 원하는 해결책은 아닙니다.

BLOB 처리를 위해 MySQL을 만들지 않았습니다 (작은 BOB는 괜찮습니다 :-). "BLOB"에 저장/읽기 할 램의 2 ~ 3 배를 차지합니다.

실제 BLOB 지원을 받으려면 PostgreSQL과 같은 다른 데이터베이스를 사용해야합니다 (미안).

+0

클라이언트에 sizeof (BLOB) RAM이 필요 없도록하기 위해 mysql 커맨드 라인을 사용했다. 클라이언트 및 서버의 RAM 만 사용하는 LOAD_FILE() 함수가 있습니다. –