Die Antwort von @Gauis ist ausgezeichnet. Um es weiter zu ergänzen, können Sie Folgendes tun:
In MySQL 5.1 können jetzt das allgemeine Protokoll und das langsame Abfrageprotokoll als SQL-Tabellen gespeichert werden.
Fügen Sie dies zu /etc/my.cnf hinzu:
[mysqld]
log-output=TABLE
log
Starten Sie MySQL neu
Wenn mysqld dann das allgemeine Protokoll erstellt, wird anstelle einer Textdatei die Tabelle als CSV-Tabelle im Ordner / var / lib / mysql / mysql (mysql-Schemadatenbank) erstellt.
Tun Sie dies einfach, um es zu sehen:
SHOW CREATE TABLE mysql.general_log\G
Alle Verbindungen werden sich darin stapeln.
Für Sie ist das nicht sehr nützlich, wenn Sie es abfragen möchten. Es wäre jedes Mal nur ein vollständiger Tabellenscan.
Was ist zu tun ??? Wandle es in Myisam um und indiziere die Tabelle!
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;
Optional können Sie dem Argumentfeld einen Volltextindex hinzufügen.
Ich habe gerade MySQL 5.5.9 auf einem Server eingerichtet und dies ausprobiert. Hier ist das Ergebnis:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.9-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
iml-db10:3306 (DB (none)) :: show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.01 sec)
iml-db10:3306 (DB (none)) :: SET @old_log_state = @@global.general_log;
Query OK, 0 rows affected (0.00 sec)
iml-db10:3306 (DB (none)) :: SET GLOBAL general_log = 'OFF';
Query OK, 0 rows affected (0.00 sec)
iml-db10:3306 (DB (none)) :: ALTER TABLE mysql.general_log ENGINE = MyISAM;
Query OK, 9 rows affected (0.02 sec)
Records: 9 Duplicates: 0 Warnings: 0
iml-db10:3306 (DB (none)) :: ALTER TABLE mysql.general_log ADD INDEX (event_time);
Query OK, 9 rows affected (0.00 sec)
Records: 9 Duplicates: 0 Warnings: 0
iml-db10:3306 (DB (none)) :: SET GLOBAL slow_query_log = @old_log_state;
Query OK, 0 rows affected (0.00 sec)
iml-db10:3306 (DB (none)) :: select * from mysql.general_log;
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
| event_time | user_host | thread_id | server_id | command_type | argument |
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
| 2011-02-24 14:42:18 | [lwdba] @ [127.0.0.1] | 3 | 106451130 | Connect | lwdba@127.0.0.1 on |
| 2011-02-24 14:42:18 | lwdba[lwdba] @ [127.0.0.1] | 3 | 106451130 | Query | select @@version_comment limit 1 |
| 2011-02-24 14:42:18 | lwdba[lwdba] @ [127.0.0.1] | 3 | 106451130 | Query | SHOW VARIABLES LIKE 'hostname' |
| 2011-02-24 14:42:18 | lwdba[lwdba] @ [127.0.0.1] | 3 | 106451130 | Quit | |
| 2011-02-24 14:42:18 | [lwdba] @ [127.0.0.1] | 4 | 106451130 | Connect | lwdba@127.0.0.1 on |
| 2011-02-24 14:42:18 | lwdba[lwdba] @ [127.0.0.1] | 4 | 106451130 | Query | select @@version_comment limit 1 |
| 2011-02-24 14:42:30 | lwdba[lwdba] @ [127.0.0.1] | 4 | 106451130 | Query | show create table mysql.general_log |
| 2011-02-24 14:43:54 | lwdba[lwdba] @ [127.0.0.1] | 4 | 106451130 | Query | SET @old_log_state = @@global.general_log |
| 2011-02-24 14:44:00 | lwdba[lwdba] @ [127.0.0.1] | 4 | 106451130 | Query | SET GLOBAL general_log = 'OFF' |
+---------------------+-----------------------------+-----------+-----------+--------------+-------------------------------------------+
9 rows in set (0.00 sec)
iml-db10:3306 (DB (none)) :: show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL,
KEY `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='General log'
1 row in set (0.00 sec)
Jetzt können Sie nach Zeitstempel abfragen und im Argumentfeld nach bestimmten Token suchen.
Beachten Sie beispielsweise Zeile 4 von SELECT I. Meine Anmeldung wurde im Argumentfeld als aufgezeichnetlwdba@127.0.0.1 on
. Sie können diese verfolgen.
Was ist, wenn der General zu groß wird? (Glauben Sie mir, es wird sehr schnell zu groß.)
Was ist zu tun ???
- Herunterfahren MySQL
- Verschieben Sie die Dateien general_log.frm, general_log.MYD und general_log.MYI auf einen anderen (und hoffentlich größeren) Festplatten-Mount.
- Erstellen Sie drei Symlinks zu general_log.frm, general_log.MYD und general_log.MYI aus / var / lib / mysql / mysql
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI auf dem neuen Disk Mount
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI symlinks in / var / lib / mysql / mysql
- starte mysql wieder
Übrigens: Sobald Sie das allgemeine Protokoll offline geschaltet haben, können Sie diese ausführen, um die unterschiedlichen Anmeldungen zu sammeln, die in mysqld etwas bewirkt haben:
SET SQL_LOG_BIN=0;
use mysql
DROP TABLE IF EXISTS audit_user_host;
CREATE TABLE audit_user_host
(
user_host VARCHAR(32),
PRIMARY KEY (user_host)
) ENGINE=MyISAM;
SHOW CREATE TABLE audit_user_host\G
INSERT IGNORE INTO mysql.audit_user_host SELECT user_host FROM mysql.general_log;
SELECT COUNT(1) FROM mysql.audit_user_host;
Ich habe einen Client mit 3 DB-Servern. Eeach with DB Server verfügt über mehr als 1.000.000.000 (1 Milliarde [Tausende Millionen]) Leitungen. Das obige Skript dauerte ungefähr 2,5 Stunden. Die Tabelle audit_user_host endete mit 27 unterschiedlichen Anmeldungen.
Du solltest gut gehen.
Viel Spaß mit diesem, alle !!!