NEWS
[Anleitung][HowTo] Automatisiertes BackUp Mehr-Generationen auf NAS
-
Nice danke dir!
–-----------------------
Send from mobile device
-
Hallo,
ganz tolle Doku! Danke.
Einen Vorschlag zur Optimierung hätte ich.
Statt:
tar -cvf /BackUp/TARS/iobroker-20$(date +%y%m%d-%H%M%S).tar /BackUp/iobroker ````auf Seite 5 würde ich
tar -czf /BackUp/TARS/iobroker-20$(date +%y%m%d-%H%M%S).tgz /BackUp/iobroker
Als Ergänzung für alle MySQL-Benutzer kann in die backup.sh noch:
backup mysql
cd /BackUp
/usr/bin/mysqldump --user=root --password=DasPasswort --events --all-databases > mysql_databases.sql
/bin/tar -czf /BackUp/TARS/mysql-20$(date +%y%m%d-%H%M%S).tgz mysql_databases.sqlFür die Bereinigung müsste dann noch:
find /BackUp/TARS -name 'mysql*' -mtime +14 -exec rm -rf {} ;
-
Einen Vorschlag zur Optimierung hätte ich. `
super, danke dir.
Werde ich testen und entsprechend einbauen.
vG Looxer
-
Hi,
ich habe die Doku nochmal überarbeitet
-
Übersicht der Scripte hinzugefügt
-
Kommentare bei den Scripten eingefügt
-
Scripte angepasst und Archive als komprimierte Archive hinzugefügt
-
mySQL Sicherung mit aufgenommen
Da ich mySQL nicht nutze:
Mir ist nicht klar wie mySQL wieder hergestellt wird. Vielleicht kann mir da jemand auf die Sprünge helfen.
Im Moment ist es so, dass ich die Datei mysql_databases.sql im Sicherungsverzeichnis /BackUp/TARS/BackUp entpackt habe.
Wie wird diese Datei rückgesichert ?
vG Looxer
-
-
So kannst du mysql evtl. wiederherstellen.
mysql -u <user>-p mydatabasename < db_backup.dump</user>
Ich habe gerade den Befehl für die Sicherung nicht zur Hand.
-
der komplette Befehl dazu ist:
tar -xzOf your_db_dump.tgz | mysql --user=root --password=DeinPasswort
Damit wird das Archiv entpackt und sofort in MySQL importiert.
-
Ach so noch Vergessen Das .tgz-File muss vorher nicht ausgepackt werden… (Seite 16 der Doku).
-
ok, vielen Dank
ich habe noch weitere Anpassungen vorgenommen.
Damit sollte es das gewesen sein.
vG Looxer
-
Da ich mit Mount schon mehrfach schlechte Erfahrungen gemacht habe, nutze ich rSync um auf eine Synology zu sichern.
Bei einer Fritzbox ist das anscheinend nicht möglich.
-
Hallo,
sehr schöne Anleitung. Hab zwar kein NAS und mein System läuft auf OS X, aber das Redis Skript gefällt mir. Und natürlich das PDF selbst. Top!
Das Redis-Skript holt sich die Uhrzeit vom Skriptstart, dann nicht mehr. Hab es etwas angepasst.
! ````
/* Redis States speichern
! Skript speichert ioBroker States für den Fall eines Restores, damit Redis wieder arbeitet
! Output im Log:
2017-06-13 11:41:35.548 - [33mwarn[39m: javascript.0 State "javascript.0.scriptEnabled.Test.test_owntrack" not found
Dateileichen werden mit Warnmeldung ausgegeben
! von Looxer
! 13.06.2017 erstellt und angepasst (Pix)
/
! var fs = require('fs'); // Modul, um externe Dateien zu schreiben
! var logdate;
var logtime;
var datei = "/BackUp/TARS/states";
! // Anpassung für Pix OS X ioBroker Server (kann unter LINUX entfernt werden)
datei = "/Users/pix/Documents/iobroker/iobroker-data/redis_states";
! // Hauptfunktion für die Updates
function main() {
zeitHolen();
var cacheSelectorState = $('state[state.id=javascript.0.]'); cacheSelectorState.each(function (id, i) {
var val = getState(id).val;
var zk = "setState('"+id+"', "+val+");\n";
if (typeof val === "string") zk = "setState('"+id+"', '"+val+"');\n";
fs.appendFileSync(datei + logdate + "-"+ logtime + ".txt", zk);
});
log('States saved (for Redis)',"info");
}
! // aktuelle Zeit holen
function zeitHolen() {
var now = new Date(); // store current date and time
var year = now.getFullYear();
var month = addZero(now.getMonth()+1).zero2;
var day = addZero(now.getDate()).zero2;
var Thour = addZero(now.getHours()).zero2;
var Tmin = addZero(now.getMinutes()).zero2;
var Tsec = addZero(now.getSeconds()).zero2;logdate = day + '.' + month + '.' + year; logtime = Thour + ':' + Tmin + ':' + Tsec;
}
! // Funktion zur Erzeugung von 2 oder 3 führenden Nullen für das Datum Format
function addZero(i) {
if (i < 10) j = "00" + i; i = "0" + i;
if (i > 9 && i < 100) j = "0" + i;
return {
'zero2' : i,
'zero3' : j
};
}
! // Startet zeitgesteuert
schedule("50 23 * * *", main);
! // Startet 500ms verzögert nach Skriptstart
setTimeout(main, 500);
! ````Ach ja, das Skript sichert nur States der Instanz javascript.0. Da kann man auch noch ran.
Gruß
Pix
EDIT: Besserer Code im nächsten Post
-
So, hab mir das nochmal angesehen und das Skript jetzt für meine Bedürfnisse angepasst. Vielleicht braucht es jemand.
Es erzeugt pro Instanz eine Datei von diesem Format (Name_Datum(amerikanisch)_Std_Min_Sek__Instanz.txt):
redis_states_20170613_12_45_25__0.txt
Welche Instanzen verwendet werden sollen kann man in der Variable instances festlegen.Noch lieber hätte ich das Datum vorn gehabt, aber das klappt mit dem fs-Befehl und dem Pfad nicht. Eine Textdatei ist bei meiner Installation ca. 60KB gross.
Ausserdem habe ich die Zeitfunktion durch ein von mir häufiger verwendeten Code ersetzt. Die vorangehende Doppelnull für Hunderter brauch man ja hier nicht.
/* Redis States speichern Skript speichert ioBroker States für den Fall eines Restores, damit Redis wieder arbeitet Output im Log: 2017-06-13 11:41:35.548 - [33mwarn[39m: javascript.0 State "javascript.0.scriptEnabled.Test.test_owntrack" not found Dateileichen werden mit Warnmeldung ausgegeben von Looxer http://forum.iobroker.net/viewtopic.php?f=8&p=67560#p67560 13.06.2017 erstellt und angepasst (Pix) */ var pfad = "/Users/pix/Documents/iobroker/iobroker-data/redis_states_backup/redis_states"; var instances = ['0','1','2']; // Instanzen des Javascript-Adapters // ab hier keine Anpassungen mehr nötig function schreibeStates(k) { var fs = require('fs'); // Modul, um externe Dateien zu schreiben log(instances[k]); var cacheSelectorState = $('state[state.id=javascript.' + instances[k] + '.*]'); cacheSelectorState.each(function (id, i) { var val = getState(id).val; var zk = "setState('" + id + "', " + val + ");\n"; if (typeof val === "string") zk = "setState('" + id + "', '" + val + "');\n"; var datei = pfad + '_' + zeitHolen().logdate + "_" + zeitHolen().logtime + "__" + instances[k] + ".txt"; fs.appendFileSync(datei, zk); }); log('Instance ' + instances[k] + ' States saved (for Redis)',"info"); } // Hauptfunktion für die Updates function main() { for (var j = 0; j < instances.length; j++) schreibeStates(j); } // aktuelle Zeit holen function zeitHolen () { jetzt = new Date(); var jahr = jetzt.getFullYear(); var monat = (jetzt.getMonth()+1 < 10) ? '0' + (jetzt.getMonth()+1) : jetzt.getMonth()+1; var tag = (jetzt.getDate() < 10) ? '0' + jetzt.getDate() : jetzt.getDate(); var wochentag = jetzt.getDay(); // startet am Sonntag mit 0 var stunde = (jetzt.getHours() < 10) ? '0' + jetzt.getHours() : jetzt.getHours(); var minute = (jetzt.getMinutes() < 10) ? '0' + jetzt.getMinutes() : jetzt.getMinutes(); var sekunde = (jetzt.getSeconds() < 10) ? '0' + jetzt.getSeconds() : jetzt.getSeconds(); return { 'logdate' : jahr + monat + tag, 'logtime' : stunde + '_' + minute + '_' + sekunde }; } // Startet zeitgesteuert schedule("50 23 * * *", main); // Startet 500ms verzögert nach Skriptstart setTimeout(main, 500);
Viele Grüße
Pix
-
Ich habe mal noch schnell das Skript BackUpOnRequest angepasst.
Dort werden die States auf "Knopfdruck" auch erzeugt.
! ````
createState('BackUp-Flag', false); // BackUp Flag
var BackUpVar = "BackUp-Flag"; // BackupFlag
! var pfad = "/BackUp/TARS/redis_states";
var instances = ['0','1','2']; // Instanzen des Javascript-Adapters
! // main
// -----------------------------------------------------------------------------
on( {id:BackUpVar, val: true }, function(obj) { // Event:
! if (getState(BackUpVar).val === true ) { setState(BackUpVar,false) ;
log("EVENT Backup gestartet " ,"info");
for (var j = 0; j < instances.length; j++) schreibeStates(j);
BackUp();
} // ende if BackUpFlag Check
}); // ende on idfunction BackUp() {
exec('/opt/backup.sh', function(err, stdout, stderr) {
if (err) {
log(err);
return;
}
stdout = stdout.replace(/[\D]+/, ""); // alle Zeichen vor der ersten Ziffer entfernen
stdout = stdout.split(/[\D]+/g); // alle nicht-Ziffern als Trennzeichen für das Array verwenden (im Block)
log(stdout);
// writeDp(stdout);
});
}! function schreibeStates(k) {
! var fs = require('fs'); // Modul, um externe Dateien zu schreiben
log(instances[k]);
var cacheSelectorState = $('state[state.id=javascript.' + instances[k] + '.*]'); cacheSelectorState.each(function (id, i) {
var val = getState(id).val;
var zk = "setState('" + id + "', " + val + ");\n";
if (typeof val === "string") zk = "setState('" + id + "', '" + val + "');\n";
var datei = pfad + '' + zeitHolen().logdate + "" + zeitHolen().logtime + "__" + instances[k] + ".txt";
fs.appendFileSync(datei, zk);
});
log('Instance ' + instances[k] + ' States saved (for Redis)',"info");
}
! // aktuelle Zeit holen
function zeitHolen () {
jetzt = new Date();
var jahr = jetzt.getFullYear();
var monat = (jetzt.getMonth()+1 < 10) ? '0' + (jetzt.getMonth()+1) : jetzt.getMonth()+1;
var tag = (jetzt.getDate() < 10) ? '0' + jetzt.getDate() : jetzt.getDate();
var wochentag = jetzt.getDay(); // startet am Sonntag mit 0
var stunde = (jetzt.getHours() < 10) ? '0' + jetzt.getHours() : jetzt.getHours();
var minute = (jetzt.getMinutes() < 10) ? '0' + jetzt.getMinutes() : jetzt.getMinutes();
var sekunde = (jetzt.getSeconds() < 10) ? '0' + jetzt.getSeconds() : jetzt.getSeconds();
return {
'logdate' : jahr + monat + tag,
'logtime' : stunde + '' + minute + '' + sekunde
};
}
// ---------------------------------------------------------------------------------------
// Funktion zur Erzeugung von 2 oder 3 führenden Nullen für das Datum Format
//-----------------------------------------------------------------------------------------------------
function addZero(i) {
if (i < 10) {
j = "00" + i; i = "0" + i;
}
if (i > 9 && i < 100) {
j = "0" + i;
}
return { 'zero2' : i,
'zero3' : j
};
} // Ende Funktion -
Sehr gute Dokumentation,
hast Du Dir mal http://www.nongnu.org/rdiff-backup/ angesehen ? Damit sichere ich meine Maschinen übers Netz auf das NAS und bietet hier vielleicht noch Ergänzungen zu Deiner Lösung.
Gruß
-
hast Du Dir mal http://www.nongnu.org/rdiff-backup/ angesehen ? Damit sichere ich meine Maschinen übers Netz auf das NAS und bietet hier vielleicht noch Ergänzungen zu Deiner Lösung.
Gruß `
Hi,
habs mir angesehen. Ich glaube nicht, dass das eine Ergaenzung zur Doku ist. Die Doku beschreibt wie mit Bordmitteln unter Linux ein automatisiertes Backup -adaptiv fuer Redis und My-SQL - gemacht werden kann.
Ich finde die Loesung aber interessant fuer iobroker. Scheint ja auch relativ einfach zu benutzen zu sein und vor allem kann es auch mit Windows und Mac OS genutzt werden.
Es laesst sich vielleicht einbinden in ioBroker und dann waere es die Grundlage fuer einen Adapter. Das muesste sich aber BF ansehen.
Edit:
damit das nicht untergeht werde ich die Idee ins Trello aufnehmen.
15.06.2017: done
vG Looxer
-
wenn ich jede zeile einzeln ins terminal kopiere klappt alles super, lasse ich das über das script laufen bekomme ich immer fehlermeldungen, dass der die ordner nicht finden kann. Jemand eine idee wieso?
#!/bin/bash cd /opt/iobroker iobroker stop # jetzt wird das iobroker Verzeichnis in das BackUp/iobroker Verzeichnis kopiert rsync --delete -aLvzh -P /opt/iobroker /BackUp/ # die n�chsten Zeilen aktivieren wenn mysql genutzt wird und gesichert werden soll #cd /BackUp #/usr/bin/mysqldump --user=root --password=DasPasswort --events --all-databases > mysql_databases.sql cd /opt/iobroker iobroker start # Erzeugen des Archivs in komprimierter Form tar -czf /BackUp/TARS/iobroker-20$(date +%y%m%d-%H%M%S).tgz /BackUp/iobroker # die n�chse Zeile aktivieren, wenn mySQL genutzt wird und gesichert werden soll #/bin/tar -czf /BackUp/TARS/mysql-20$(date +%y%m%d-%H%M%S).tgz /BackUp/mysql_databases.sql
-
Hallo Meistertr,
versuch mal folgendes, dann kommt auch der Hinweis nicht mit "/" führende Slash entfernen nicht mehr beim ausführen.
#!/bin/bash cd /opt/iobroker iobroker stop # jetzt wird das iobroker Verzeichnis in das BackUp/iobroker Verzeichnis kopiert rsync --delete -aLvzh -P /opt/iobroker /BackUp/ # die nächsten Zeilen aktivieren wenn mysql genutzt wird und gesichert werden soll #cd /BackUp #/usr/bin/mysqldump --user=root --password=DasPasswort --events --all-databases > mysql_databases.sql cd /opt/iobroker iobroker start # zurück in den root Ordner cd / # Erzeugen des Archivs in komprimierter Form tar -czf BackUp/TARS/iobroker-20$(date +%y%m%d-%H%M%S).tgz BackUp/iobroker # die nächse Zeile aktivieren, wenn mySQL genutzt wird und gesichert werden soll #/bin/tar -czf BackUp/TARS/mysql-20$(date +%y%m%d-%H%M%S).tgz BackUp/mysql_databases.sql # Das Script sollte als cronjob als "root" per "nano /etc/crontab" eingeplant werden #10 4 * * * root /opt/backup
Wichtig ist auch für nich so erfahrene Anwender wie mich (habe mich Stunden mit dem Problem rumgeschlagen).
In der Anleitung steht Befehl "crontabe -e" richtig ist "crontab -e", damit man crontab überhaupt öffnen kann. Dann habe ich Stunden lang damit verbracht, das der crontab aber nicht ausgeführt wurde. Ich habe alles als root gemacht.
Nach langem probieren und Google habe ich dann für mich die Lösung gefunden.
Nicht in crontab eintragen sonder mit "nano /etc/crontab" als root, dann dann z.B. für 4 Uhr 10 morgens "10 4 * * * root /opt/backup"
Wichtig ist auch noch, ich habe immer wieder bei der Fehlersuche gelesen, das es Probleme geben kann mit .sh Dateiendung, deshalb habe ich das File nicht als "backup.sh" abgespeichert im Ordner "/opt" sonder als "backup" ohne Endung.
Bei mir wird das Backup dann noch auf eine Synology NAS geschoben.
Hoffe das hilft dir weiter.
-
@TM8:Hallo Meistertr,
versuch mal folgendes, dann kommt auch der Hinweis nicht mit "/" führende Slash entfernen nicht mehr beim ausführen.
#!/bin/bash cd /opt/iobroker iobroker stop # jetzt wird das iobroker Verzeichnis in das BackUp/iobroker Verzeichnis kopiert rsync --delete -aLvzh -P /opt/iobroker /BackUp/ # die nächsten Zeilen aktivieren wenn mysql genutzt wird und gesichert werden soll #cd /BackUp #/usr/bin/mysqldump --user=root --password=DasPasswort --events --all-databases > mysql_databases.sql cd /opt/iobroker iobroker start # zurück in den root Ordner cd / # Erzeugen des Archivs in komprimierter Form tar -czf BackUp/TARS/iobroker-20$(date +%y%m%d-%H%M%S).tgz BackUp/iobroker # die nächse Zeile aktivieren, wenn mySQL genutzt wird und gesichert werden soll #/bin/tar -czf BackUp/TARS/mysql-20$(date +%y%m%d-%H%M%S).tgz BackUp/mysql_databases.sql # Das Script sollte als cronjob als "root" per "nano /etc/crontab" eingeplant werden #10 4 * * * root /opt/backup
Wichtig ist auch für nich so erfahrene Anwender wie mich (habe mich Stunden mit dem Problem rumgeschlagen).
In der Anleitung steht Befehl "crontabe -e" richtig ist "crontab -e", damit man crontab überhaupt öffnen kann. Dann habe ich Stunden lang damit verbracht, das der crontab aber nicht ausgeführt wurde. Ich habe alles als root gemacht.
Nach langem probieren und Google habe ich dann für mich die Lösung gefunden.
Nicht in crontab eintragen sonder mit "nano /etc/crontab" als root, dann dann z.B. für 4 Uhr 10 morgens "10 4 * * * root /opt/backup"
Wichtig ist auch noch, ich habe immer wieder bei der Fehlersuche gelesen, das es Probleme geben kann mit .sh Dateiendung, deshalb habe ich das File nicht als "backup.sh" abgespeichert im Ordner "/opt" sonder als "backup" ohne Endung.
Bei mir wird das Backup dann noch auf eine Synology NAS geschoben.
Hoffe das hilft dir weiter. `
ich bekomme immer:
`total size is 729.95M speedup is 92.37 : No such file or directory /opt/iobroker Commands: iobroker setup [--objects <host>] [--states <host>] [cust[/code]</host></host>` und : `~~[code]~~: No such file or directory: / tar: BackUp/iobroker\r: Cannot stat: No such file or directory tar (child): BackUp/TARS/iobroker-20170821-060741.tgz: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now [/code]` habe schon alles versucht auch neu geschrieben um fehler in der formatierung endgegen zu wirken
-
@TM8:n der Anleitung steht Befehl "crontabe -e" richtig ist "crontab -e", `
sorry, das ist ein blöder Tippfehler. Werde ich am WE korrigieren.habe schon alles versucht auch neu geschrieben um fehler in der formatierung entgegen zu wirken `
mal eine blöde Frage: mit welchem Editor arbeitest du ?
Ich nutze grundsätzlich notepad++. Da gibt es nie Probleme mit UTF8. Ansonsten kann es zu unschönen Nebeneffekten wegen versteckter Sonderzeichen kommen. Ist jetzt das Einzige was ich mir im Moment vorstellen kann was ein Problem sein könnte.
vG Looxer
-
Looxer, vielen Dank für deine Mühe, die Anleitung ist super. Durch den Fehler habe ich wieder viel gelernt, das ist immer das gute wenn man auf Fehlersuche gehen muss.
-
Es war bei mir in der Tat ein Formatierungsproblem, die bash scripte laufen nun, jetzt wollte ich es in iobroker integrieren, leider ist in dem js code ein Fehler, die Zeile function Backup ist auskommentiert. Das Hat zur folge, dass exec bei jedem start des scriptes aufgerufen wird. Folge: iobroker in bootloop / Sd card wird so lange mit Backupversuchen bombadiert, bis Sd Karte voll einzige möglichkeit die ich hatte ein Backup einspielen. ironie des Schicksaals, dass nach Backupversuch ein Backup gebraucht wird