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)