Beispielcode für ein Mysql-SQL-Überwachungsskript für langsame Abfragen

Beispielcode für ein Mysql-SQL-Überwachungsskript für langsame Abfragen

1. Ändern Sie my.cnf

#Der Gesamteffekt besteht darin, dass sowohl die Tabelle als auch die Protokolldatei geschrieben werden, wenn das globale Protokoll aktiviert ist, aber für general_log wird nur die Tabelle geschrieben und für slow_query_log werden sowohl die Tabelle als auch die Protokolldatei aufgezeichnet.
general_log=1#Öffnen Sie das MySQL SQL-Ausführungsprotokoll slow_query_log=1#Öffnen Sie das MySQL Slow SQL-Protokoll #Nach der Einstellung wirkt es sich auf general_log und slow_query_log aus.
log_output=table,File#Die Protokollausgabe wird in die Tabelle und die Protokolldatei geschrieben. Um dem Programm das Zählen zu erleichtern, ist es am besten, in die Tabelle zu schreiben#General_log_file ist hier nicht konfiguriert, daher schreibt general_log nur in die Tabelle#In mysql5.1.29 und höher legen Sie Folgendes fest, um MySQL zu öffnen und das ausgeführte SQL in der Datei aufzuzeichnen#general_log_file=/log/general.log

#5.1.29 und früher:
#log=/var/lib/mysql/sql_row.log
long_query_time=1#Setzen Sie die langsame MySQL-Abfrage auf eine Abfrage, die länger als 1 Sekunde dauert slow_query_log_file=/log/slow.log

2. Ändern Sie das Format der MySQL-Protokolltabelle (in der MySQL-Bibliothek).

#Standardmäßig liegt general_log im CSV-Format vor. Eine Änderung in das MyISAM-Format erhöht die Abfrageeffizienz.

setze globales General_Log = aus;

Tabelle ändern general_log engine = MyISAM;

setze globales General_Log = ein;

#Das Standard-slow_query_log ist im CSV-Format. Die Änderung in das MyISAM-Format erhöht die Abfrageeffizienz erheblich

setze global slow_query_log = off; gleich 0 hat den gleichen Effekt

Tabelle ändern slow_log engine = MyISAM;

setze global slow_query_log = on; gleich 1 hat den gleichen Effekt

3. Da die Protokolltabellen von MySQL: general_log und slow_query_log nicht geändert werden dürfen, muss eine neue Tabelle erstellt werden, die leicht zu löschen und zu ändern ist (diese Protokolltabelle ist zu groß und Daten von vor n Tagen müssen regelmäßig bereinigt werden).

Erstellen Sie die Tabelle „slow_log_dba“

Tabelle „slow_log_dba“ erstellen (
 `start_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP,
 `user_host` mediumtext NICHT NULL,
 `query_time` Zeit NICHT NULL,
 `lock_time` Zeit NICHT NULL,
 `rows_sent` int(11) NICHT NULL,
 `rows_examined` int(11) NICHT NULL,
 `db` varchar(512) NICHT NULL,
 `last_insert_id` int(11) NICHT NULL,
 `insert_id` int(11) NICHT NULL,
 `server_id` int(10) unsigned NICHT NULL,
 `sql_text` mediumtext NICHT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Langsames Protokoll für dba';

Erstellen Sie die Tabelle general_log_dba

Tabelle „general_log_dba“ erstellen (
 `event_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP,
 `user_host` mediumtext NICHT NULL,
 `thread_id` int(11) NICHT NULL,
 `server_id` int(10) unsigned NICHT NULL,
 `command_type` varchar(64) NICHT NULL,
 `Argument` Mediumtext NICHT NULL,
 SCHLÜSSEL `user_host` (`user_host`(200)),
 SCHLÜSSEL `event_time` (`event_time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Allgemeines Protokoll für DBA-Operationen';

4. Da das Programm letztendlich die Tabellen general_log_dba und slow_log_dba verwendet, müssen die Daten von general_log und slow_query_log regelmäßig nach general_log_dba und slow_log_dba kopiert werden.

Da der Bericht einmal täglich erstellt wird, muss diese Aktion nur einmal täglich durchgeführt werden.

#Das Skript speichert 10 Tage Daten und kopiert die Daten von general_log und slow_query_log jeden Tag nach general_log_dba und slow_log_dba

#Führen Sie mysqllogtable.sh einmal täglich als geplante Aufgabe aus

#!/bin/sh

NDaysAgo=$(Datum -d '-10 Tage' "+%F %H:%M:%S")

/usr/local/mysql/bin/mysql -uXXXX -p'xxxxxxxx' -D'mysql' -e "insert general_log_dba select * from general_log;

allgemeines_log abschneiden;

Löschen aus general_log_dba, wobei event_time < \"$NDaysAgo\";

füge slow_log_dba ein, wähle * aus slow_log;

slow_log abschneiden;

Löschen aus slow_log_dba, wobei Startzeit < \"$NDaysAgo\""

5. Schreiben Sie ein Python-Skript, um die täglichen SQL-Operationen und langsamen Abfragen von MySQL täglich zu zählen (einige der Skripte sind abstrakte Methoden, bitte behandeln Sie sie nach eigenem Ermessen).

Skript zum Zählen täglicher MySQL-Ausführungsdatensätze

# -*- Kodierung: utf-8 -*-
__author__ = "Fluss"
MySQLdb als MySQL importieren
erneut importieren
von Datum/Uhrzeit importiere Datum/Uhrzeit, Zeitdelta
smtplib importieren
von email.mime.text importiere MIMEText
def sendHtmlMail(Mailinhalt,meineIP):
  versuchen:
    gesternheute=(DatumUhrzeit.jetzt()-Zeitdelta(Tage=1)).strftime("%J-%m-%d")
    Absender = '[email protected]'
    Empfänger = ['[email protected]']
    Betreff = myip+'MySQL-Operationsbericht'+gestern
    smtpserver = "smtp.exmail.xx.com"
    Benutzername = '[email protected]'
    Passwort = "xxxxx"
    msg = MIMEText(mailcontent,'html','utf-8')#'Hallo','text','utf-8'
    msg['Betreff'] = Betreff
    msg['Von'] = Absender
    msg['An'] = '[email protected]'
    smtp = smtplib.SMTP()
    smtp.connect(SMTP-Server)
    smtp.login(Benutzername, Passwort)
    smtp.sendmail(Absender, Empfänger, msg.as_string())
    smtp.beenden()
  außer Ausnahme, e:
    print e,'Fehler beim Senden der E-Mail'
wenn __name__ == '__main__':
  Ergebnis=Keines
  htmlfile='mysqlLogMon.html'
  myiplist=['192.168.10.10','192.168.10.19']
  gesternheute=(DatumUhrzeit.jetzt()-Zeitdelta(Tage=1)).strftime("%Y-%m-%d 00:00:00")
  heute = datetime.now().strftime("%Y-%m-%d 00:00:00")
  für myip in myiplist:
    sql="select user_host,argument aus general_log_dba, wobei event_time >='%s' und event_time <='%s'" %(gestern,heute)
    versuchen:
      dbcon = mysql.connect(Host=myip, Benutzer='xxxxx', Passwort='xxxxx', db='mysql', Port=3306, Zeichensatz='utf8')
      aktuell = dbcon.cursor()
      drucke "Schritt 1", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")
      aktuell.execute(sql)
      Ergebnis = cur.fetchall()
      aktuell.schließen()
      dbcon.schließen()
    außer Ausnahme, e:
      drucke e,'conn mysql error'
    Benutzer_Host_Set = Set ()
    drucke "Schritt 2", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    allhash={}
    wenn Ergebnis:
      für user_host, Argument im Ergebnis:
        argument_delcom=re.compile(r'(\/\*(\s|.)*?\*\/)').sub("",Argument).strip().replace(u"\x00",'').lower()
        wenn re.compile(r'^access.*').match(argument_delcom) oder re.compile(r'^.*@.*on.*').match(argument_delcom) oder re.compile(r'^grant.*').match(argument_delcom):
          tmpargument = argument_delcom.strip()
        anders:
          tmpargument=argument_delcom.split(' ')[0].strip()
          wenn Länge(tmpargument)>30:
            #Einige SQL-Befehle lauten „select\n\t\t\t\t\tcount(m.enquirymainid)“, Sie können „print repr(tmpargument)“ verwenden.
            tmpargument=argument_delcom.split('\n')[0].strip()
        #Wenn es sich nur um Kommentare handelt, wird dieses Element nicht gezählt, sofern es nicht tmpargument oder tmpargument.strip()=='' oder tmpargument.strip()==' ' ist:
          weitermachen
        wenn allhash.has_key(Benutzerhost):
          allhash[Benutzerhost][tmpargument]=allhash[Benutzerhost].get(tmpargument,0)+1
        anders:
          allhash[Benutzerhost]={tmpargument:1}
      drucke "Schritt 3", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")
      headhtml='''
      
      '''
      drucke "Schritt 4", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")
      mit open(htmlfile,'w') als htmlfileobj:
        htmlfileobj.write(headhtml)
        htmlfileobj.flush()
      drucke "Schritt 5", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")
      mit open(htmlfile,'a') als htmlfileobj:
        für Hostschlüssel in allhash.keys():
          listtmp=sortiert(allhash[hostkey].iteritems(),Schlüssel=lambda labkey:labkey[1],reverse=True)
          Zeilenspanne = Länge (alle Hashes [Hostschlüssel])
          #htmlfileobj.write()
          tmpline = '' % (Zeilenspanne, Hostschlüssel.encode ('utf-8'))
          htmlfileobj.write(tmpline)
          Anzahln=0
          für runsql, count in listtmp:
            wenn countn==0:
              tmpline='' %(runsql.encode('utf-8'),Anzahl)
            anders:
              tmpline='' %(runsql.encode('utf-8'),Anzahl)
            Anzahln+=1
            htmlfileobj.write(tmpline)
        tmpline='''
Die Anzahl der vom Benutzer ausgeführten SQL-Befehle betrug %s %s %s
%s %s
'''
        htmlfileobj.write(tmpline)
      mit open(htmlfile,'r') als htmlfileobj:
        mailcontent = htmlfileobj.read()
      sendHtmlMail(Mailinhalt,meineIP)
    anders:
      drucken 'SQL-Ergebnis ist None, beenden'
    drucke "Schritt 6", +myip+', '+datetime.now().strftime("%Y-%m-%d %H:%M:%S")

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Fallstricke bei langsamen MySQL-Abfragen
  • Beispielerklärung für langsame MySQL-Abfragen und -Protokolle
  • Die Rolle und Öffnung des MySQL-Protokolls für langsame Abfragen
  • Langsame MySQL-Abfragen und Protokolleinstellungen und -tests
  • Aktivieren und Konfigurieren des MySQL-Protokolls für langsame Abfragen
  • Beispiel einer langsamen MySQL-Abfrage
  • So finden Sie langsame MySQL-Abfragen
  • MySQL-Methode und Beispiel für langsame Abfragen
  • Detaillierte Erklärung, warum die langsame Abfrageprotokollzeit von MySQL 5.7 8 Stunden hinter der Systemzeit liegt
  • Methode und Optimierungsprinzip für langsame MySQL-Abfragen
  • So optimieren Sie die MySQL-Leistung durch langsame MySQL-Abfragen
  • Lösen Sie das Problem des MySQL Threads_running-Surge und der langsamen Abfrage

<<:  Analysieren Sie die Rolle von rel="nofollow" in HTML und die Verwendung des rel-Attributs

>>:  Detaillierte Erklärung der Docker-Maschinennutzung

Artikel empfehlen

VScode Remote SSH-Remote-Bearbeitung und -Debugging von Code

Die neueste Insider-Version von Visual Studio Cod...

jQuery realisiert Bildhervorhebung

Es ist sehr üblich, Bilder auf einer Seite hervor...

So stellen Sie DoNetCore mit Nginx in der Alibaba Cloud bereit

Grundlegende Umgebungskonfiguration Bitte kaufen ...

So aktualisieren Sie MySQL 5.6 auf 5.7 unter Windows

Vorne geschrieben Es gibt zwei Möglichkeiten, MyS...

Informationen zu WSL-Konfigurations- und Änderungsproblemen in Docker

https://docs.microsoft.com/en-us/windows/wsl/wsl-...

Zusammenfassung der MySql-Import- und Exportmethoden mit mysqldump

Datenbankdaten exportieren: Öffnen Sie zuerst cmd...

Detaillierte Erklärung des strikten Modus in JavaScript

Inhaltsverzeichnis Einführung Verwenden des strik...

Dockers flexible Implementierung zum Aufbau einer PHP-Umgebung

Verwenden Sie Docker, um eine flexible Online-PHP...

Einführung in gängige XHTML-Tags

<br />Ich habe festgestellt, dass viele Leut...

Die Bedeutung der 5 Leerzeichenarten in HTML

HTML bietet fünf Leerzeichen mit unterschiedliche...

MySQL 5.7 Installations- und Konfigurations-Tutorial unter CentOS7 64 Bit

Installationsumgebung: CentOS7 64-Bit-Mini-Versio...