Code:General log
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)