AWS RDS MySQL / Slow Query Log

7

Ich versuche, langsame Abfragen auf meinem System zu analysieren, und habe gelesen, dass ich das "Slow Query Log" aktivieren soll. Ich bin gespannt, wie ich dieses Protokoll anzeigen kann, wenn ich eine Instanz von MySQL verwende, die auf dem RDS von Amazon Web Service gehostet wird.

Philip Isaacs
quelle

Antworten:

10

Wussten Sie, dass es eine langsame Protokolltabelle gibt? Es heißt mysql.slow_log:

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
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.01 sec)

mysql>

Es gibt zwei Variablen, die Sie aktivieren müssen, um langsame Abfragen in mysql.slow_log aufzuzeichnen:

Hier ist die Situation

mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.01 sec)

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.01 sec)

mysql>

log_output ist bereits voreingestelltTABLE . Sie müssen slow_query_log aktivieren . Folgendes müssen Sie tun:

Wenn Ihre RDS-Instanz keine DB-Parametergruppe hat ...

  1. Starten Sie eine AmazonRDS MySQL-Instanz, die eine DB-Parametergruppe verwendet.
  2. Bearbeiten Sie die DB-Parametergruppe, indem Sie das slow_query_log auf 1 setzen
  3. Starten Sie die DB-Instanz neu

Wenn Ihre RDS-Instanz eine DB-Parametergruppe hat ...

  1. Bearbeiten Sie die DB-Parametergruppe, indem Sie das slow_query_log auf 1 setzen
  2. Starten Sie die DB-Instanz neu

Melden Sie sich nach dem Neustart der Instanz bei mysql an und führen Sie diese Abfrage aus

mysql> SELECT SLEEP(15);

Da der Standardwert für long_query_time 10 Sekunden ist, sollte die Abfrage SELECT SLEEP(15);in angezeigt werdenmysql.slow_log . Lesen Sie die RDS-Dokumentation, um festzustellen, ob die Tabelle Einschränkungen enthält.

VORBEHALT

Hier ist eine faire Warnung. Hinweis mysql.slow_logist eine CSV-Datei. Die Tabelle hat keinen Schlüssel. Während Sie die Tabelle abfragen können, werden vollständige Tabellenscans durchgeführt. Es wäre großartig, wenn Sie Folgendes tun könnten:

ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);

Dann können Sie sehr schnell nach Datums- und Zeitbereichen fragen. Ich habe versucht, dies auszuführen, und ich verstehe Folgendes:

mysql> ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ERROR 1044 (42000): Access denied for user 'lwdba'@'%' to database 'mysql'
mysql>

Überprüfen Sie in der RDS-Dokumentation, ob Amazon dies für Sie tun kann.

Versuche es !!!

RolandoMySQLDBA
quelle
1
Sie erhalten den Zugriff verweigert, weil RDS Ihnen keine SUPER-Berechtigungen gewährt.
Ceejayoz
Wow, vielen Dank, das beantwortet meine Fragen total.
Philip Isaacs
@ceejayoz Wie können wir den Fehler mit den SUPER-Berechtigungen auf RDS überwinden?
Chetan Mekha
@chetanmekha Kommt darauf an, was Sie versuchen, aber die Antwort lautet größtenteils "Sie tun es nicht".
Ceejayoz
1

Sie können die Tabelle auch in eine neue in einer anderen Datenbank kopieren und die neue MyISAM erstellen:

create table my_slow_logs as select * from mysql.slow_log;
alter table my_slow_logs engine=MyISAM;

(dann select from my_slow_logs...)

Amazon RDS erlaubt dies, solange Sie dies außerhalb der MySQL-Datenbank tun.

Tom
quelle
Es tut mir leid, dass ich das gerade bemerke. Ich kann das benutzen.
RolandoMySQLDBA