คำตอบของ @Gauis นั้นยอดเยี่ยม หากต้องการเพิ่มเพิ่มเติมคุณสามารถทำสิ่งต่อไปนี้:
ขณะนี้ MySQL 5.1 อนุญาตให้จัดเก็บบันทึกทั่วไปและบันทึกแบบสอบถามช้าเป็นตาราง SQL
เพิ่มไปยัง /etc/my.cnf:
[mysqld]
log-output=TABLE
log
รีสตาร์ท mysql
จากนั้นเมื่อ mysqld สร้างบันทึกทั่วไปแทนที่จะเป็นไฟล์ข้อความมันจะสร้างตารางเป็นตาราง CSV ในโฟลเดอร์ / var / lib / mysql / mysql (ฐานข้อมูล mysql schema)
เพียงทำสิ่งนี้เพื่อดู:
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;
คุณอาจต้องการใส่ดัชนี fulltext ลงในฟิลด์อาร์กิวเมนต์
ฉันเพิ่งติดตั้ง 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)
ตอนนี้คุณสามารถเคียวรีด้วยการประทับเวลาและค้นหาโทเค็น specfic ในฟิลด์อาร์กิวเมนต์
ตัวอย่างเช่นสังเกตบรรทัดที่ 4 ของ SELECT ที่ฉันทำ lwdba@127.0.0.1 on
ในการเข้าสู่ระบบของฉันได้รับการบันทึกในเขตอาร์กิวเมนต์เป็น คุณสามารถติดตามสิ่งเหล่านี้
เกิดอะไรขึ้นถ้านายพลใหญ่เกินไป (เชื่อฉันสิมันจะใหญ่เกินไปเร็วมาก)
จะทำอย่างไร ???
- ปิด mysql
- ย้าย general_log.frm, general_log.MYD และ general_log.MYI ไปยังดิสก์เมานต์อื่น (และ hopefull ใหญ่กว่า)
- สร้าง symlink สามรายการไปที่ 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 symlinks ใน / 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 Eeach กับ DB Server มีสายมากกว่า 1,000,000,000 (1 พันล้าน [พันล้าน]) สคริปต์ด้านบนใช้เวลาประมาณ 2.5 ชั่วโมงจึงจะเสร็จสมบูรณ์ ตาราง audit_user_host สิ้นสุดลงด้วยการล็อกอินที่แตกต่างกัน 27 รายการ
คุณควรจะไปดี
ขอให้สนุกกับสิ่งนี้ทุกคน !!!