2009-06-03 12 views
5

Come posso inserire enormi BLOB in un database MySQL (InnoDB)?Gestione di enormi Blob in MySQL?

Campi di tipo LONGBLOB supportano dimensioni di dati fino a 4 GB secondo il manuale MySQL. Ma come entrano nel database i dati di dimensioni così grandi?

Ho cercato di usare

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

che non riesce se la dimensione del hugefile è più grande di circa 500 MB. Ho impostato max_allowed_packet in una dimensione appropriata; il valore di innodb_buffer_pool_size non sembra avere alcuna influenza.

La mia macchina server esegue Windows Server 2003 e ha 2 GB di RAM. Sto usando MySQL 5.0.74-enterprise-nt.

+0

Solo perché puoi non significa che dovresti. – Kekoa

+3

@kekoav So che in determinati ambienti è preferibile archiviare i file nel filesystem che nel DB, ma indipendentemente da questa discussione devo sapere come funziona per memorizzare dati come questo al fine di poterlo provare e formare un'opinione su vantaggi e svantaggi di entrambe le soluzioni (memorizzazione nel filesystem e memorizzazione nel DB). Grazie per la vostra comprensione in anticipo! –

risposta

2

I BLOB sono memorizzati nella memoria, è per questo che si avranno copie di un BLOB mentre lo si inserisce in un database.

Il BLOB da 500 MB occupa 1.500 MB di RAM, che sembra raggiungere il limite di memoria.

+0

Quindi ho bisogno di una macchina a 64 bit con> 12 GB di RAM per poter inserire 4 GB BLOB? –

+0

@oli_arborum: sembra così. Vedi qui: http://www.mysql.com/news-and-events/newsletter/2003-09/a0000000237.html – Quassnoi

1

Non so quale client/api si usi, ma quando si tenta di utilizzare i BLOB dai propri client Java e Objective-C, MySQL in realtà non supporta lo streaming di BLOB. Hai bisogno di abbastanza memoria per contenere l'intero blob come array di byte in ram (lato server e client) più di una volta! Passare a Linux a 64 bit aiuta, ma non è la soluzione desiderata.

MySQL ist non creato per la gestione dei BLOB (ok per piccoli BOB :-). Occupa due o tre volte la RAM da memorizzare/leggere nel "BLOB".

Devi usare un altro database come PostgreSQL per ottenere il vero supporto BLOB, mi spiace.

+0

Per non avere bisogno della RAM di dimensione (BLOB) sul client, ho usato la riga di comando mysql client e la funzione LOAD_FILE(), che utilizza solo la RAM del server. –