@Gauis의 답변은 훌륭합니다. 더 추가하려면 다음을 수행하십시오.
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)
이제 타임 스탬프별로 쿼리하고 인수 필드에서 특정 토큰을 찾을 수 있습니다.
예를 들어, SELECT I의 4 행에 주목하십시오. 로그인은 인수 필드에로 기록되었습니다 lwdba@127.0.0.1 on
. 이를 추적 할 수 있습니다.
장군이 너무 커지면 어떻게 될까요?
해야 할 일 ???
- MySQL 종료
- general_log.frm, general_log.MYD 및 general_log.MYI를 다른 (그리고 더 큰 희망) 디스크 마운트로 이동하십시오.
- / var / lib / mysql / mysql에서 general_log.frm, general_log.MYD 및 general_log.MYI에 대한 세 개의 심볼릭 링크를 작성하십시오.
- chown mysql : mysql general_log.frm general_log.MYD general_log.MYI 새 디스크 마운트
- chown mysql : / sql / mysql / mysql의 mysql general_log.frm general_log.MYD general_log.MYI 심볼릭 링크
- 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;
DB 서버가 3 개인 클라이언트가 있습니다. DB 서버를 사용하는 각 서버에는 1,000,000,000 (10 억 [1,000 만]) 이상의 회선이 있습니다. 위 스크립트는 완료하는 데 약 2.5 시간이 걸렸습니다. audit_user_host 테이블은 27 개의 개별 로그인으로 끝났습니다.
잘 가야합니다.
여러분, 이것 하나로 재미있게 보내십시오!