Migrazione? Attenti a MySQL!

di Gianni Tomasicchio - 8 ottobre 2009

Di recente ho dovuto spostare un'applicazione PHP/MySQL presso un nuovo fornitore di VPS. Per il setup del nuovo server (Ubuntu) ho usato Zend Server CE che include PHP 5.3.0 e MySQL 5.0.51. Sul vecchio server invece erano istallati PHP 5.1.6 e MySQL 4.1.

Ovviamente la mia prima preoccupazione è stata quella di verificare la compatibilità del codice con il nuovissimo PHP 5.3. E qui sono cominciate le sorprese...

Si, perché dopo aver testato le varie funzionalità, nel file di log degli errori di PHP non ho trovato alcuna segnalazione. I problemi invece sono arrivati dalla nuova versione di MySQL che, senza segnalare alcuna anomalia, ha cominciato a troncare gli importi inseriti (campi decimal) perché dalla versione 5.0 non viene più usato il byte del segno di tali campi per aumentare il range dei valori possibili.

A dire il vero MySQL segnala dei warning ma PHP non li intercetta e quindi passa tutto inosservato. Per evitare questo comportamento di MySQL è possibile impostare l'SQL Mode a TRADITIONAL, in modo che al posto dei warning si ottengano dei messaggi di errore e la query venga bloccata.

Questa soluzione però non è applicabile se si usano le tabelle MyISAM perché, non supportando le transazioni, si rischia di effettuare una serie di query di inserimento e update senza avere la certezza che andranno in porto tutte o nessuna. Se ad esempio l'applicativo per completare una operazione richiede un inserimento ed un update, se questo update viene abortito perché i dati che aggiornano sono troppo lunghi per il campo a cui fanno riferimento, ci si ritroverebbe solo con il record inserito dalla prima query. La base di dati si sporcherebbe in breve tempo.

La soluzione che ho adottato quindi è stata un'altra: registrare nel log degli errori anche i warning generati da MySQL. Per recuperarli, dopo ogni INSERT o UPDATE, ho effettuato la query "SHOW WARNINGS". In questo modo nel giro di pochi giorni di utilizzo dell'applicativo, ho identificato e corretto tutte le query a rischio troncamento.

Effettua l'accesso o registrati per inserire un commento