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).
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.
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:
|
<<: Analysieren Sie die Rolle von rel="nofollow" in HTML und die Verwendung des rel-Attributs
>>: Detaillierte Erklärung der Docker-Maschinennutzung
Die neueste Insider-Version von Visual Studio Cod...
Es ist sehr üblich, Bilder auf einer Seite hervor...
Anzeigen der abhängigen Bibliotheken von so oder ...
Grundlegende Umgebungskonfiguration Bitte kaufen ...
Vorne geschrieben Es gibt zwei Möglichkeiten, MyS...
https://docs.microsoft.com/en-us/windows/wsl/wsl-...
Datenbankdaten exportieren: Öffnen Sie zuerst cmd...
Inhaltsverzeichnis Einführung Verwenden des strik...
Verwenden Sie Docker, um eine flexible Online-PHP...
Inhaltsverzeichnis 1. Was ist der Ausführungskont...
<br />Ich habe festgestellt, dass viele Leut...
Dieser Artikel beschreibt anhand von Beispielen d...
1. Ziehen Sie das Redis-Image docker pull redis 2...
HTML bietet fünf Leerzeichen mit unterschiedliche...
Installationsumgebung: CentOS7 64-Bit-Mini-Versio...