Problemi InnoDB su MySQL

24 febbraio 2008

Recentemente ho cancellato un database con tabelle InnoDB e varie foreign key, e mi sono ritrovato con l’impossibilità di ricreare il medesimo database perché InnoDB si lamentava di foreign key con nomi duplicati, ma in realtà il duplicato era la chiave stessa sul vecchio database. Praticamente il database era stato rimosso da MySQL, ma nel dizionario dei dati di InnoDB era rimasta traccia delle chiavi esterne.
Per risolvere la situazione bisogna “fregare” InnoDB creando la tabella incriminata senza nessuna foreign key e engine=innodb, e poi rimuoverla e tutto tornerà normale.

in English:If removing an InnoDB table and trying to re-create it you get a duplicate foreign key name error and there is no real duplicate you fell in my same problem. I dropped a database with an InnoDB table with foreign keys, and when I tried to reload the db dump I got errors saying I had a duplicate foreign key, but the duplicate really was the same table: MySQL removed the database correctly from its data dictionary, while InnoDB left traces of the foreign key constraints.
To solve the problem you have to “cheat” InnoDB, so issue the create table command with no foreign key constraint, then drop the table and you’re set.


Ajax

7 gennaio 2006

Ultimamente sono stato anche io contagiato dalla “mania” per questo nuovo (sembra nuovo ma non lo è) modo di concepire le applicazioni Web. Naturalmente mi piacerebbe avere PensieriParole così, ma di certo non mi metto a riscrivere tutto…

Per chi non lo sapesse AJAX significa “Asyncronous JavaScript And XML”, potete vedere di cosa sto parlando su questo sito. Perchè piace? Perchè finalmente ci si libera della necessità di caricare ogni volta una nuova pagina per eseguire qualsiasi operazione. Grazie alla nuova possibilità di caricare al volo file XML (e non solo) tramite JavaScript, ci può essere un nuovo canale di comunicazione tra client e server. Già si parla di Web 2.0 per riferirsi alle applicazioni di questo tipo.

Sicuramente un grande impulso allo sviluppo di questo tipo di soluzioni lo ha dato Google, che ne ha fatto il suo cavallo di battaglia. Basti pensare a Google Mappe, a Google Suggest, e a quello che nessuno degli utenti di Google vede ma che succede ogni volta che si clicca su un link nei risultati del motore di ricerca… (basta soffermarsi un attimo sul codice javascript per accorgersene)
Ma l’idea non è per niente nuova! Tra la 4ª e 5ª superiore (quindi nel 2001 se non vado errato) feci uno stage di 3 mesi presso E-TREE (se non la conosci vai subito a vedere il sito!), lì il mio Tutor, DM uno dei primi dipendenti della società, vorrei dire un guru, mi aveva fatto realizzare un piccolo “esperimento” che lui non aveva tempo di realizzare. Un codice JavaScript doveva caricare dal database la parte interna della pagina, via XMLHTTPRequest. A quel tempo il tutto funzionava solo in Internet Explorer, ma la visione di DM era già quella che un giorno si sarebbe potuto risparmiare moltissima banda con questo sistema.

In realtà volevo scrivere di una cosa di cui sono contento che ho fatto oggi, non disquisire su Ajax… Sì, oggi ho cominciato una piccola cosa per l’amministrazione di PensieriParole, ed è una cosa abbastanza strana. In pratica il PHP si occupa, come normale, di lavorare sul database, e il JavaScript di mostrare all’utente cosa sta accadendo. Per ora la cosa che fa è prendere tutte le frasi del sito e creare un indice delle parole, ma il bello è che questa operazione (lunga) viene eseguita su lotti di frasi alla fine dei quali posso incrementare una progress bar, così si vede in tempo reale a che punto sta il lavoro.

Visto che questa cosa è gestita come un Automa a stati finiti, mi chiedevo se qualcuno aveva pensato a realizzare una specie di framework per delle cose simili. Per ora sto usando molta fantasia e l’insostituibile Prototype.


InnoDB

7 dicembre 2005

PensieriParole si è appoggiato fino ad ora, e si sta appoggiando, al tipo di tabella standard di MySQL dalla versione 3: MyISAM. Questo tipo di tabella è veloce, ma non da molte sicurezze per la gestione concorrente dei dati. In particolare si sente la mancanza di alcune cose che un software complicato come quello che gestisce il nostro sito necessita: il supporto completo delle proprietà ACIDe. E qui arriva il colpo: MyISAM non supporta le transazioni, uno strumento fondamentale quando si ha a che fare con modifiche contemporanee alla base di dati come in PP.

Allora uno si guarda in giro e vede di InnoDB, incluso in MySQL che permette dalla versione 4 di supportare le transazioni. WOW! Poi legge da qualche altra parte che le prestazioni degradano e le tabelle vengono a pesare 5 volte di più… mmmhhh… bisogna pensarci due volte ad una migrazione del genere. Poi si continua a leggere e si viene a scoprire che in MySQL 5 InnoDB è il tipo di tabella predefinito, e si pensa “ma bisogna essere stupidi per sostituire una cosa più veloce con una più lenta”. E lo slogan del “più veloce server database open source” continua a campeggiare in home page di mysql.com. Allora i conti non tornano.

Continuo a cercare e scopro che InnoDB esegue locking a livello di riga invece che a livello di tabella per gli aggiornamenti. Sarebbe a dire che se io modifico un campo in una riga, MyISAM fa attendere tutte le altre transazioni che stanno per scrivere sulla stessa tabella, InnoDB solo quelle che vogliono scrivere la stessa riga. Il livello migliore sarebbe un locking al singolo campo, ma non penso sia possibile con nessun DBMS in commercio 😀 . Questo implica un aumento delle prestazioni immediato! Basti pensare a PensieriParole: per ogni due utenti che votano nello stesso istante due frasi di verse, con MyISAM il secondo deve attendere che il primo abbia finito, con InnoDB non c’è attesa! Quindi quella che prima sembrava una mossa azzardata comincia a prendere senso nella mia testa.

Continuo a leggere e mi imbatto in una cosa ancora più interessante: InnoDB è stata acquistata due mesi fa da Oracle. Beh! Una delle maggiori aziende mondiali nel campo dei database che acquista un’azienducola finlandese? Vorrà pur dire qualcosa!

Morale: mai fidarsi delle cose che leggi di primo acchito in rete

Seconda morale: a breve convertirò PensieriParole per usare InnoDB 😛


MD5 vs SHA1

26 ottobre 2005

Per il nuovo PensieriParole ho deciso di passare a SHA1 per criptare le password internamente. Ho letto che la stessa RSA Security consiglia di non usare MD5 perchè poco sicuro. SHA1 è una criptazione ad una via, come MD5, a 160 bit. Per memorizzarlo in MySQL usate un campo
CHAR(40) character set latin1 collate latin1_bin