Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Wiederherstellen von mysqldump

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Wiederherstellen von mysqldump

    Hallo,

    seit Stunden verusche ich bereits erfolglos eine Datenbank aus einer Datei wiederherzustellen, die ich zuvor mit mysqldump erzeugt habe.

    Kurze Skizze meines Projekts:

    Gehostet auf 1&1 mit professionellem Paket, aber kein dezidierter Server.
    Benutzer eines komplexen datenbankbasierten, mandantenfähigen PHP-Programms sollen die Möglichkeiten erhalten, per Knopfdruck ein Backup ihrer Datenbank zu erzeugen. Sie haben keinen Einfluss darauf, unter welchem Namen und wo dieses Backup gespeichert wird, sie sehen nur eine Liste der von Ihnen angelegten Backups. Die Backups werden vom Programm auf dem Server außerhalb des öffentlich zugängigen Bereichs gespeichert. Die Benutzer sollen nun ebenfalls durch Mausklick die Möglichkeit erhalten, ein gewünschtes Backup auszuwählen und wiederherzustellen, d.h. die Daten der aktuellen Datenbank komplett durch die gespeicherten Daten zu ersetzen.

    Das ist mein Ansatz:
    Über das Skript:

    PHP-Code:
    system(sprintf(
        
    'mysqldump --opt --hex-blob --complete-insert --extended-insert --quick --create-options -h%s -u%s -p"%s" %s | gzip > %s',
        
    $dbhost,
        
    $dbuser,
        
    $dbpass,
        
    $dbname,
        
    "path_and_filename.sql.gz"); 
    wird erfolgreich das Datenbank-Backup erzeugt. Das Backup ist valide. Ich kann die datei über phpmyadmin hochladen und die zuvor entleerte (nicht gelöschte - ich habe da keinen Zugriff bei 1&1!) Datenbank wieder mit gültigen und funktionsfähigen Daten füllen.

    Zur Wiedeherstellung war nach kurzer Internet-Recherche das folgende mein erster Versuch:

    PHP-Code:
    system(sprintf('gunzip < %s | mysql -u%s -p%s -h%s %s',
        
    "path_and_filename.sql.gz",
        
    $dbuser,
        
    $dbpass,
        
    $dbhost,
        
    $dbname
    )); 
    Das funktionierte nicht. Es gab zwar keine Fehlermeldung, aber es ist auch rein gar nichts passiert. Der return_value des PHP-Befehls system() enthielt allerdings den Wert '1'. Ich versuchte dann erstmal zu überprüfen, ob das Entpacken der gezippten Datei überhaupt funktionert. Das schaltete ich also vor:

    PHP-Code:
        system('gunzip path_and_filename.sql.gz > path_and_filename.sql'); 
    Das war erfolgreich. Die Datei wurde erzeugt und der return_value von system() war '0'.

    Aber weder 'mysql'...

    PHP-Code:
    system(sprintf('mysql -u%s -p%s -h%s %s < %s',
        
    $dbuser,
        
    $dbpass,
        
    $dbhost,
        
    $dbname,
        
    "path_and_filename.sql"
    )); 
    ...noch 'mysqlimport'...

    PHP-Code:
    system(sprintf('mysqlimport -u%s -p%s -h%s %s %s',
        
    $dbuser,
        
    $dbpass,
        
    $dbhost,
        
    $dbname,
        
    "path_and_filename.sql"
    )); 
    konnten die Daten wiederherstellen. Wieder passierte nichts und der return_value war '1'.

    Ich habe auch versucht die Datei zu öffnen, mit fread() einzulesen und den ganzen String als Query abzusenden, aber das gab einen Syntax-Fehler. Was merkwürdig ist, denn der Import der exakt gleichen Datei über phpmyadmin geht problemlos!! Ist aber auch nicht der Ansatz, den ich fahren will, denn einige der unkomprimierten Dump-Files sind bereits ca. 80 MB groß!. (Mein Testfile ist nur 800 KB groß!)

    Bin ich hier komplett auf dem Holzweg? Gibt es einen groben Fehler in meinen Überlegungen? Hat jemand Erfahrungen oder einen Tipp, der mir weiterhelfen könnte?

    Danke im Voraus...

    hbergman

  • #2
    Hi,

    scheint so, als ob ihr ähnlich ratlos seid, wie ich war... so gar keine Reaktion...

    Aber ich habe das Problem jetzt lösen können. Vielleicht ist die Lösung ja für den ein oder anderen hilfreich, sodass ich sie mal poste.

    Die Lösung war sehr simpel: ich benutze in den Datenbank-Passwörtern Sonderzeichen und habe das Passwort einfach in Anführungszeichen maskieren müssen... hat mich nur 3 Tage Kopfzerbrechen gekostet, bis ich auf diese simple Lösung gekommen bin.

    Sicherheitshalber habe ich das mit allen Parametern gemacht:

    PHP-Code:
    $res mysystem(sprintf(
        
    'mysql -u\'%s\' -p\'%s\' -h\'%s\' \'%s\' < \'%s\'',
        
    $dbuser,
        
    $dbpass,
        
    $dbhost,
        
    $dbname,
        
    'path_file.sql.gz'
    ),$stdout,$stderr); 
    Wer sich über die Funktion mysystem() wundert: ich wollte im Zuge der Lösungsfindung eine Ausgabe der Fehlermeldung der Systemkonsole bekommen. Das geht allein mit der Funktion system() nicht.

    Eine Internet-Recherche hat mich zu dieser Lösung geführt:

    PHP-Code:
    function mysystem($cmd, &$stdout=null, &$stderr=null){
        
    $proc proc_open($cmd,array(
            
    => array('pipe','w'),
            
    => array('pipe','w'),
        ),
    $pipes);
        
    $stdout stream_get_contents($pipes[1]);
        
    fclose($pipes[1]);
        
    $stderr stream_get_contents($pipes[2]);
        
    fclose($pipes[2]);
        return 
    proc_close($proc);

    Nähere Erläuterung unter diesem Link:
    http://stackoverflow.com/questions/2...err-after-exec

    Gruß

    hbergman

    Kommentar

    Lädt...
    X