Jak wyświetlić ostatnie zapytania wykonane na MySQL?


471

Czy jest jakieś zapytanie / sposób pokazania ostatnich zapytań wykonanych na WSZYSTKICH serwerach?

Odpowiedzi:


793

Dla osób pobłogosławionych MySQL> = 5.1.12 możesz kontrolować tę opcję globalnie w czasie wykonywania:

  1. Wykonać SET GLOBAL log_output = 'TABLE';
  2. Wykonać SET GLOBAL general_log = 'ON';
  3. Spójrz na stół mysql.general_log

Jeśli wolisz wyprowadzać dane do pliku zamiast tabeli:

  1. SET GLOBAL log_output = "FILE"; domyślne .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Wolę tę metodę od edycji plików .cnf, ponieważ:

  1. nie edytujesz my.cnfpliku i potencjalnie na stałe włączasz rejestrowanie
  2. nie łowisz wokół systemu plików w poszukiwaniu dziennika zapytań - lub, co gorsza, rozprasza Cię potrzeba idealnego miejsca docelowego. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Nie musisz ponownie uruchamiać serwera i przerywać żadnych bieżących połączeń z nim.
  4. zrestartowanie serwera pozostawia miejsce, z którego zacząłeś (domyślnie dziennik jest nadal wyłączony)

Aby uzyskać więcej informacji, zobacz Podręcznik referencyjny MySQL 5.1 - Zmienne systemowe serwera - rejestr_ogólny


4
Świetny projekt interfejsu użytkownika. W każdym razie tabele dziennika MySQL używają silnika CSV, więc możesz zrobić wszystko, co FlipMcF powiedział w odpowiedzi na temat włączenia logowania do tabeli general_log, i mieć ogon -f dziennika_ogólnego w następujący sposób: tail -f / var / lib / mysql / mysql / general_log.CSV

2
cholera, dokument mysql do tego nawet nie strzelił do parametru tabeli. wielkie dzięki.
Abhishek Dujari


6
pamiętaj o wyczyszczeniu ogólnej tabeli dziennika po zakończeniu: „obetnij tabelę mysql.general_log”
pdwalker

1
Otrzymałem wynik w ten sposób, ale parametry są obecne według znaku zapytania, np. Wybierz foo z paska gdzie x = ?. Jak mogę uzyskać pełne zapytanie?
okwap

43

Możesz włączyć ogólny dziennik zapytań dla tego rodzaju diagnostyki. Ogólnie jednak nie rejestrujesz wszystkich zapytań SELECT na serwerze produkcyjnym, jest to zabójca wydajności.

Edytuj swoją konfigurację MySQL, np. /Etc/mysql/my.cnf - wyszukaj lub dodaj taką linię

[mysqld]
log = /var/log/mysql/mysql.log

Zrestartuj mysql, aby zmienić tę zmianę, teraz możesz

tail -f /var/log/mysql/mysql.log

Hej presto, możesz oglądać zapytania, gdy się pojawiają.


4
general_log_file i general_log w moim my.cnf
Martin Thoma


1
Nowsze wersje Mac OS X (przynajmniej Mac OS X) wymagają opcji plik_ogólny_log i plik_ogólny zamiast po prostu „log =”. W przeciwnym razie pojawia się taki błąd: ERROR / usr / local / mysql / bin / mysqld: niejednoznaczna opcja '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth

@JaySheth, dostałem ten błąd w Mariadb 10.2, więc nie jestem pewien, czy to dotyczy tylko Mac OS.
user10089632

16

Możesz zrobić płynną rzecz do monitorowania dzienników zapytań mysql.

Otwórz plik konfiguracyjny mysql my.cnf

sudo nano /etc/mysql/my.cnf

Wyszukaj następujące wiersze pod [mysqld]nagłówkiem i odkomentuj te wiersze, aby włączyć dziennik

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Uruchom ponownie serwer mysql, aby odzwierciedlić zmiany

sudo service mysql start

Monitoruj dziennik serwera mysql za pomocą następującego polecenia w terminalu

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1) Jeśli włączone jest ogólne rejestrowanie MySQL, możemy sprawdzić zapytania w pliku dziennika lub tabeli na podstawie tego, o czym wspomnieliśmy w konfiguracji. Sprawdź, co jest włączone za pomocą następującego polecenia

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Jeśli potrzebujemy historii zapytań w tabeli, to

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Spójrz na tabelę mysql.general_log

Jeśli wolisz wyprowadzać dane do pliku:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Możemy również sprawdzić zapytania w pliku .mysql_history cat ~ / .mysql_history



4

Jeśli mysql binlog jest włączony, możesz sprawdzić polecenia uruchamiane przez użytkownika, wykonując następujące polecenie w konsoli Linux, przechodząc do katalogu binlog mysql

mysqlbinlog binlog.000001 >  /tmp/statements.sql

włączanie

[mysqld]
log = /var/log/mysql/mysql.log

lub ogólny dziennik będzie miał wpływ na wydajność mysql


możliwe, ale bolesne. bardziej przydatne, jeśli chcesz zobaczyć, co się stało w przeszłości.
pdwalker


2

Po przeczytaniu odpowiedzi Paula zacząłem szukać więcej informacji na https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Znalazłem naprawdę przydatny kod przez osobę. Oto podsumowanie kontekstu.

(Uwaga: poniższy kod nie jest mój)

Ten skrypt jest przykładem utrzymywania tabeli w czystości, co pomoże ci zmniejszyć jej rozmiar. Podobnie jak po dniu, będzie około 180 000 zapytań o log. (w pliku byłoby to 30 MB dziennie)

Musisz dodać dodatkową kolumnę (event_unix), a następnie możesz użyć tego skryptu, aby utrzymać dziennik w czystości ... zaktualizuje on znacznik czasu w uniksowy znacznik czasu, usunie dzienniki starsze niż 1 dzień, a następnie zaktualizuje czas zdarzenia w znacznik czasu z event_unix ... brzmi trochę myląco, ale działa świetnie.

Polecenia dla nowej kolumny:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Skrypt czyszczenia:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Podziękowania należą się Sebastianowi Kaiserowi (autorowi kodu).

Mam nadzieję, że ktoś uzna to za przydatne tak jak ja.


Ciekawy. Będziesz przegapić zapytania podczas czyszczenia, chyba że najpierw zablokujesz wszystkie bazy danych. Mogą się tu pojawić inne problemy. Jeśli znajdujemy się w punkcie „ciągłego” rejestrowania, użyłbym rejestrowania plików lub logu bin i gotowego rotatora logów.
FlipMcF,

1

W Linuksie możesz spojrzeć na następujące elementy

cd /root

ls -al

vi .mysql_history To może pomóc


6
Wygląda na to, że działałoby to tylko dla oficjalnego klienta mysql z wiersza poleceń i tylko dla zapytań wykonywanych przez użytkownika root
golimar

Pytanie brzmi „cały serwer”, co powoduje, że ta odpowiedź jest niepoprawna. Pokaże to wszystkie zapytania wykonane przez jednego klienta.
FlipMcF,

Jeśli mysql binlog jest włączony, możesz sprawdzić polecenia uruchomione przez użytkownika, wykonując następujące polecenie w konsoli Linux, przeglądając katalog mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql włączając [mysqld] log = / var / log / mysql / mysql.log lub log genral wpłynie na wydajność mysql
Avinash Singh

Niektóre wpisy w tym są i tak domyślnie pomijane, na przykład ciągi zawierające „hasło”.
mckenzm
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.