Visualizzare gli errori negli script MySQL

Postato da ROb | nella categoria MySQL | martedì, 23 marzo 2010

0

A chi sviluppa con database MySQL può capitare di incappare ogni tanto in alcuni errori all’apparenza criptici, come il seguente:

Error executing SQL commands to update table.
MySQL Error Nr. 1025
Error on rename of './dbtest/#sql-2993_a' to './dbtest/table' (errno: 150)

errori script mysql

Sia che si utilizzi la command line (il comando mysql) sia che si utilizzi un’interfaccia grafica più evoluta, come ad esempio MySQL Query Browser, spesso gli errori che MySQL riporta sull’esecuzione di script o comandi sql non vengono opportunamente descritti.

L’unico modo efficiente che ho trovato per poter visualizzare la causa esatta di tali errori è la seguente:

SHOW ENGINE INNODB STATUS;

Questo comando MySQL permette di conoscere lo stato degli indici InnoDB di MySQL (a patto ovviamente che usiate tale motore per le vostre tabelle) e di visualizzare l’ultimo errore verificatosi. Molto spesso infatti gli errori che si verificano durante la modifica di un db sono legati a vincoli o indici e quindi attraverso questo comando è possibile avere una descrizione dettagliata e decisamente esauriente rispetto al messaggio ricevuto via console o nella gui di amministrazione.

Ecco l’esempio di un output di tale comando:

mysql> SHOW ENGINE INNODB STATUS;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Status                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
=====================================
100323  8:17:40 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 45 seconds
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 576, signal count 576
Mutex spin waits 0, rounds 127, OS waits 2
RW-shared spins 31, OS waits 18; RW-excl spins 569, OS waits 556
------------------------
LATEST FOREIGN KEY ERROR
------------------------
100323  8:17:17 Error in foreign key constraint of table dbname/table:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match to the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
  CONSTRAINT fk_table FOREIGN KEY (FK_ID) REFERENCES table2 (ID) ON DELETE NO ACTION ON UPDATE NO ACTION
------------
TRANSACTIONS
------------
Trx id counter 0 6370649
Purge done for trx's n:o < 0 6370649 undo n:o < 0 0
History list length 17
Total number of lock structs in row lock hash table 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 6370637, not started, process no 10643, OS thread id 3018464144
MySQL thread id 10, query id 5029 localhost root
---TRANSACTION 0 0, not started, process no 10643, OS thread id 3018599312
MySQL thread id 9, query id 5030 localhost root
SHOW ENGINE INNODB STATUS
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (write thread)
Pending normal aio reads: 0, aio writes: 0,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
7100 OS file reads, 119 OS file writes, 65 OS fsyncs
0.58 reads/s, 18274 avg bytes/read, 1.87 writes/s, 0.67 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2,
0 inserts, 0 merged recs, 0 merges
Hash table size 34679, used cells 1398, node heap has 3 buffer(s)
0.11 hash searches/s, 6.42 non-hash searches/s
---
LOG
---
Log sequence number 0 347867737
Log flushed up to   0 347867737
Last checkpoint at  0 347867737
0 pending log writes, 0 pending chkp writes
46 log i/o's done, 0.40 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 34357238; in additional pool allocated 1048576
Buffer pool size   512
Free buffers       0
Database pages     509
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages read 10026, created 4, written 79
0.64 reads/s, 0.09 creates/s, 1.62 writes/s
Buffer pool hit rate 987 / 1000
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 10643, id 2990709648, state: sleeping
Number of rows inserted 8, updated 0, deleted 0, read 460381
0.18 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.18 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

L’errore sull’indice viene evidenziato nelle righe comprese tra (19-25 comprese):

------------------------
LATEST FOREIGN KEY ERROR
------------------------

e

------------
TRANSACTIONS
------------

In questo caso segnala l’impossibilità di eseguire la cancellazione di una colonna della tabella perché utilizzata all’interno di un indice, bisogna prima cancellare l’indice agganciato.

Rimpiazzare stringhe all’interno di campi di tabelle MySQL

Postato da ROb | nella categoria Sviluppo web, Varie | lunedì, 15 marzo 2010

0

Se avete bisogno di cercare e rimpiazzare una stringa all’interno di un campo in una tabella di un database MySQL esiste la comodissima istruzione replace.

Ipotizziamo di avere la tabella studenti con un campo tel e di voler rimpiazzare tutte le occorrenze del prefisso 0733 con il prefisso +39 0733, ecco il comando SQL per farlo:

update studenti set tel = replace(tel, '0733', '+39 0733');

E’ importante ricordare che la ricerca del testo è case sensitive.

Ulteriori informazioni su replace le trovate nella documentazione ufficiale.

L’alternativa open di Google Analytics: Piwik

Postato da ROb | nella categoria Sviluppo web, Utilità | sabato, 6 marzo 2010

2

Chi lavora nel mondo dello sviluppo web e del web marketing sicuramente conosce ed utilizza quotidianamente Google Analytics.
Veloce, flessibile, potente e pochissimo invasivo… queste tutte le qualità di GA (Google Analytics) a costo zero.
A tutto questo però si contrappongono due aspetti: non è open source e non abbiamo tutti i dati dei nostri accessi (ma solamente i dati aggregati, nelle varie forme, che Google ci presenta).

statistics

Pochi giorni fa mi sono imbattuto in questo interessantissimo progetto di nome Piwik che, dichiaratamente, si propone come l’alternativa open a GA.

L’installazione richiede un server con PHP dalla versione 5.1.3 in poi e MySQL dalla versione 4.1 in avanti.
Al termine dell’installazione è possibile iniziare a creare i profili dei nostri siti.
Il meccanismo di tracking degli accessi è molto simile a quello di GA; Piwik, per ogni sito, genera una porzione di codice Javascript da copiare e incollare nelle nostre pagine.

Per quanto riguarda la pagina di visualizzazione dei dati raccolti è altamente customizzabile e già multilingua. Il meccanismo di personalizzazione sfrutta il concetto degli widget.
In pratica la dashboard è composta da una serie di widget predefiniti e altri creabili ed aggiungibili a piacere.

piwik screenshot

Ciliegina sulla torta inoltre la possibilità di inserire le statistiche di Piwik direttamente nel nostro sito in tempo reale.

A questo indirizzo è disponibile la demo online, mentre questa è la pagina del progetto.

MySQL Workbench, lo strumento principe per il db design con MySQL

Postato da ROb | nella categoria Java, Linux, Sviluppo web | martedì, 2 febbraio 2010

0

Negli ultimi tempi, prima di iniziare a scrivere il codice sql necessario alla creazione di tabelle e indici, ho imparato a modellare le entità attraverso MySQL Workbench, lo strumento di design di MySQL.

MySQL Workbench nasce dalle ceneri del bellissimo e potente DbDesigner 4 della fabFORCE, disponibile in ambiente Windows e sviluppato con librerie Qt.

Le prime versioni di MySQL Workbench erano praticamente inusabili: crash continui e improvvisi impedivano di utilizzarlo in modo produttivo.
La versione che ho installato qualche mese fa (cioè la 5.1.17) è invece sorprendentemente stabile e ben realizzata.

Schermata di avvio MySQL Workbench

Con questo software MySQL (ormai Oracle) ha pensato di dare una mano agli sviluppatori open source per poter progettare e realizzare in modo grafico strutture dati complesse.
MySQL Workbench permette di creare tabelle, relazioni fra tabelle, indici. Con tali oggetti è possibile, tramite trascinamento costruire diagrammi E/R (tutte le relazioni vengono visualizzate anche graficamente) che possono essere arricchiti di immagini e layer (contenitori colorati di tabelle).
Dopo qualche ora di lavoro, MySQL WB ripaga gli sforzi fatti per apprenderlo e ci permette di dominare schemi anche molto densi di tabelle.

MySQL Workbeanch al lavoro sul database di demo Sakila

MySQL Workbeanch al lavoro sul database di demo Sakila

Al termine del processo di design è possibile puntare direttamente a un db, locale o remoto, per materializzare tutti gli oggetti creati.
Altra funzionalità decisamente comoda è anche il Reverse Engineering da un db, che permette di ricostruire lo schema grafico partendo da un’istanza di db già esistente.

Non manca neanche la funzione di sincronizzazione modello che evidenzia le incoerenze tra modello e db e riporta le modifiche all’uno o all’altro dei due sistemi.