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?
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:
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.cnf
w [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+ log
opcja 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.
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
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';
select * from mysql.general_log;
SET global general_log = 0;
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 -f
mysql.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.
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;
/tmp/
, może skończyć się gdzieś jak/tmp/systemd-private-...-mariadb.service-.../tmp/
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)
Chciałem również włączyć plik dziennika MySQL, aby zobaczyć zapytania, i rozwiązałem to za pomocą poniższych instrukcji
/etc/mysql/mysql.conf.d
i włącz poniższe linie
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
/var/log/mysql/
i sprawdź dzienniki// 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;
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
...
...
...
...
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.
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
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;
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 =1
Przypadkowo 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=1
w .cnf
pliku. Zamiast tego używaj set global general_log =1
przez krótki czas, aby się zalogować, aby dowiedzieć się, co próbujesz znaleźć, a następnie wyłączyć.
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ć.
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.