Powershell Script - MySQL Purge Master Logs

Hallo zusammen,

versuche mich gerade in Powershell und bräuchte eure Hilfe

Momentan wird mit Mysqldump in einem Batch-Script ein SQL Dump erstellt. Dieses Batch-Script möchte ich jetzt erweitern, indem ich ein Powershell Script aufrufe das folgendes tut:

Nachdem ein Dump erstellt wurde, sollen die Binärlogs die älter als 3 Tage sind gelöscht werden.

Das aktuelle Datum einlesen und 3 Tage zurückzählen hab ich hinbekommen.
$datum=(Get-Date).AddDays(-3).ToString(‚yyyy-MM-dd‘)

Doch wie rufe ich nun den MySQL Befehl auf zum löschen der logs?
Benötige ich dafür einen MySQL Connector oder geht das auch ohne?

Mein aktueller Script:
$datum=(Get-Date).AddDays(-3).ToString(‚yyyy-MM-dd‘)

cd C:\mysql\dbtest\bin\
.\mysql.exe -u user-p passwort

Wenn ich das Script starte bin ich in Mysql eingeloggt.
Ich müsste jetzt nur noch den Befehl „Purge Master Logs before ‚$datum‘“ absetzen können.

Freue Mich auf eure Hilfe!

Liebe Grüße
Emily

Mach es dir nicht so schwer. Kopiere ältere Dateien in einen anderen Ordner und lösche den dann. Das sind insgesamt 3 Zeilen in deinem Batch.

mkdir E:\TEMP
robocopy.exe E:\Ordner E:\TEMP /E /MOVE /MINAGE:8 /R:1 /W:1
rmdir E:\TEMP /s /q

Dafür brauchst du kein Powershell, Robocopy ist dein Freund.

Zur Erklärung, mit Quelle:

http://znil.net/index.php?title=Windows:smiley:ateien_die_…

mkdir E:\TEMP : Verzeichnis E:\TEMP erstellen

E:\Ordner : Quellordner
E:\TEMP : Zielordner
/E : inklusive Unterverzeichnisse
/MOVE : verschieben statt kopieren
/MINAGE:8 : Mindestalter, Dateien die jünger als 8 Tage sind werden ignoriert
/R:1 : Bei Fehler 1x noch mal versuchen
/W:1 : zwischen Wiederholungen 1 Sekunde warten (bei Fehler)

rmdir E:\TEMP /s /q : Verzeichnis E:\TEMP inklusive Unterverzeichnissen ohne Nachfrage löschen

Herzlichst

Günther

Stern, bitte gern.

Hallo Günther,

das wäre ne einfache und super Idee mit robocopy, hat ich mir auch schon überlegt.

Nur so einfach geht das mit den MySQL Binärlogs leider nicht.
Die Binärlogs wären gelöscht, doch das Logindex wird nicht aktualisiert. Das Logindex enthält eine Liste aller Binärlogs in diesem Verzeichnis. Desweiteren wird davon abgeraten einfach so die Binärlogs zu löschen ohne den „Befehl Purge Master Logs…“.

Liebe Grüße,
Emily

1 Like

Hallo zusammen,

versuche mich gerade in Powershell und bräuchte eure Hilfe

Momentan wird mit Mysqldump in einem Batch-Script ein SQL Dump
erstellt. Dieses Batch-Script möchte ich jetzt erweitern,
indem ich ein Powershell Script aufrufe das folgendes tut:

Nachdem ein Dump erstellt wurde, sollen die Binärlogs die
älter als 3 Tage sind gelöscht werden.

Das aktuelle Datum einlesen und 3 Tage zurückzählen hab ich
hinbekommen.
$datum=(Get-Date).AddDays(-3).ToString(‚yyyy-MM-dd‘)

Doch wie rufe ich nun den MySQL Befehl auf zum löschen der
logs?
Benötige ich dafür einen MySQL Connector oder geht das auch
ohne?

Mein aktueller Script:
$datum=(Get-Date).AddDays(-3).ToString(‚yyyy-MM-dd‘)

cd C:\mysql\dbtest\bin\
.\mysql.exe -u user-p passwort

Wenn ich das Script starte bin ich in Mysql eingeloggt.
Ich müsste jetzt nur noch den Befehl „Purge Master Logs before
‚$datum‘“ absetzen können.

mysql --help

gibt dir die möglichen optionen aus.
unter anderen -e, damit kannst du direkt einen befehl angeben.

alternativ könnte man auch mit pipes arbeiten:

echo "sqlbefehl" | mysql -u user -p passwort

weiter kann dein mysqld selbst das datum ausrechnen.

mysql\> select now(), date\_sub(now(), interval 3 day);
+---------------------+---------------------------------+
| now() | date\_sub(now(), interval 3 day) |
+---------------------+---------------------------------+
| 2014-03-03 22:04:27 | 2014-02-28 22:04:27 |
+---------------------+---------------------------------+
1 row in set (0.00 sec)

mysql\>

damit erhälst du einen statischen befehl der form (ungetestet):

purge master before date\_sub(now(), interval 3 day) 

den könntest du in eine datei script.sql speichern und mit

mysql -u user -p passwort 
ausführen.

Hallo Jörg,

Vielen Dank für deine Hilfe. Du hast mir einiges weitergeholfen :smile:

Mein Script nun:

.\mysql.exe -u user-p passwort