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
Lassen Sie uns zunächst einige wichtige Punkte zu...
Docker ist wirklich cool, vor allem, weil es im V...
Erstellen Sie zunächst die Falldemonstrationstabe...
Vorwort Bezüglich der HugePages- und Oracle-Daten...
Inhaltsverzeichnis 1. Was ist Grub-Verschlüsselun...
Dieser Artikel beschreibt die Installation und Ko...
selinux ( Security-Enhanced Linux) ist ein Linux-...
Inhaltsverzeichnis 1. Übersicht über Docker Consu...
Derzeit werden fast alle großen Websites und Anwe...
Wenn die Tabelle Zehntausende Datensätze enthält,...
Inhaltsverzeichnis 1. Oberflächliche Kopie 1. Obj...
Dies führte auch dazu, dass PNG-Dateien nicht hoch...
Wenn Sie in CSS die Eigenschaft „font-family“ ver...
Überblick über die Alibaba Cloud Security Group F...
Vorwort: Wie erhält man die Koordinaten der aktue...