Jak włączyć dziennik zapytań MySQL?


252

Jak włączyć funkcję MySQL, która rejestruje każdą instrukcję zapytania SQL otrzymaną od klientów i czas wysłania instrukcji zapytania? Czy mogę to zrobić w phpmyadmin lub NaviCat? Jak analizować dziennik?

Odpowiedzi:


301

Po pierwsze, pamiętaj, że ten plik dziennika może być bardzo duży na zajętym serwerze.

Dla mysql <5.1.29:

Aby włączyć dziennik kwerend, umieścić to w /etc/my.cnfw [mysqld]dziale

log   = /path/to/query.log  #works for mysql < 5.1.29

Ponadto, aby włączyć go z konsoli MySQL

SET general_log = 1;

Zobacz http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Dla mysql 5.1.29+

W mysql 5.1.29+ logopcja jest przestarzała. Aby określić plik dziennika i włączyć rejestrowanie, użyj tego w my.cnf w [mysqld]sekcji:

general_log_file = /path/to/query.log
general_log      = 1

Alternatywnie, aby włączyć rejestrowanie z konsoli MySQL (musisz także jakoś określić lokalizację pliku dziennika lub znaleźć lokalizację domyślną):

SET global general_log = 1;

Należy również pamiętać, że istnieją dodatkowe opcje rejestrowania tylko wolnych zapytań lub tych, które nie używają indeksów.


1
To nie działa w MySQL 5.6.19. Czy zmienili to ponownie?
Alex R

5
log_ogólny = na plik_log_ogólny = / ścieżka / do / query.log pracował dla mnie
Kiren Siva

27
To zadziałało dla mnie (MySQL 5.6.12 w systemie Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
2015

Upewnij się, że uprawnienia dostępu użytkownika mysql do pliku dziennika, w przeciwnym razie zwróci błąd „nie znaleziono” podczas ustawiania parametru general_log w konsoli MySQL
Will R.

W przypadku wersji 5.6.22 @youen wszystko było w porządku. Dzięki! Jedyną rzeczą do upewnienia się jest to, że katalog i plik, w którym są zapisywane, istnieje i jest zapisywalny przez mysql.
NightOwlPrgmr

189

Spójrz na tę odpowiedź na inne powiązane pytanie. Pokazuje, jak włączyć, wyłączyć i zobaczyć dzienniki na serwerach na żywo bez ponownego uruchamiania.

Zaloguj wszystkie zapytania w mysql


Oto podsumowanie:

Jeśli nie chcesz lub nie możesz zrestartować serwera MySQL, możesz postępować w ten sposób na uruchomionym serwerze:

  • Utwórz tabele dziennika (patrz odpowiedź )

  • Włącz rejestrowanie zapytań w bazie danych (zwróć uwagę, że ciąg „tabela” powinien być umieszczony dosłownie i nie powinien być zastępowany żadną nazwą tabeli. Dzięki Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Zobacz dziennik
select * from mysql.general_log;
  • Wyłącz rejestrowanie zapytań w bazie danych
SET global general_log = 0;

18
Należy zauważyć, że „tabela” ma być wprowadzana dosłownie, a nie zastępowana nazwą tabeli w bazie danych.
Nicholas Pickering,

1
W systemie Mac OS X instalator oprogramowania MySQL automatycznie utworzył tabelę general_log z typem CSV. Oznacza to, że mogę także ogonić odpowiedni plik CSV: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

Po ustawieniu globalnego log_output = 'table'; czy wolne zapytanie będzie zapisywać do pliku? Myślę, że po SET globalny general_log = 0; powinieneś ustawić poprzednią wartość „log_output”, prawdopodobnie jest to „PLIK”
użytkownik2602807

59

Używam tej metody do logowania, gdy chcę szybko zoptymalizować różne obciążenia strony. To mała wskazówka ...

Logowanie do TABELI

SET global general_log = 1;
SET global log_output = 'table';

Następnie możesz wybrać z mojego mysql.general_log tabeli, aby pobrać ostatnie zapytania.

Mogę wtedy zrobić coś podobnego do tail -fmysql.log, ale z większymi udoskonaleniami ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Ułatwia to sprawdzenie moich zapytań, które mogę spróbować ograniczyć. Korzystam z 8-sekundowego interwału, aby pobierać tylko zapytania wykonane w ciągu ostatnich 8 sekund.


57

To było już w komentarzu, ale zasługuje na własną odpowiedź: Bez edycji plików konfiguracyjnych: w mysql, jako root, wykonaj

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

Nie zapomnij go później wyłączyć:

SET global general_log = off;

1
Odkryłem, że pod Linuksem systemd, jeśli spróbujesz zalogować się do pliku /tmp/, może skończyć się gdzieś jak/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley

14

Możesz wyłączyć lub włączyć ogólny dziennik zapytań (który rejestruje wszystkie zapytania) za pomocą

SET GLOBAL general_log = 1 # (or 0 to disable)

W moim przypadku ogólnego dziennika zapytań nie można włączyć na współdzielonych serwerach hostingowych. Mogę włączyć tylko wolny dziennik zapytań, a administratorzy systemu mogą na żądanie udostępniać wpisy dotyczące mojego konta.
Feng-Chun Ting,

9

Chciałem również włączyć plik dziennika MySQL, aby zobaczyć zapytania, i rozwiązałem to za pomocą poniższych instrukcji

  1. Iść do /etc/mysql/mysql.conf.d
  2. otwórz plik mysqld.cnf

i włącz poniższe linie

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. zrestartuj MySQL za pomocą tego polecenia /etc/init.d/mysql restart
  2. przejdź do /var/log/mysql/i sprawdź dzienniki

Można zapisać te ustawienia w pliku conf, aby były stosowane przy każdym uruchomieniu MySQL, ale nie trzeba ponownie uruchamiać MySQL, aby zastosować tę konfigurację. Możesz to ustawić za pomocą „SET global”, jak powiedzieli inni.
Angel

6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 

3

W systemie Windows możesz po prostu przejść do

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Wstaw tę linię do my.ini

general_log_file = c:/wamp/logs/mysql_query_log.log

Plik my.ini w końcu wygląda tak

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...

3

W wersji MySQL 5.6 występuje błąd. Nawet mysqld pokazuje jako:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Naprawdę ustawienia są odczytywane w następującej kolejności:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Sprawdź plik: „C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini”

Mam nadzieję, że to komuś pomoże.


Czy jest gdzieś raport o błędzie dla tego błędu?
mwfearnley

1

dla mysql> = 5.5 tylko dla wolnych zapytań (1 sekunda i więcej) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes

1
Jest to niepoprawne - włącza dziennik wolnych zapytań, a nie dziennik zapytań.
Sam Dufel,

Myślę, że musisz użyć myślników.
AFA Med

1

Aby włączyć dziennik zapytań na komputerze MAC:

Otwórz następujący plik:

vi /private/etc/my.cnf

Ustaw adres URL dziennika zapytań w sekcji „mysqld” w następujący sposób:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Niewiele maszyn nie rejestruje zapytania poprawnie, więc w takim przypadku możesz włączyć je z konsoli MySQL

mysql> SET global general_log = 1;

1

Nie do końca odpowiedź na pytanie, ponieważ pytanie ma już świetne odpowiedzi. To jest informacja dodatkowa. Włączenie general_log naprawdę obniża wydajność MySQL. general_log =1Przypadkowo opuściłem serwer produkcyjny i spędziłem godziny, by dowiedzieć się, dlaczego wydajność nie jest porównywalna z podobną konfiguracją na innych serwerach. Potem znalazłem to, co wyjaśnia wpływ włączenia ogólnego dziennika. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Istota historii, nie umieszczaj general_log=1w .cnfpliku. Zamiast tego używaj set global general_log =1przez krótki czas, aby się zalogować, aby dowiedzieć się, co próbujesz znaleźć, a następnie wyłączyć.


0

W phpMyAdmin 4.0, przejdź do Status> Monitor. Tam możesz włączyć dziennik wolnych zapytań i dziennik ogólny, zobaczyć monitor na żywo, wybrać część wykresu, zobaczyć powiązane zapytania i je przeanalizować.


0

W pewnym momencie musiałem upuścić i ponownie utworzyć dziennik ogólny. Podczas odtwarzania zestawy znaków zostały popsute i skończyło się na tym błędzie w dziennikach:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Więc jeśli standardowa odpowiedź „sprawdź, czy logowanie jest włączone” nie działa, sprawdź, czy pola mają odpowiedni zestaw znaków.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.