Die Verwaltung der Datenbankleistung ist ein Bereich, in dem Unternehmen häufig mehr Zeit investieren, als sie erwartet haben.
Das Überwachen und Reagieren auf Leistungsprobleme der Produktionsdatenbank ist eine der kritischsten Aufgaben innerhalb eines Datenbankadministratorjobs. Es ist ein fortlaufender Prozess, der ständige Pflege erfordert. Anwendungen und zugrunde liegende Datenbanken entwickeln sich normalerweise mit der Zeit weiter; wachsen in Größe, Anzahl der Benutzer, Arbeitslast, Schemaänderungen, die mit Codeänderungen einhergehen.
Lang andauernde Abfragen sind in einer MySQL-Datenbank selten unvermeidlich. Unter bestimmten Umständen kann eine lang andauernde Abfrage ein schädliches Ereignis sein. Wenn Ihnen Ihre Datenbank wichtig ist, müssen Sie regelmäßig die Abfrageleistung optimieren und lang andauernde Abfragen erkennen.
In diesem Blog werfen wir einen tieferen Blick auf die tatsächliche Datenbank-Arbeitslast, insbesondere auf der Seite der laufenden Abfragen. Wir werden prüfen, wie Abfragen nachverfolgt werden können, welche Art von Informationen wir in MySQL-Metadaten finden können und welche Tools zur Analyse solcher Abfragen verwendet werden können.
Bearbeitung der lang andauernden Abfragen
Beginnen wir mit der Prüfung lang andauernder Abfragen. Zunächst müssen wir die Art der Abfrage kennen, ob es sich voraussichtlich um eine langlaufende oder eine kurzlaufende Abfrage handelt. Einige Analyse- und Stapeloperationen sollen Abfragen mit langer Laufzeit sein, daher können wir diese vorerst überspringen. Außerdem kann das Ändern der Tabellenstruktur mit dem ALTER-Befehl abhängig von der Tabellengröße ein langwieriger Vorgang sein (insbesondere in MySQL Galera-Clustern).
- Tabellensperre – Die Tabelle wird durch eine globale Sperre oder eine explizite Tabellensperre gesperrt, wenn die Abfrage versucht, darauf zuzugreifen.
- Ineffiziente Abfrage - Verwenden Sie nicht indizierte Spalten beim Suchen oder Verbinden, daher braucht MySQL länger, um die Bedingung zu erfüllen.
- Deadlock – Eine Abfrage wartet darauf, auf dieselben Zeilen zuzugreifen, die durch eine andere Anfrage gesperrt sind.
- Datensatz passt nicht in RAM – Wenn Ihre Arbeitssatzdaten in diesen Cache passen, sind SELECT-Abfragen normalerweise relativ schnell.
- Suboptimale Hardwareressourcen – Dies können langsame Festplatten, RAID-Neuaufbau, überlastetes Netzwerk usw. sein
Wenn Sie sehen, dass die Ausführung einer Abfrage länger als gewöhnlich dauert, untersuchen Sie sie.
Verwenden der MySQL Show Process List
MYSQL> SHOW PROCESSLIST;
Dies ist normalerweise das erste, was Sie bei Leistungsproblemen ausführen. SHOW PROCESSLIST ist ein interner mysql-Befehl, der Ihnen anzeigt, welche Threads laufen. Sie können diese Informationen auch in der Tabelle information_schema.PROCESSLIST oder im Befehl mysqladmin process list sehen. Wenn Sie das PROCESS-Privileg haben, können Sie alle Threads sehen. Sie können Informationen wie die Abfrage-ID, die Ausführungszeit, wer sie ausführt, den Client-Host usw. sehen. Die Informationen sind je nach MySQL-Variante und -Verteilung (Oracle, MariaDB, Percona) leicht unterschiedlich.
SHOW PROCESSLIST;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
| 2 | event_scheduler | localhost | NULL | Daemon | 2693 | Waiting on empty queue | NULL | 0.000 |
| 4 | root | localhost | NULL | Query | 0 | Table lock | SHOW PROCESSLIST | 0.000 |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+
wir können die anstößige Abfrage sofort in der Ausgabe sehen. Im obigen Beispiel könnte das eine Tabellensperre sein. Aber wie oft starren wir auf diese Prozesse? Dies ist nur dann sinnvoll, wenn Sie sich der lang andauernden Transaktion bewusst sind. Andernfalls würden Sie es nicht wissen, bis etwas passiert - wie sich die Verbindungen häufen oder der Server langsamer als gewöhnlich wird.
Verwendung von MySQL Pt-query-digest
Wenn Sie weitere Informationen zu einer bestimmten Arbeitslast sehen möchten, verwenden Sie pt-query-digest. Der pt-query-digest ist ein Linux-Tool von Percona zur Analyse von MySQL-Anfragen. Es ist Teil des Percona Toolkits, das Sie hier finden können. Es unterstützt die beliebtesten 64-Bit-Linux-Distributionen wie Debian, Ubuntu und Redhat.
Um es zu installieren, müssen Sie die Percona-Repositories konfigurieren und dann das Paket perona-toolkit installieren.
Installieren Sie Percona Toolkit mit Ihrem Paketmanager:
Debian oder Ubuntu:
sudo apt-get install percona-toolkit
RHEL oder CentOS:
sudo yum install percona-toolkit
Pt-query-digest akzeptiert Daten aus der Process List, General Log, Binary Log, Slow Log oder tcpdump Außerdem ist es möglich, die MySQL Process List in einem definierten Intervall abzufragen - ein Process das kann ressourcenintensiv und alles andere als ideal sein, kann aber dennoch als Alternative verwendet werden.
Die häufigste Quelle für pt-query-digest ist ein langsames Abfrageprotokoll. Mit dem Parameter log_slow_verbosity können Sie steuern, wie viele Daten dorthin gehen.
Es gibt eine Reihe von Dingen, die dazu führen können, dass die Ausführung einer Abfrage länger dauert:
- microtime - Abfragen mit Mikrosekunden-Präzision.
- query_plan – Informationen über den Ausführungsplan der Abfrage.
- innodb – InnoDB-Statistiken.
- minimal – Entspricht der Aktivierung von nur Microtime.
- standard – Entspricht der Aktivierung von Microtime,innodb.
- full – Äquivalent zu allen anderen Werten ODER-verknüpft ohne die Optionen profiling und profiling_use_getrusage.
- profiling – Aktiviert die Profilerstellung aller Abfragen in allen Verbindungen.
- profiling_use_getrusage – Aktiviert die Verwendung der getrusage-Funktion.
Quelle:Percona-Dokumentation
Verwenden Sie der Vollständigkeit halber log_slow_verbosity=full, was ein häufiger Fall ist.
Langsames Abfrageprotokoll
Das langsame Abfrageprotokoll kann verwendet werden, um Abfragen zu finden, deren Ausführung lange dauert und die daher Kandidaten für eine Optimierung sind. Das Protokoll für langsame Abfragen erfasst langsame Abfragen (SQL-Anweisungen, deren Ausführung länger als long_query_time Sekunden dauert) oder Abfragen, die keine Indizes für Suchen verwenden (log_queries_not_using_indexes). Diese Funktion ist standardmäßig nicht aktiviert und um sie zu aktivieren, setzen Sie einfach die folgenden Zeilen und starten Sie den MySQL-Server neu:
[mysqld]
slow_query_log=1
log_queries_not_using_indexes=1
long_query_time=0.1
Das langsame Abfrageprotokoll kann verwendet werden, um Abfragen zu finden, deren Ausführung lange dauert und die daher Kandidaten für eine Optimierung sind. Das Untersuchen eines langen, langsamen Abfrageprotokolls kann jedoch eine zeitaufwändige Aufgabe sein. Es gibt Tools, um langsame MySQL-Abfrageprotokolldateien zu parsen und ihren Inhalt zusammenzufassen, wie mysqldumpslow, pt-query-digest.
Leistungsschema
Performance Schema ist ein großartiges Tool, das zur Überwachung von MySQL Server-Interna und Ausführungsdetails auf einer niedrigeren Ebene verfügbar ist. In einer frühen Version (5.6) hatte es einen schlechten Ruf, weil es oft zu Leistungsproblemen führte, aber die neueren Versionen beeinträchtigen die Leistung nicht. Die folgenden Tabellen im Leistungsschema können verwendet werden, um langsame Abfragen zu finden:
- events_statements_current
- events_statements_history
- events_statements_history_long
- events_statements_summary_by_digest
- events_statements_summary_by_user_by_event_name
- events_statements_summary_by_host_by_event_name
MySQL 5.7.7 und höher enthalten das sys-Schema, eine Reihe von Objekten, die DBAs und Entwicklern helfen, die vom Leistungsschema gesammelten Daten in einer leichter verständlichen Form zu interpretieren. Sys-Schema-Objekte können für typische Tuning- und Diagnose-Anwendungsfälle verwendet werden.
Netzwerk-Tracking
Was ist, wenn wir keinen Zugriff auf das Abfrageprotokoll oder direkte Anwendungsprotokolle haben? In diesem Fall könnten wir eine Kombination aus tcpdump und pt-query Digest verwenden, die beim Erfassen von Abfragen helfen könnte.
$ tcpdump -s 65535 -x -nn -q -tttt -i any port 3306 > mysql.tcp.txt
Sobald der Erfassungsprozess beendet ist, können wir mit der Verarbeitung der Daten fortfahren:
$ pt-query-digest --limit=100% --type tcpdump mysql.tcp.txt > ptqd_tcp.out
ClusterControl-Abfragemonitor
ClusterControl Query Monitor ist ein Modul in einer Cluster-Steuerung, das kombinierte Informationen über Datenbankaktivitäten bereitstellt. Es kann Informationen aus mehreren Quellen sammeln, z. B. eine Prozessliste anzeigen oder ein Protokoll für langsame Abfragen, und diese auf voraggregierte Weise darstellen.
Die SQL-Überwachung ist in drei Abschnitte unterteilt.
Häufigste Suchanfragen
präsentiert die Informationen zu Abfragen, die einen erheblichen Teil der Ressourcen beanspruchen.
Laufende Abfragen
es ist eine Prozessliste mit Informationen, die von allen Datenbank-Cluster-Knoten in einer Ansicht kombiniert werden. Sie können dies verwenden, um Abfragen zu beenden, die Ihre Datenbankoperationen beeinträchtigen.
Abfrageausreißer
Präsentieren Sie die Liste der Abfragen mit überdurchschnittlich langer Ausführungszeit.
Fazit
Das ist alles für Teil zwei. Dieser Blog soll keine erschöpfende Anleitung zur Verbesserung der Datenbankleistung sein, aber er gibt hoffentlich ein klareres Bild davon, welche Dinge wesentlich werden können und einige der grundlegenden Parameter, die konfiguriert werden können. Zögern Sie nicht, uns in den Kommentaren unten mitzuteilen, ob wir wichtige vergessen haben.