Ich habe etwas Unorthodoxes, wenn Sie wirklich ein langsames Abfrageprotokoll für eine bestimmte Datenbank haben möchten. Denken Sie daran, dass das, was ich vorschlagen werde, für MySQL 5.1.30 und höher funktioniert:
Schritt 01) Fügen Sie diese zunächst zu /etc/my.cnf hinzu
[mysqld]
log-output=TABLE
slow-query-log
slow-query-log-file=slow-queries.log
Mit der Protokollausgabe können Sie die Ausgabe allgemeiner und langsamer Protokolle als Tabellen und nicht als Textdateien festlegen.
Schritt 02) Service MySQL Neustart
Das MySQL-Schema enthält eine Tabelle mit dem Namen slow_log
Führen Sie dies in MySQL aus
SHOW CREATE TABLE mysql.slow_log\G
Es sollte eine CSV-Tabelle sein.
Schritt 03) Konvertieren Sie es in MyISAM und indizieren Sie die Tabelle in der Spalte start_time
SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G
Es sollte so aussehen
mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
Table: slow_log
Create Table: CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
KEY `start_time` (`start_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.00 sec)
Beachten Sie, dass eine der Spalten db ist . Sie sollten einen zusätzlichen Index wie folgt hinzufügen:
SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ADD INDEX db (db,start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G
Von hier aus können Sie eine von drei (3) Optionen ausführen
OPTION 1: Fragen Sie mysql.slow_log nach der gewünschten Datenbank ab
mysql> SELECT * FROM mysql.slow_log WHERE db='whateverdbiwant';
OPTION 2: Löschen Sie alle Einträge in mysql.slow_log, die nicht von Whateverdbiwant stammen
SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
DELETE FROM mysql.slow_log WHERE db <> 'whateverdbiwant';
SET GLOBAL slow_query_log = @old_log_state;
OPTION 3: Kopieren Sie alle Einträge in eine andere slow_log-Tabelle, aus der Sie abfragen können
DROP TABLE IF EXISTS mysql.my_slow_log;
CREATE TABLE mysql.my_slow_log LIKE mysql.slow_log;
ALTER TABLE mysql.my_slow_log DROP INDEX db;
ALTER TABLE mysql.my_slow_log DISABLE KEYS;
INSERT INTO mysql.my_slow_log SELECT * FROM mysql.slow_log db='whateverdbiwant';
ALTER TABLE mysql.my_slow_log ENABLE KEYS;
Versuche es !!!
UPDATE 20.06.2011 18:08 EDT
Ich habe eine zusätzliche unorthodoxe Idee, die Ihnen gefallen könnte.
Versuchen Sie, die .MYD und .MYI der MyISAM-Tabelle für die langsame Anmeldung auf ein anderes Festplatten-Volume zu verschieben. Sie verknüpfen /var/lib/mysql/mysql/slow_log.MYD und /var/lib/mysql/mysql/slow_log.MYI mit dem neuen Speicherort der realen .MYD und .MYI.
Wenn Sie das für verrückt hielten, finden Sie hier eine weitere unorthodoxe Idee, die Ihnen gefallen könnte.
Wenn Sie die binäre Protokollierung bereits aktiviert haben, richten Sie die Replikation ein, um die langsame in eine andere Box zu verschieben. Wie um alles in der Welt machst du das ???
Schritt 01) Richten Sie den Replikations-Slave mit dieser Option ein
[mysqld]
replicate-do-db=mysql
Schritt 02) Aktivieren Sie das langsame Protokoll auf dem Slave
Schritt 03) Führen Sie diesen Befehl auf dem Master aus
SET SQL_LOG_BIN=0;
ALTER TABLE mysql.slow_log ENGINE=BLACKHOLE;
Durch die Verwendung der BLACKHOLE- Speicher-Engine werden Festplatten-E / A für das langsame Protokoll auf dem Master eliminiert. Der Slave ist so eingerichtet, dass sein einziger Zweck darin besteht, Einträge für mysql.slow_log zu sammeln.