@ गौइस का उत्तर उत्कृष्ट है। इसे और जोड़ने के लिए, आप निम्नलिखित कर सकते हैं:
MySQL 5.1 अब सामान्य लॉग और धीमी क्वेरी लॉग को SQL टेबल के रूप में संग्रहीत करने की अनुमति देता है।
इसे /etc/my.cnf में जोड़ें:
[mysqld]
log-output=TABLE
log
Mysql को पुनरारंभ करें
फिर, जब mysqld सामान्य लॉग बनाता है, तो टेक्स्ट फ़ाइल के बजाय यह / var / lib / mysql / mysql फ़ोल्डर (mysql स्कीमा डेटाबेस) में CSV तालिका के रूप में तालिका बनाएगा।
बस इसे देखने के लिए ऐसा करें:
SHOW CREATE TABLE mysql.general_log\G
सभी कनेक्शन इसमें ढेर हो जाएंगे।
आपके लिए, यह बहुत उपयोगी नहीं है जब यह इसे क्वेरी करने के लिए आता है। यह हर बार एक पूर्ण तालिका स्कैन होगा।
क्या करें ??? इसे MyISAM में शामिल करें और टेबल को इंडेक्स करें !!!!
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;
वैकल्पिक रूप से, आप तर्क क्षेत्र पर एक फुलटेक्स इंडेक्स लगाना चाह सकते हैं।
मैंने एक सर्वर पर MySQL 5.5.9 सेटअप किया है और इसे आज़माया है। यहाँ परिणाम है:
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)
अब, आप टाइमस्टैम्प द्वारा क्वेरी कर सकते हैं और तर्क क्षेत्र में विशिष्ट टोकन की तलाश कर सकते हैं।
उदाहरण के लिए, मेरे द्वारा चुने गए चयन की सूचना पंक्ति 4। मेरा लॉगिंग तर्क क्षेत्र के रूप में दर्ज किया गया था lwdba@127.0.0.1 on
। आप इन्हें ट्रैक कर सकते हैं।
क्या होगा अगर सामान्य बहुत बड़ा हो जाता है (मेरा विश्वास करो यह बहुत तेजी से बड़ा हो जाएगा)
क्या करें ???
- शटडाउन mysql
- normal_log.frm, general_log.MYD, और general_log.MYI को एक अलग (और आशावादी बड़ा) डिस्क माउंट में स्थानांतरित करें।
- General_log.frm, general_log.MYD, और general_log.MYI से / var / lib / mysql / mysql में तीन सिम्लिंक बनाएं
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI नई डिस्क माउंट पर
- chown mysql: mysql general_log.frm general_log.MYD general_log.MYI सहानुभूति / var / lib / mysql / mysql में
- mysql वापस शुरू करें
BTW एक बार जब आपके पास सामान्य लॉग ऑफलाइन हो जाता है, तो आप उन अलग-अलग लॉगिन को इकट्ठा करने के लिए चला सकते हैं, जो 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;
मेरे पास 3 DB सर्वर के साथ एक क्लाइंट है। DB सर्वर के साथ Eeach में 1,000,000,000 (1 बिलियन [हजारों मिलियन]) से अधिक लाइनें हैं। ऊपर की स्क्रिप्ट को पूरा होने में लगभग 2.5 घंटे लगे। ऑडिट_सुअर_होस्ट टेबल 27 अलग लॉगिन के साथ समाप्त हुआ।
आप जाने के लिए तैयार हैं।
इस एक के साथ मज़े करो, सब लोग !!!