2009-06-03 16 views
5

¿Cómo puedo insertar enormes BLOB en una base de datos MySQL (InnoDB)?Manejo de grandes blobs en MySQL?

Los campos de tipo LONGBLOB admiten tamaños de datos de hasta 4 GB de acuerdo con el manual de MySQL. Pero, ¿cómo entran datos de un tamaño tan grande en la base de datos?

He intentado utilizar

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

el que falla si el tamaño de hugefile es más grande que alrededor de 500 MB. Establecí max_allowed_packet en un tamaño apropiado; el valor de innodb_buffer_pool_size no parece tener una influencia.

Mi máquina servidor ejecuta Windows Server 2003 y tiene 2 GB de RAM. Estoy usando MySQL 5.0.74-enterprise-nt.

+0

El hecho de que pueda no significa que deba hacerlo. – Kekoa

+3

@kekoav Sé que en ciertos entornos es mejor almacenar archivos en el sistema de archivos que en DB, pero independientemente de esta discusión, debo saber cómo funciona para almacenar datos como este con el fin de poder probarlo y formar una opinión. sobre las ventajas y desventajas de ambas soluciones (almacenamiento en sistema de archivos y almacenamiento en DB). Gracias por su comprensión de antemano! –

Respuesta

2

BLOB se almacenan en caché en la memoria, es por eso que tendrá 3 copias de un BLOB como si lo está insertando en una base de datos.

Su BLOB de 500 MB ocupa 1.500 MB en RAM, lo que parece alcanzar su límite de memoria.

+0

Entonces, ¿necesito una máquina de 64 bits con 12 GB de RAM para poder insertar 4 GB de BLOB? –

+0

@oli_arborum: Parece que sí. Vea aquí: http://www.mysql.com/news-and-events/newsletter/2003-09/a0000000237.html – Quassnoi

1

No sé qué cliente/API se usa, pero al tratar de usar blobs de clientes propios de Java y Objective-C parece que MySQL no admite la transmisión de blobs. ¡Necesitas suficiente memoria para mantener todo el blob como conjunto de bytes en RAM (servidor y cliente) más de una vez! Pasar a un Linux de 64 bits ayuda, pero no es una solución deseada.

MySQL no está hecho para el manejo de BLOB (vale para pequeños BOB :-). Ocupa dos o tres veces el número de ram para ser almacenado/leído en el "BLOB".

Tienes que utilizar otra base de datos como PostgreSQL para obtener soporte BLOB real, lo siento.

+0

Para no necesitar sizeof (BLOB) RAM en el cliente, utilicé la línea de comando mysql cliente y la función LOAD_FILE(), que solo usa la RAM del servidor. –

Cuestiones relacionadas