Come loggare tutte le query mysql, anche PDO

Stavi cercando da tempo come loggare tutte le query che passano su mysql? E soprattutto come fare il dump delle query generate tramite PDO con i placeholders? Bene, qui di seguito trovi i pochi e semplici comandi per ottenere il risultato:

mysql> SET GLOBAL log_output = 'FILE';
mysql> SET GLOBAL general_log_file='/tmp/mysql_all_queries.log';
mysql> SET GLOBAL general_log = 1;

Per vedere le impostazioni correnti di logging digitare

mysql> SHOW GLOBAL VARIABLES LIKE 'general_log%';

Quando hai finito di fare debug delle query su mysql, ricordati di disabilitare il log delle query mysql, altrimenti rallenta le performance, oltre a generare file enormi (nel caso di server in produzione)

mysql> SET GLOBAL general_log = 0;

A questo punto la consultazione del log sarà un banale

$ tail -f /tmp/mysql_all_queries.log

magari abbinato a grep per filtrare solo le query che interessano.

In alternativa si può scegliere di loggare le query mysql direttamente su db stesso, creando le opportune tabelle

  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'

  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'

L’unica differenza rispetto al log su file, è l’opzione

mysql> SET global log_output = 'table';

Ovviamente la consultazione sarà tramite query, magari aggiungendo le eventuali link nella where. Esempio per vedere le ultime 5 queries eseguite:

SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 5

Buon debug!

Vuoi approfondire?
Leggi su stackoverflow come loggare tutte le query mysql e pdo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.