MySql Backup einer externen Datenbank

Status
Für weitere Antworten geschlossen.

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen,

ich weiß nicht, ob ich in diesem Unterforum richtig bin. Wenn nicht, bitte verschieben.

Ich habe ein Problem, von dem ich nicht weiß, wie ich es angehen soll.
Ich habe eine Homepage laufen, mit einer phpbb3-MySQL-Datenbank (>300MB).
Diese würde ich gerne regelmäßig automatisch über meine NAS sichern.

Ich hatte mal einen mysqldump über eine php Datei laufen, die von einem Cronjob gestartet wurde.
Der hatte dann aber immer Timeouts und die Backups waren nie mehr komplett

Da ich mich aber nicht wohl dabei fühle nur auf den Hoster zu vertrauen, würde ich die DB gerne automatisch auf meine NAS sichern.
Wie bekomme ich das hin, dass ich in regelmäßigen Abständen einen mysql dump auf mein NAS bekomme?

Ich könnte ja den mysqldump über die shell ausführen. Wenn ich den Befehl in eine Datei schreibe, wie kann ich die dann CronJobmäßig starten?
Sollte ich dass als admin user laufen lassen oder lieber als normal Benutzer oder sehr stark eingeschränkter Benutzer?

Vielen Dank im Voraus
Seth
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hallo,

ich weiß ja nicht wie dein Script aussieht, aber das klingt für mich nach einem Timeout von php. Hier ist eine maximale Laufzeit von 30 Sekunden Default. Ändern kannst Du das mit

Rich (BBCode):
set_time_limit(0);

Ansonsten wird in den meisten Fällen ja nur die Befehlszeile für mysqldump zusammengebaut und dann über system() ausgeführt. Bei einem Cronjob kannst Du die Zeile auch direkt in ein Script packen und somit ausführen. Da kannst Du (und solltest auch) komplett auf php verzichten. Auf die richtige Shebang-Zeile dann achten.

Gruß Frank
 

Fossidog

Benutzer
Mitglied seit
19. Feb 2010
Beiträge
107
Punkte für Reaktionen
0
Punkte
16
Bei nem "normalem" Webspace Account lässt sich das Timelimit nur net ändern. Das geht nur bei nem root Server.

Nutze das Proggie mysqldumper, da wird die DB stückchenweise gesichert und so das Timelimit umgangen.
 

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Danke für eure Tipps, aber dabei kommt noch nicht so ganz das raus, was ich gerne hätte.

Mir ist vor allem wichtig, dass es nachts voll automatisch läuft.

Ich habe noch mal weiter gesucht und diesen Artikel gefunden http://forum.synology.com/wiki/index.php/Backup_mySQL-database_with_a_cronjob
Zum Testen habe ich jetzt mal den ganzen Krempel mit dem löschen usw. weg gelassen und nur den Teil mit Datum und mysqldump übernommen.
Irgendwas funktioniert da noch nicht 100% (erst 99% :p)

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H:%M:%S)
/usr/syno/mysql/bin/mysqldump -hHOST -uUSER -pPASSWORD --opt --dump-date --ssl --all-databases | gzip -c -9 > /volume1/homes/USER/sqlbackup/DATEINAME-${DATE}.gz

Was zum Verrecken nicht klappen will, ist die Dateiendung. Alles nach dem ${DATE} wird abgeschnitten und egal was ich probiere, es klappt net.
Wahrscheinlich ist es Kinderkram, aber ich bin nun mal Linuxanfänger ;)

Ich bekomme keine Fehlermeldungen und die Datenbankdumps sind auch da. Das wichtige klappt also ;)
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hallo,

also einen offensichtlichen Fehler kann ich nicht entdecken. Ich würde aber Doppelpunkte in Dateinamen vermeiden.

Wie schaust Du dir denn dann Directory an. Vieleicht so etwas banales wie Windows mit der (sträflich) aktivierten Option "Bekannte Dateiendungen ausblenden". Eine zweite Möglichkeit wäre noch ein unsichtbares Zeichen wie z.Bsp. \0 welches vor der Dateiendung steht und somit dann die Ausgabe der Dateiendung verhindert. In diesem Fall einfach mal alles inklusive der schliessenden Klammer löschen und dann neu eintippen.

Gruß Frank
 

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Berechtigte Frage :D

ich schaue mittels Console und ll nach.
Wenn ich die Date Variable aus dem Dateinamen nehme, dann gehts (natürlich).
OK, habe mal die Doppelpunkte raus genommen. Geholten hat das auch nicht

in der Console sieht dann alles gut aus, aber der Dateiname im Windowsexplorer hat dann immer einen komischen Punkt im Namen.
Kein "normaler" Satzende-Punkt, sondern einer, der auf halber Höhe ist und z.B. bei Aufzählungen verwendet würde.
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hab das mal auf die einfache geprüft. Funktioniert einwandfrei.

Rich (BBCode):
#!/opt/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)

echo "test" | gzip -c -9 > DATEINAME-${DATE}.gz

Kann mir nur vorstellen das Du da in deinem Script irgendein nicht sichtbares Zeichen hast. Copy und Paste ist manchmal nicht die beste Wahl :)

Gruß Frank
 

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Ich bin so ein ...

Dein Hinweis mit den nicht sichtbaren Zeichen war der Treffer.
Die Datei war als Windowsdatei formatiert und hatte daher am Zeilenende die falschen Zeichen, da ich das Skript mit Notepad++ über Windows erstellt habe.
Nachdem ich die Datei korrekt abgespeichert habe, funktioniert es :)

So, jetzt kann das backupen losgehen.

Dank dir. Der Guide im Wiki ist sehr hilfreich gewesen, wenn man die Datei korrekt formatiert
 

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
so ganz zu Ende habe ich dieses Thema noch nicht.

Die automatische Ausführung des Skripts möchte ich nicht direkt in die Crontab eingeben, sondern über die Aufgabenplanung des DSM einsteuern, da ich sie dann auch in der Übersicht sehe.

Also flink einen neuen Eintrag erstellt, der als admin folgendes machen soll "/volume1/homes/admin/backups.sh >& /volume1/homes/admin/errors.txt"
Die Datei liegt da auch, Besitzer ist admin mit rwx Rechten.

In der Error Datei steht aber, dass er die Datei nicht finden kann.

Was übersehe ich?
Wenn ich den Pfad wie oben komplett über ssh eingebe, dann läuft mein Skript durch.
 

stefan_lx

Benutzer
Mitglied seit
09. Okt 2009
Beiträge
2.766
Punkte für Reaktionen
74
Punkte
88
schreib im Aufgabenplaner doch mal ein sh davor, also so:
"sh /volume1/homes/admin/backups.sh >& /volume1/homes/admin/errors.txt"

Stefan
 

sethdeblade

Benutzer
Mitglied seit
21. Feb 2011
Beiträge
32
Punkte für Reaktionen
0
Punkte
0
Dank dir. Damit hat es funktioniert.
 

Online78

Benutzer
Mitglied seit
15. Mrz 2013
Beiträge
244
Punkte für Reaktionen
11
Punkte
18
Hallo, wie würde dieser Dump "Backup" zurückgespielt werden? Danke für eure Hilfe.
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hallo, wie würde dieser Dump "Backup" zurückgespielt werden? Danke für eure Hilfe.

Kommt darauf an wie Du das machen willst? Auf der Konsole oder über eine GUI. Bei GUI käme phpMyAdmin oder die MySQL Workbench in Betracht.

Gruß Frank
 

Online78

Benutzer
Mitglied seit
15. Mrz 2013
Beiträge
244
Punkte für Reaktionen
11
Punkte
18
am liebsten mit phpmyadmin. Da kann ich jedoch nur 32MB grosse DB einlesen. meine ist aber schon fast ein GB gross. Es gibt bei phpmyadmin die Möglichkeit ein Hacken abzuwählen, um ein Abbruch des Einlesens zu verhindern. Ich habe dies getestet und es geht nicht. Ich könnte aber gut damit leben, wenn ich die DB mit der Konsole einlesen soll. Ich mache ja die sicherung auch damit. Habe ein kleines Script erstellt, welches die Sicherung macht und insgesamt immer 4 Sicherungen beibehält.
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hallo,

bei so großen DB's würde ich immer die MySQL Workbench vorziehen, auch weil zum administrieren recht vielseitig. Das Problem bei phpMyAdmin ist nicht nur der Haken der gesetzt werden muß, sondern auch das TimeOut für php. Hab den Parameter nicht im Kopf, aber der läßt sich per Hand in einer Config anpasssen. Von Haus aus bricht php glaube ich nach 3 Minuten ab.

Ansonsten per Script

Rich (BBCode):
backup: # mysqldump -u root -p[root_password] [database_name] > dumpfilename.sql

Rich (BBCode):
restore:# mysql -u root -p[root_password] [database_name] < dumpfilename.sql

und falls wie oben beschrieben gzipt dann noch davor
Rich (BBCode):
gzip .... | mysql ....

beim Restore.

Gruß Frank
 

Online78

Benutzer
Mitglied seit
15. Mrz 2013
Beiträge
244
Punkte für Reaktionen
11
Punkte
18
Danke für die rasche Rückmeldung. Für den Restore müsste ich also folgendes eingeben wenn ich dies mit der Konsole mache (kann ja dann ein kleines Scirpt erstellen und dieses wenn nötig durch den Aufgabenplaner auslösen).
root:# mysql -u root -p[rootpasswort] mysql < dumpfilename.gz

Dazu zwei Fragen:
- stimmt mysql als Datenbankname oder ist es MariaDB (habe MariaDB)
- mein Backupscript macht direkt ein gz Backupfile mit dem File: *.gz --> stimmt dies so, oder wie geht es mit gz? Verstehe dein Input mit gzip .... nicht

Danke
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
stimmt mysql als Datenbankname oder ist es MariaDB (habe MariaDB)

Ja, der Befehl lautet auch unter MariaDB mysql. Allerdings solltest Du im Aufgabenplaner den kompletten Pfad angeben. /var/packages/MariaDB/target/usr/bin/mysql

mein Backupscript macht direkt ein gz Backupfile mit dem File: *.gz --> stimmt dies so, oder wie geht es mit gz? Verstehe dein Input mit gzip .... nicht

Entsprechend muß wie schon oben beschrieben auch dein File wieder entpackt werden und dann an mysql übergeben werden. Kenne deine Parameter ja nicht die Du für das zippen angegeben hast. Dafür stehen eben die Punkte.

Ein Beispiel zum entpacken

Rich (BBCode):
gzip -d <Dateiname>

Gruß Frank
 

Online78

Benutzer
Mitglied seit
15. Mrz 2013
Beiträge
244
Punkte für Reaktionen
11
Punkte
18
es ergibt bei mir folgenden Fehler wenn ich das Rückspielen versuche:
ERROR 1049 (42000): Unknown database '/var/packages/MariaDB/target/usr/bin/mysql'

Ich habe folgende Befehlszeile:
mysql -uroot -p[rootpasswort] /var/packages/MariaDB/target/usr/bin/mysql < [pfaddesdump]/mysqldump.sql

danke für die Hilfe.
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
mysql -uroot -p[rootpasswort] /var/packages/MariaDB/target/usr/bin/mysql < [pfaddesdump]/mysqldump.sql

Das ist so auch falsch. Du gibst ja als Datenbankname den Befehl an. Richtiger wäre:

Rich (BBCode):
/var/packages/MariaDB/target/usr/bin/mysql -uroot -p[rootpasswort] datenbankname < [pfaddesdump]/mysqldump.sql

Gruß Frank
 

Online78

Benutzer
Mitglied seit
15. Mrz 2013
Beiträge
244
Punkte für Reaktionen
11
Punkte
18
hi Frank, vielen Dank, ich habe eine gesicherte MariaDB wieder zurückspielen können. Der Zarafa Server läuft einwandfrei, auch die owncloud. Super Sache ;-)
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat