Code:General log
Z Motława
Często przydatna jest możliwość śledzenia wykonywanych przez aplikację zapytań. Można do tego wykorzystać tabelę mysql.general_log.
Przede wszystkim należy sprawdzić, czy general_log jest przechowywany w tabeli czy w pliku:
mysql> show variables like "log_output"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_output | TABLE | +---------------+-------+
Jeśli w odpowiedzi otrzymujemy:
+---------------+-------+ | log_output | FILE | +---------------+-------+
to konieczna jest ustawienie parametru w /etc/my.cnf:
log-output=TABLE
Rejestrowanie logu jest włączane zmienną general_log:
mysql> show variables like "general_log"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | OFF | +---------------+-------+ 1 row in set (0.01 sec) mysql> set global general_log=ON; Query OK, 0 rows affected (0.00 sec) mysql> show variables like "general_log"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | ON | +---------------+-------+ 1 row in set (0.01 sec)
Po uaktywnieniu logu trzeba określić numer połączenia, które chcemy sledzić, tak by zapytania innych użytkowników nie zaciemniały obrazu.
mysql> show processlist; +-----+---------+------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+---------+------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+ | 541 | root | localhost | ht | Query | 0 | NULL | show processlist | | 548 | int | 192.168.0.3:4331 | ht | Query | 4 | Writing to net | SELECT SUBSTRING(PL.Symbol, 1, LENGTH(PL.Symbol) - 1 - LENGTH(SUBSTRING_INDEX(PL.Symbol, '|', -1))) | +-----+---------+------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
a następnie odpytać tabelę o np ostatnie 5 zapytań:
mysql> select event_time,left(argument,100) as query from mysql.general_log where thread_id=548 order by event_time desc limit 5; +---------------------+------------------------------------------------------------------------------------------------------+ | event_time | query | +---------------------+------------------------------------------------------------------------------------------------------+ | 2010-03-18 14:06:32 | update `profile` set `valuex` = '>/object GLLayout_FGL: TGLLayout\r\n Stored_IdStored = \'FDBCSp | | 2010-03-18 14:06:32 | update `profile` set `valuex` = '>/<?xml version=\"1.0\" standalone=\"yes\"?> <DATAPACKET Versio | | 2010-03-18 14:06:32 | COMMIT | | 2010-03-18 14:06:32 | UPDATE profile p, osoby o SET p.OwnerGUID=o.GUID WHERE p.useridn = o.idnuser AND p.ownerGUID='' AND | | 2010-03-18 14:06:32 | | +---------------------+------------------------------------------------------------------------------------------------------+ 5 rows in set (0.60 sec)
lub np. szczegóły ostatniego czwartego od końca
mysql> select * from mysql.general_log where thread_id=548 order by event_time desc limit 3,1\G *************************** 1. row *************************** event_time: 2010-03-18 14:06:32 user_host: int[int] @ [192.168.0.3] thread_id: 548 server_id: 1 command_type: Query argument: UPDATE profile p, osoby o SET p.OwnerGUID=o.GUID WHERE p.useridn = o.idnuser AND p.ownerGUID='' AND o.idnuser<>'' 1 row in set (0.71 sec)
WAŻNE
Po zakończonym śledzeniu warto wyłączyć general_log, żeby nie spowodować przepełnienia dysku:
mysql> set global general_log=OFF; Query OK, 0 rows affected (0.00 sec) mysql> show variables like "general_log"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | general_log | OFF | +---------------+-------+ 1 row in set (0.01 sec)