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

Detailliertes Tutorial zum Löschen von Linux-Benutzern mit dem Befehl userdel

Was ist Serdel userdel ist ein Low-Level-Tool zum...

React implementiert eine hochadaptive virtuelle Liste

Inhaltsverzeichnis Vor der Transformation: Nach d...

MySQL-Optimierung Verbindungsoptimierung

Im Artikel MySQL-Optimierung: Cache-Optimierung w...

Eine kurze Diskussion über MySql-Ansichten, Trigger und gespeicherte Prozeduren

Sicht Was ist eine Ansicht? Welche Rolle spielt e...

CSS3 realisiert die Mask Barrage-Funktion

Kürzlich habe ich auf der B-Station einen Sperrfe...

Nodejs implementiert Intranet-Penetrationsdienst

Inhaltsverzeichnis 1. Proxy im LAN 2. Intranet-Pe...

WeChat-Applet implementiert Anmeldeschnittstelle

Die Anmeldeoberfläche des WeChat-Applets ist zu I...

Detaillierte Erklärung des Json-Formats

Inhaltsverzeichnis Ein JSON basiert auf zwei Stru...

Detaillierte Erläuterung des Zahlungsfunktionscodes des Vue-Projekts

1. Alipay-Methode: Alipay-Methode: Klicken Sie zu...