Postgres-backup-Daten mit PHP
Ich versuche, backup-Datenbank mit PHP-Skript. Meine Idee war, laufen die pg_dump mit PHP eine batch-Datei. (Ja, ich bin mit PHP für Windows).
Schreibe ich diesen code:
$content = "set BACKUP_FILE=database.backup \r\n" .
"SET PGPASSWORD=" . COF_DATABASE_PASSWORD . "\r\n" .
"pg_dump -i -U " . COF_DATABASE_USERNAME . " -F c -b -v -f %BACKUP_FILE% " . COF_DATABASE_NAME . "\r\n" .
"echo done";
file_put_contents($root . "/Files/Updates/Backup.bat", $content);
$system = exec ($root . "/Files/Updates/Backup.bat", $result);
pclose(popen("start /B $root/Files/Updates/Backup.bat", "r"));
$result = shell_exec($root . "/Files/Updates/Backup.bat");
Backup.dat-Datei erstellt wird. Wenn ich es manuell ausführen von windows, die Datenbank.backup-Datei erstellt wird, aber nicht, wenn ich versuche, führen Sie die batch von PHP.
Für beide Befehl, den ich bekommen in $Ergebnis:
(string:241) D:\Data\WWW...\Process>set BACKUP_FILE= - Datenbank.backup
D:\Data\WWW...\Process>SET PGPASSWORD=dom123
D:\Data\WWW...\Process>pg_dump -i-U dom -F-c -b -v -f
Datenbank.backup-dom
Einmal als array (exec) und einmal als string (shell_exec).
Dann dachte ich, dass das ausführen von bat-Datei (selbst wenn ich im code und dann löschen) ist nicht die hellste Idee (Sicherheit). Also habe ich versucht ein backup der Datenbank mit SQL-s (PDO - execute ...)
Aber ich finde keine Dokumentation, wenn dies überhaupt möglich ist. Alle Lösungen vorzuschlagen pg_dump. Gibt es irgendein SQL-Befehl, um backup gesamte Datenbank in die Datei?
Ich bin auf der Suche nach einer funktionierenden Lösung. SQL-oder .Fledermaus, nicht die Sache an dieser Stelle.
Bearbeitet:
Versuchen Sie auch:
$string = "export PGPASSWORD=" . COF_DATABASE_PASSWORD . " && export PGUSER=" . COF_DATABASE_USERNAME . " && pg_dump -h localhost db_name " . COF_DATABASE_NAME . " > " . $root . "Files/Updates/Backup.sql && unset PGPASSWORD && unset PGUSER";
exec($string);
shell_exec($string);
Bearbeitet (Antwort auf Craig Ringer):
Versuchen, Ihren code, bekomme ich Fehler.
1: Catch-all für die Allgemeinen Fehler von auf dieser Seite
Bild für open link in new tab, um volle Größe.
- Ich bin kein PHP-Mann, aber ich verstehe nicht, was die Verwendung von PHP ist, geben Sie hier. Warum nicht einfach eine batch-Datei ausführen, die pg_* Befehle? Sie scheinen ziemlich statisch, so dass die Ebene der Dereferenzierung mit PHP scheint nicht notwendig (und, wie man erfährt, fehleranfällig).
- Hampson: ich bin Aktualisierung der Website mit PHP und bevor ich das Tue, will ich die backup-Dateien zu zip (FERTIG) und die backup-Datenbank. Nur für den Fall. Ich nenne update auf der Seite, dann von der ajax-request aufrufen einer anderen Seite: pclose(popen("start /B ". "php d:\WWW\Update.php", "r")); Hexe Prozess der Aktualisierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Es wäre schön, aber gibt es nicht.
Nicht mit einer batch-Datei. Stattdessen setzen von Umgebungsvariablen in Ihrem lokalen Prozess und dann CreateProcess
pg_dump
direkt oder verwenden Sie eine.pgpass
- Datei, diepgpass.conf
auf Windows.Direkte Ausführung
Anstatt über eine batch-Datei ausführen pg_dump direkt nach der Einstellung der Umwelt.
Wird dies schwieriger, denn PHP ist schrecklich, es fehlt alles, was sane wie
execv
zu exec mit einer Reihe von Argumenten. Sie sollte in der Lage, nur:aber PHP nicht nehmen, ein array für
exec
ist und nichtexecv
. So haben Sie munge es in einen shell-Befehl, der sich mit der Flucht selbst.Nicht einmal
proc_open
dies unterstützt.Statt Sie manuell zu entkommen Argumente, z.B.:
Wenn Sie mit einer zivilisierten Sprache, die Sie verwenden könnten eine der sicheren alternativen direkt, z.B.
execve
/CreateProcessEx
(C)subprocess.check_call
(Python),Kernel.exec
mit einem array-argument (Ruby), etc.Pgpass
Können Sie die append-Zeilen der Benutzer
pgpass.conf
- Datei, oder verlangen, dass Sie vorkonfiguriert werden. Dannpg_dump
finden das login automatisch.Müssen Sie noch auf Fehler überprüfen.
Batch-Datei
Wenn Sie müssen, verwenden Sie eine batch-Datei, müssen Sie zum umleiten von stderr zu stdout (da bist du wohl nicht die Erfassung) und auch testen Sie die
%ERRORLEVEL%
exit, so dass Sie einen Fehler erkennen, derpg_dump
. z.B.dann müssen Sie prüfen, den return-code.
shell_exec
nicht geben Ihnen Zugang zu diesem, es erzeugt nur die Ausgabe von text, wie gezeigt, durch die "Hinweis" - block. So sollten Sie verwendenexec
.Ich spreche nicht über die Windows-Batch-Datei auch, und würde persönlich diese mit der direkten Ausführung von
pg_dump
. Aber dann bin ich nicht PHP die Wahl gegeben, entweder.exec
mit einer Reihe von Parametern, zusammengefasst in einem einzigen Befehl. Es erscheint keine Ausgabe erzeugen. Versuchen Sie, diese zusätzlichen argument, auf das array:2>&1
. Was dies bedeutet ist sagen die Schale (cmd.exe
) "senden" standard error "auf der standard-Ausgabe", also PHP kann es sehen, weil Sie nicht wissen, wie capture stderr. Dann re-run.pg_dump
wahrscheinlich nicht auf diePATH
. Versuchen Sie explizite Pfad - stattpg_dump
schreiben (mit änderungen, die für die Installation Speicherort und version)%PROGRAMFILES%\PostgreSQL\9.3\bin\pg_dump.exe
. (Oder versuchen"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe
im Falle env var expansion ist ein problem)Können Sie versuchen, mit dem folgenden Befehl. Ich habe auch das gleiche problem. Ich fest, dass durch die Verwendung von angefügten code: