Jawaban oleh @Gauis luar biasa. Untuk menambahkan lebih lanjut, Anda dapat mengikuti:
MySQL 5.1 sekarang memungkinkan menyimpan log umum dan log kueri lambat sebagai tabel SQL.
Tambahkan ini ke /etc/my.cnf:
[mysqld]
log-output=TABLE
log
Mulai ulang mysql
Kemudian, ketika mysqld membuat log umum, alih-alih file teks itu akan membuat tabel sebagai tabel CSV di folder / var / lib / mysql / mysql (database skema mysql).
Lakukan ini untuk melihatnya:
SHOW CREATE TABLE mysql.general_log\G
Semua koneksi akan menumpuk di dalamnya.
Bagi Anda, itu tidak terlalu berguna untuk menanyakannya. Itu hanya akan menjadi pemindaian tabel penuh setiap kali.
Apa yang harus dilakukan ??? CONVERT IT UNTUK MyISAM dan INDEX THE TABLE !!!!
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;
Secara opsional, Anda mungkin ingin meletakkan indeks teks lengkap pada bidang argumen.
Saya baru saja mengatur MySQL 5.5.9 di server dan mencoba ini. Inilah hasilnya:
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)
Sekarang, Anda dapat melakukan query berdasarkan cap waktu dan mencari token khusus di bidang argumen.
Misalnya, perhatikan baris 4 SELECT yang saya lakukan. Log masuk saya dicatat di bidang argumen sebagai lwdba@127.0.0.1 on
. Anda dapat melacak ini.
Bagaimana jika sang jenderal terlalu besar (Percayalah, ia akan menjadi terlalu besar dengan sangat cepat)
Apa yang harus dilakukan ???
- shutdown mysql
- pindahkan general_log.frm, general_log.MYD, dan general_log.MYI ke disk mount yang berbeda (dan berharap lebih besar).
- Buat tiga symlink ke general_log.frm, general_log.MYD, dan general_log.MYI dari / var / lib / mysql / mysql
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI pada disk mount baru
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI symlinks di / var / lib / mysql / mysql
- mulai mysql kembali
BTW Setelah log umum offline, Anda dapat menjalankannya untuk mengumpulkan login berbeda yang melakukan sesuatu di mysqld:
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;
Saya punya klien dengan 3 server DB. Eeach with DB Server memiliki lebih dari 1.000.000.000 (1 miliar [ribuan juta]) baris di dalamnya. Script di atas membutuhkan waktu 2,5 jam untuk selesai. Tabel audit_user_host berakhir dengan 27 login berbeda.
Anda harus baik untuk pergi.
Bersenang-senang dengan yang ini, semuanya !!!