Come acquisire le query eseguite sul server MySQL?


14

Stiamo cercando di eseguire il debug delle prestazioni del server e vorrei acquisire un'istantanea delle query eseguite sul nostro server MySQL per un periodo di un paio di minuti.

Ho familiarità con MySQL SHOW FULL PROCESSLIST, tuttavia mi piacerebbe essere in grado di eseguirlo tramite la riga di comando in modo da poterlo scaricare in un file e post-elaborarlo.

C'è un modo per generare questa query in un file e farlo funzionare ogni secondo?

Esiste un modo migliore per acquisire tutte le query in esecuzione?

Nota che non sono interessato solo alle query lente (ho familiarità con il registro delle query lente).


Quale sistema operativo stai eseguendo? Questo è estremamente facile da fare su Linux, quindi sto indovinando Windows?
Patrick,

@Patrick Sono contento di sentire che è facile su Linux! Spara via ...
hafichuk,

1
La maggior parte delle query verrà eseguita e terminata in meno di un secondo e non verrà mai visualizzata nell'elenco.
Joel Coel,

query più lunghe appariranno più volte una volta per ogni ciclo, ma di sicuro se vuoi puoi semplicemente echo show full processlist | mysqlo meglio SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"in un ciclo in bash. Aggiungi un paio di righe e otterrai la stessa funzionalità di query di innotopo pt-kill
theist

Risposte:


10

Vorrei utilizzare il registro delle query lente. Cattura tutte le query, non solo quelle lente, se si imposta long_query_time = 0.

Cattura anche TUTTE le query, il che non è vero per le tecniche di annusamento TCP menzionate qui; quelli non cattureranno le query eseguite tramite un socket. Idem per guardare SHOW PROCESSLIST; ti mancheranno query veloci.

Se si desidera acquisire query tramite la processlist o tramite il traffico TCP, suggerirei di utilizzare pt-query-digest di Percona Toolkit. Può sondare la lista dei processi per te (e dare un senso ai risultati, il che è molto difficile da fare se ne stai catturando un sacco di campioni tu stesso), e può interpretare il protocollo TCP di MySQL, quindi puoi prendere un po 'di TCP traffico e analizzarlo. Naturalmente, è anche il miglior aggregatore / profiler / reporter di query mai scritto, ma non hai detto cosa vuoi fare con le query dopo averle acquisite.


13

Il modo più efficace sarebbe quello di utilizzare il "registro generale delle query", che acquisirà tutte le query: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Non specifichi la versione del server MySQL, ma se hai la versione 5.1.12 o successiva puoi abilitarla e disabilitarla con una variabile globale tramite SQL; guarda la documentazione per dettagli.


Grazie @ Daniele. Abbiamo attivato questa opzione, tuttavia non ci sono informazioni di data e ora nel registro. Qualche idea su come ottenere un timestamp lì?
hafichuk,

Scusa, no, nient'altro che indicarti il ​​manuale.
Daniel Pittman,

2
Il registro delle query lente con long_query_time = 0 è un'opzione migliore; acquisirà comunque tutte le query.
Barone Schwartz,

+1 per il barone: il registro generale delle query non include le metriche delle prestazioni necessarie. Esistono anche script perl in bundle con il server MySQL per l'analisi del registro delle query lente (che rimuove i valori letterali dai predicati). Tuttavia, tieni presente che le versioni precedenti di MySQL non supporteranno un tempo long_query_time di meno di 1 secondo - se è il tuo caso, aggiorna - ci sono molti più miglioramenti delle prestazioni nelle versioni recenti.
symcbean,


4

Sicuro:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

Saluti


Ah ... mysqladmin. Perfetto, grazie @ HTTP500
hafichuk,

1
Questo in realtà esegue il comando processlist ogni 1 secondo. Alcune query molto veloci possono ancora sfuggire all'acquisizione; se il carico è composto da poche query di grandi dimensioni funzionerà, se è composto da molte query di piccole dimensioni potrebbe non funzionare.
LSerni il

@Isemi, il PO ha chiesto "ogni secondo circa".
HTTP500,

4

Questo potrebbe essere un posto per il proxy Mysql . Fondamentalmente ti consente di catturare (e manipolare) le query inviate. Una configurazione di base da intercettare è piuttosto semplice. Quindi basta modificare la configurazione del client in modo che punti al proxy in modo da poter acquisire tutte le richieste.


4

Il programma tshark di Wireshark basato su terminale può aiutare:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkti darà tshark su Amazon Linux e sudo apt-get install tsharkti darà tshark su Ubuntu 14+


3

Ho usato la soluzione di "Rui Pedro Bernardino. Funziona alla grande tranne che ho cambiato un paio di cose nella prima riga come descritto di seguito ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

Stavo cercando e cercando e infine sono arrivato a MONyog per monitorare tutte le query in tempo reale che vengono eseguite nel server mysql. L'unica cosa da notare è "Performance_schema" e la tabella "statement_digest" deve essere abilitata e Performance_schema è disponibile con MySQL 5.6.14 e versioni successive.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.