Langsames Abfrageprotokoll für nur eine Datenbank

7

Kann ich das langsame Abfrageprotokoll speziell für nur eine Datenbank aktivieren?

Was ich derzeit getan habe, ist, das gesamte Protokoll in Excel zu übernehmen und dann einen Pivot-Bericht auszuführen, um herauszufinden, welche Datenbank am langsamsten ist. Also habe ich einige Änderungen an dieser Anwendung vorgenommen, in der Hoffnung, das langsame Auftreten von Abfragen zu reduzieren. Anstatt meinen Pivot-Bericht erneut auszuführen, was einige Zeit in Anspruch nahm, um die Daten zu bereinigen, gab ich lieber nur langsame Abfragen aus der einen Datenbank aus

möglich?

Jason
quelle
Ich habe weitere Vorschläge hinzugefügt !!!
RolandoMySQLDBA

Antworten:

7

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.

RolandoMySQLDBA
quelle
Es sollte funktionieren, aber das Protokollieren in Tabellen ist für Aufführungen schrecklich.
Kedare
Das Protokollieren von Slow-Query-Log sollte die Leistung nicht beeinträchtigen. Wahrscheinlich hängt die Häufigkeit der protokollierten langsamen Abfragen von der Auslastung und Leistung des Servers ab.
Thinice
große Mühe danke. Ich werde Ihnen Feedback geben, sobald einige Daten gesammelt wurden
Jason