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)