- zu einem definierten Zeitpunkt (z.B. jeden Sonntag um 00:13) ein Backup seiner Datenbank erzeugen kann (ging vorher nur recht starr und immer nur zur vollen Stunde)
- die maximale Anzahl vorgehaltener Backups auf einen definierten Wert halten kann (ging vorher gar nicht mit "Hausmitteln")
Benutzung:
Der Scriptcode (am Ende des Posts) wird einfach mit einem geeigneten Editor in die "/usr/local/addons/ccu-historian/ccu-historian.config" am Ende eingefügt. Es sollten dann alle selbst gemachten Eingaben/Änderungen nochmal auf Plausibilität geprüft werden. Nach dem speichern der Datei startet der Historian dann automatisch neu.
Bevor es losgeht:
- es muss natürlich ein Speichermedium vorhanden sein (USB-Stick), besser wäre aber ein Netzwerk-Mount wo dann die Backups landen
- der "Speicherpfad" muss in beiden Scripten bei...
...eingetragen werden. Wenn nicht vorhanden, wird das Verzeichnis beim ersten Start vom "Datenbank-Backup-Create-Script" erzeugt.
Code: Alles auswählen
// Backup Speicherpfad def backupPath = "/media/usb0/ccu-historian_db-backups"
- dann kann der Name der Backupdatei im "Datenbank-Backup-Script" angepasst werden.
An den Namen wird ein Unterstrich, der Zeitstempel und die Endung .zip drangehangen, das Ergebnis sieht dann für das Beispiel so aus:
Code: Alles auswählen
// Backup Dateiname def fileName = "db-backup"
Code: Alles auswählen
Dateiname: db-backup_202209031226.zip Dateiname mit Beispielpfad: /media/usb0/ccu-historian_db-backups/db-backup_202209031226.zip
- als nächstes legt man noch die maximale Anzahl vorgehaltener Backups im "Datenbank-Backup-CleanUp-Script" fest:
Code: Alles auswählen
// Anzahl zu behaltener Backup-Dateien def keep = 24
- Und zu guter Letzt überlegt man sich wann die Scripte ausgeführt werden sollen.
Dazu muss in jedem Script die Cron Expression angepasst werden. Theoretisch ist "alles möglich" was so eine Crontab hergibt, praktisch gibt es aktuell ein Problem was am Ende des Posts im Edit beschrieben ist.(Beispiel jeden Sonntag um 00:13:13)Code: Alles auswählen
database.tasks.create_DB_Backup_File.cron="13 13 0 ? * SUN *"
Hinweise:
- RaspberryMatic macht (default) um 00:07 das Auto-Backup, daher würde ich das DB-Backup ein paar Minuten später machen.
- je nach Größe der Datenbank und "Power" des Hostsystems kann das Erzeugen des DB-Backups etwas dauern...
- daher würde ich das "Datenbank-Backup-CleanUp-Script" 30-60min nach dem "Datenbank-Backup-Create-Script" laufen lassen
- für Cron Ungeübte ist ein Link zu einem "Cron Expression Generator & Explainer - Quartz" in den Kopfzeilen hinterlegt
- Das Datenbank-Backup wird jeden Sonntag um 00:13:13 nach /media/usb0/ccu-historian_db-backups mit folgendem Namensschema "db-backup_202209031226.zip" gespeichert
- Jeden Sonntag um 00:33:13 werden die Backup Dateien in /media/usb0/ccu-historian_db-backups "gezählt" und die ältesten Dateien gelöscht bis die definierte Maximalanzahl erreicht ist. Lässt man das so wöchentlich laufen werden nun erstmal 24 Wochen-Backups (ca. 6 Monate) erstellt, danach wird jeweils ein neues Backup erstellt und das älteste gelöscht.
Wenn man das File-Logging im Historian aktiv hat sieht das dann bspw. so aus:
(die Cron-Zeiten sind hier zwecks Demonstration stark gestaucht)
Code: Alles auswählen
2022-09-03 14:26:13|INFO |*** Datenbank-Backup-Create-Script gestartet ***
2022-09-03 14:26:13|INFO |Creating backup of database to file /media/usb0/ccu-historian_db-backups/db-backup_202209031426.zip
2022-09-03 14:26:13|INFO |Datenbank-Backup wurde in Datei /media/usb0/ccu-historian_db-backups/db-backup_202209031426.zip geschrieben.
2022-09-03 14:28:13|INFO |*** Datenbank-Backup-CleanUp-Script gestartet ***
2022-09-03 14:28:13|INFO |Anzahl zu behaltener Backup-Dateien: 24
2022-09-03 14:28:13|INFO |Gefundene Backup-Dateien:
2022-09-03 14:28:13|INFO |db-backup_202209031426.zip
2022-09-03 14:28:13|INFO |db-backup_202209021848.zip
2022-09-03 14:28:13|INFO |db-backup_202209021854.zip
2022-09-03 14:28:13|INFO |db-backup_202209021900.zip
2022-09-03 14:28:13|INFO |db-backup_202209021906.zip
2022-09-03 14:28:13|INFO |db-backup_202209021912.zip
2022-09-03 14:28:13|INFO |db-backup_202209021918.zip
2022-09-03 14:28:13|INFO |db-backup_202209021924.zip
2022-09-03 14:28:13|INFO |db-backup_202209021930.zip
2022-09-03 14:28:13|INFO |db-backup_202209021936.zip
2022-09-03 14:28:13|INFO |db-backup_202209021942.zip
2022-09-03 14:28:13|INFO |db-backup_202209021948.zip
2022-09-03 14:28:13|INFO |db-backup_202209030833.zip
2022-09-03 14:28:13|INFO |db-backup_202209031016.zip
2022-09-03 14:28:13|INFO |db-backup_202209031024.zip
2022-09-03 14:28:13|INFO |db-backup_202209031032.zip
2022-09-03 14:28:13|INFO |db-backup_202209031040.zip
2022-09-03 14:28:13|INFO |db-backup_202209031048.zip
2022-09-03 14:28:13|INFO |db-backup_202209031056.zip
2022-09-03 14:28:13|INFO |db-backup_202209031100.zip
2022-09-03 14:28:13|INFO |db-backup_202209031108.zip
2022-09-03 14:28:13|INFO |db-backup_202209031116.zip
2022-09-03 14:28:13|INFO |db-backup_202209031124.zip
2022-09-03 14:28:13|INFO |db-backup_202209031226.zip
2022-09-03 14:28:13|INFO |db-backup_202209031326.zip
2022-09-03 14:28:13|INFO |Loesche db-backup_202209021848.zip
Code: Alles auswählen
// *** Datenbank-Backup-Create-Script und Datenbank-Backup-CleanUp-Script
// *** Code basiert auf Mathias Beispielscripten, angepasst von Baxxy
// *** Cron Expression Generator & Explainer - Quartz: https://www.freeformatter.com/cron-expression-generator-quartz.html
// ---> Datenbank-Backup-Create-Script Start --->
database.tasks.create_DB_Backup_File.enable=true
database.tasks.create_DB_Backup_File.cron="13 13 0 ? * SUN *"
database.tasks.create_DB_Backup_File.script={
// *** Konfiguration ***
// Backup Speicherpfad
def backupPath = "/media/usb0/ccu-historian_db-backups"
// Backup Dateiname
def fileName = "db-backup"
// *** Skript ***
log.info "*** Datenbank-Backup-Create-Script gestartet ***"
def timestamp = new Date().format("YYYYMMddHHmm")
def fileName_ts = fileName + "_${timestamp}.zip"
def path_and_file = backupPath + "/" + fileName_ts
database.createBackup(path_and_file)
log.info "Datenbank-Backup wurde in Datei $path_and_file geschrieben."
}
// <--- Ende Datenbank-Backup-Create-Script <---
// ---> Datenbank-Backup-CleanUp-Script Start --->
database.tasks.clean_DB_Backup_Files.enable=true
database.tasks.clean_DB_Backup_Files.cron="13 33 0 ? * SUN *"
database.tasks.clean_DB_Backup_Files.script={
// *** Konfiguration ***
// Anzahl zu behaltener Backup-Dateien
def keep = 24
// Backup Speicherpfad
def backupPath = "/media/usb0/ccu-historian_db-backups"
// *** Skript ***
log.info "*** Datenbank-Backup-CleanUp-Script gestartet ***"
log.info "Anzahl zu behaltener Backup-Dateien: $keep"
log.info "Gefundene Backup-Dateien:"
def backupFiles=[]
new File(backupPath).eachFileMatch(~/.*_.*\.zip/) { file ->
backupFiles << file
log.info file.name
}
backupFiles.sort({ it.name }).reverse().drop(keep).each { file ->
log.info "Loesche $file.name"
file.delete()
}
}
// <--- Ende Datenbank-Backup-CleanUp-Script <---
Edit:
Es scheint ein Problem mit Komma separierten Zeiten bei den Cron-Expressions zu geben.
Mit folgendem Beispiel startet der Historian nicht mehr vollständig:
Code: Alles auswählen
cron="0 13,43 * ? * *"
(vereinfacht immer um xx:13:00 und um xx:43:00)
Ich habe dazu beim Historian ein Ticket #359 aufgemacht damit Mathias sich das mal angucken kann.
Hinweis: Das Problem ist ab der 3.3.0 behoben!
Edit 2:
>> Hier << geht's zum neueren AiO-Script, das ich aktuell empfehlen würde.