Sie sind nicht angemeldet.

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

1

Samstag, 19. Mai 2018, 09:54

Kennt sich jemand gut mit PHP aus?

Hallo,

ich tüftle gerade. Ich habe mir (R. I. P. MySQLDumper) aus dem Netz folgendes Skript kopiert:

<?

exec("mysqldump -u MEINDATENBANKBENUTZER -pMEINDATENBANKPASSWORT --add-drop-table MEINDATENBANKNAME >dump" . date('Ymd_g_i') . ".sql");

exec("gzip dump" . date('Ymd_g_i') . ".sql");

echo "Backup der Datenbank für MEINESEITE wurde im Ordner backup erstellt!";

?>

Ich möchte die Datei im tar-Format packen lassen. Meines Wissens geht das ohne großen Aufwand sehr elegant. Aber meine PHP-Kenntnisse sind stark eingerostet. Kann mir jemand helfen bitte?

Danke im Voraus und Gruß, Anselm

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Anselm Rapp« (19. Mai 2018, 21:19) aus folgendem Grund: Tippfehler


Beiträge: 12 687

Registrierungsdatum: 4. April 2004

Wohnort: Meerbusch (bei Düsseldorf)

Beruf: Softwareentwickler

  • Nachricht senden

2

Samstag, 19. Mai 2018, 13:32

Hallo Anselm.

um erst einmal die Frage im Betreff wahrheitsgemäß zu beantworten: Bestimmt, aber ich nicht. :)

So wie ich es bar fast jeder PHP-Kenntnisse verstehe, tut das Skript folgendes: Es erzeugt einen (zunächst unkomprimierten) Extrakt der Datenbank mit der Endung .sql und komprimiert ihn anschließend mit gzip. Herauskommen müsste eine Datei mit der Doppelendung .sql.gz.

Jetzt erst mal ein Punkt, den ich nicht verstehe: Es handelt sich bei dem Extrakt um eine einzelne Datei. Warum willst Du die mit tar packen? Das dient ja normalerweise dazu, aus mehreren Dateien eine zu machen, um sie (meist) anschließend zu komprimieren (tar selbst komprimiert nicht). Bei einer Datei reicht gzip doch eigentlich.

Falls es aus irgendwelchen Gründen trotzdem sein soll, würde ich einfach den Aufruf von gzip...

Quellcode

1
exec("gzip dump" . date('Ymd_g_i') . ".sql");


... durch einen von tar ersetzen:

Quellcode

1
exec("tar -czf dump" . date('Ymd_g_i') . ".sql.tar.gz dump" . date('Ymd_g_i') . ".sql");


Das würde eine (komprimierte) .tar.gz-Datei erzeugen. Für unkomprimiertes tar müsste es irgendwie so aussehen:

Quellcode

1
exec("tar -cf dump" . date('Ymd_g_i') . ".sql.tar dump" . date('Ymd_g_i') . ".sql");


Nicht ausprobiert, muss also natürlich nicht funktionieren, aber vielleicht mal einen Versuch wert.

Gruß,
Timo

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

3

Samstag, 19. Mai 2018, 15:58

Hallo Timo,

danke, dass Du Dich opferst.


So wie ich es bar fast jeder PHP-Kenntnisse verstehe, tut das Skript folgendes: Es erzeugt einen (zunächst unkomprimierten) Extrakt der Datenbank mit der Endung .sql und komprimiert ihn anschließend mit gzip. Herauskommen müsste eine Datei mit der Doppelendung .sql.gz.

Jetzt erst mal ein Punkt, den ich nicht verstehe: Es handelt sich bei dem Extrakt um eine einzelne Datei. Warum willst Du die mit tar packen? Das dient ja normalerweise dazu, aus mehreren Dateien eine zu machen, um sie (meist) anschließend zu komprimieren (tar selbst komprimiert nicht). Bei einer Datei reicht gzip doch eigentlich.

Also - da muss ich ausholen: Mein Hoster stellt im Adminpanel die Möglichkeit bereit, MySQL-Dateien manuell zu sichern. Ich bin sonst sehr angetan von ihm, aber täglich eine Sicherung von Hand anzustoßen und herunterzuladen, ist suboptimal. Bisher habe ich das mit dem MySQLDumper und Cronjob gemacht, aber der ist eingegangen. Auf der Suche nach Ersatz habe ich das Skript gefunden. Damit will ich die MySQL-Sicherungen künftig automatisieren.

Die Dateien kommen in diesem Format an: mysql_db_backup_20180519154258.tar (den Dateinamen muss ich noch anpassen) und enthalten das da: benutzer_db1_1_20180519154257.gz - keine Ahnung warum; so ist es und dem muss ich mich anpassen. Die per Skript erzeugte .tar ist übrigens 10 Byte größer als die .gz und enthält nur Binäres; da kann etwas nicht stimmen. Die .gz soll gar nicht heruntergeladen werden, nur die .tar, das scheint ein Zwischenschritt zu sein.

Wenn ich das schaffe, erzeuge ich per Skript eine .tar und versuche, die im Adminpanel zu "restoren". Wenn es klappt, habe ich ein erhebliches Problem gelöst.

Soweit klar, meine Erklärungen?

Gruß, Anselm

Beiträge: 12 687

Registrierungsdatum: 4. April 2004

Wohnort: Meerbusch (bei Düsseldorf)

Beruf: Softwareentwickler

  • Nachricht senden

4

Samstag, 19. Mai 2018, 21:24


Die Dateien kommen in diesem Format an: mysql_db_backup_20180519154258.tar (den Dateinamen muss ich noch anpassen) und enthalten das da: benutzer_db1_1_20180519154257.gz - keine Ahnung warum; so ist es und dem muss ich mich anpassen.


Es könnte Sinn ergeben, wenn u.U. auf dem gleichen Weg auch mehrere MySQL-Datenbanken in einer tar-Datei gesichert werden. Meist wird zwar (wie schon geschrieben) erst aus den Einzeldateien eine große gemacht und die anschließend komprimiert, was den Vorteil einer geringeren Dateigröße hat (Stichwort "Solides Archiv"), aber auch der hier offenbar beschrittene umgekehrte Weg (erst alle Einzeldateien komprimieren, und dann aus allen resultierenden *.gz-Dateien ein Tar-Archiv erzeugen) kann sinnvoll sein. Wenn man nur die Sicherung einer der Datenbanken bräuchte, müsste man bei der zweiten Methode nicht (wie bei der ersten) das ganze Tar-Archiv dekomprimieren, sondern nur gezielt die eine Datei, die man braucht. Das geht (je nach Anzahl der enthaltenen Dateien) vermutlich deutlich schneller.

Das Erzeugen ist generell nicht das Problem. Müsste in zwei Schritten erfolgen und irgendwie so aussehen:

Quellcode

1
exec("gzip dump" . date('Ymd_g_i') . ".sql");


Also erst mal das Komprimieren der SQL-Datei, wie schon vorhanden. Und dann das tar-Archiv:

Quellcode

1
exec("tar -cf mysql_db_backup_" . date('Ymd_g_i') . ".tar *.sql.gz");


Die Dateinamen sind dann allerdings anders als in Deinem Beispiel. Ob das Admintool die Datei so importieren kann, weiß ich nicht.

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

5

Sonntag, 20. Mai 2018, 13:08

Danke, Timo. Ich gönne uns erst mal etwas Pfingstruhe, aber dann ...

Gruß, Anselm

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

6

Dienstag, 22. Mai 2018, 16:38

Hallo Timo,

ich habe noch nicht aufgegeben. ;)

Es könnte Sinn ergeben, wenn u.U. auf dem gleichen Weg auch mehrere MySQL-Datenbanken in einer tar-Datei gesichert werden. Meist wird zwar (wie schon geschrieben) erst aus den Einzeldateien eine große gemacht und die anschließend komprimiert, was den Vorteil einer geringeren Dateigröße hat (Stichwort "Solides Archiv"), aber auch der hier offenbar beschrittene umgekehrte Weg (erst alle Einzeldateien komprimieren, und dann aus allen resultierenden *.gz-Dateien ein Tar-Archiv erzeugen) kann sinnvoll sein. Wenn man nur die Sicherung einer der Datenbanken bräuchte, müsste man bei der zweiten Methode nicht (wie bei der ersten) das ganze Tar-Archiv dekomprimieren, sondern nur gezielt die eine Datei, die man braucht. Das geht (je nach Anzahl der enthaltenen Dateien) vermutlich deutlich schneller.

Richtig ist jedenfalls, wie ich mich inzwischen überzeugt habe, dass man beim Vorhandensein mehrerer MySQL-Datenbanken alle markieren und herunterladen kann. Man erhält dann eine .tar-Datei, welche alle Sicherungen im .gz-Format enthält.

Dann habe ich noch etwas über die Dateinamen nachgedacht. Zum Probieren will ich künftig in meinem Einflussbereich simple Dateinamen verwenden, also beispielsweise db.tar, db1.gz usw. Wenn alles richtig läuft, kann ich Datum und Uhrzeit in den Dateinamen aufnehmen. Weiterhin müsste bei Deinem Skript nach Erstellen der .tar-Datei noch die .gz-Datei löschen, denn sonst nimmt die unnötig Platz in Anspruch. (Expertenmodus: Es sollten nur die letzten drei Dateien aufgehoben werden. Das stelle ich erst mal zurück.) Aber: Die Dateien, die heruntergeladen werden, haben ja tatsächlich Dateinamen wie mysql_db_backup_20180522115635.tar. Also müsste die heruntergeladene Datei im ersten Schritt immer gleich heißen und dann erst bei der Komprimierung nach .tar mit Datum versehen werden - stimmt's?

Mein Script sieht ohne Datumsumwandlungen jetzt so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

echo "MySQL sichern ...<br />";

echo "Lade MySQL herunter ...<br />";
exec("mysqldump -u MEINDATENBANKBENUTZER -pMEINDATENBANKPASSWORT --add-drop-table MEINDATENBANKNAME >dump.sql");
echo "MySQL heruntergeladen.<br />";

echo "Erzeuge .gz-Datei ...<br />";
/* exec("gzip dump" . date('Ymd_g_i') . ".sql"); */
exec("gzip dump.sql");
echo ".gz-Datei erzeugt.<br />";

echo "Erzeuge .tar-Datei ...<br />";
/* exec("tar -cf mysql_db_backup_" . date('Ymd_g_i') . ".tar *.sql.gz"); */
exec("tar -cf dump.tar *.sql.gz");
echo ".tar-Datei erzeugt.<br />";

echo "Loesche .gz-Datei ...<br />";
/* unlink('dump.sql.gz'); */
echo ".gz-Datei geloescht.<br />";

echo "Ende.<br />";

?>

Morgen teste ich weiter. Ich wollte heute nur noch meinen aktuellen Stand melden.

Gruß, Anselm

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

7

Mittwoch, 23. Mai 2018, 15:28

Jetzt habe ich festgestellt, dass die manuelle Sicherung mit mysqldump erfolgen kann, das Restore aber nicht über das Adminpanel erfolgen muss, sondern über phpMyAdmin möglich ist. Das entsprechende Skript sollte einfacher sein, aber ich muss das erst probieren. Zuerst mache ich mal eine Pause, sonst werden meine Augen rechteckig. Ich melde mich bei Bedarf wieder.

Gruß, Anselm

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

8

Mittwoch, 6. Juni 2018, 10:27

Meine getestete Lösung:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$dbuser 'MEINDATENBANKBENUTZER';
$dbpassword 'MEINDATENBANKPASSWORT';
$dbname 'MEINDATENBANKNAME';
$dumpfile 'MEINDUMPFILENAME.sql'/* mit Pfad */

echo "Sichere " $dumpfile " ...<br />";
exec("mysqldump --user=$dbuser --password=$dbpassword --add-drop-table  $dbname > $dumpfile");
echo "MySQL gesichert.<br />";

echo "Erzeuge .gz-Datei ...<br />";
exec("gzip -f $dumpfile"); /* Loescht Originaldatei; fuer Behalten Parameter -k */
echo ".gz-Datei erzeugt.<br />";

?>

Fertig sieht es ganz einfach aus. Datum und Uhrzeit im Dateinamen erzeuge ich lokal (muss ich noch programmieren, kann ich aber), damit das Dumpfile auf dem Server jeweils denselben Namen hat und überschrieben wird.

Anselm

Beiträge: 12 687

Registrierungsdatum: 4. April 2004

Wohnort: Meerbusch (bei Düsseldorf)

Beruf: Softwareentwickler

  • Nachricht senden

9

Mittwoch, 6. Juni 2018, 11:02

Hallo Anselm,

also jetzt doch ohne tar?

Eigentlich ist das bei einer einzelnen Datei ja auch sinnvoll (wie ich schon oben schrieb). Ich hatte es allerdings so verstanden, als bräuchte das Admintool dieses "gzip in tar"-Format, um die Sicherung importieren zu können.

Gruß,
Timo

  • »Anselm Rapp« ist der Autor dieses Themas

Beiträge: 2 646

Registrierungsdatum: 5. Oktober 2004

Wohnort: München

Beruf: Pensionär

  • Nachricht senden

10

Mittwoch, 6. Juni 2018, 11:46

Hallo Timo,

also jetzt doch ohne tar?

Eigentlich ist das bei einer einzelnen Datei ja auch sinnvoll (wie ich schon oben schrieb). Ich hatte es allerdings so verstanden, als bräuchte das Admintool dieses "gzip in tar"-Format, um die Sicherung importieren zu können.

Man kann die Dumpfiles nicht nur mit dem Admintool, sondern auch mit MySQLAdmin importieren; das wusste ich anfangs nicht. Da habe ich erst mal die einfachere Methode gewählt. Tatsächlich musste ich noch nie eine MySQL-Dateri wiederherstellen, aber man weiß halt nicht.

Gruß, Anselm