Verwenden einer .php-Datei zum Generieren eines MySQL-Dumps

118

Hier sind die Informationen, die ich habe:

Ich arbeite mit einem Linux-basierten System mit MySQL und PHP5. Ich muss in der Lage sein, einen mysqldumpaus einer .php-Datei zu generieren und diesen Speicherauszug dann in einer Datei auf dem Server an einem von mir angegebenen Speicherort zu speichern.

Da ich ein PHP-Nooblet bin, möchte ich, dass mir jemand Unterstützung, Anleitung oder Code gibt, der das tut, was ich benötige. Dies müsste remote aus dem Internet ausgeführt werden.

Thomas Ward
quelle
2
Überprüfen Sie dies . Ich würde mysqldumpvon verwenden system().
Dave
Dieser hilft, mysqldump mit Hilfe einer PHP-Datei zu erstellen. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha
Verlassen Sie sich nicht auf exec () oder system (), da diese auf gemeinsam genutzten Hostings meistens deaktiviert sind. Answer sollte einen geeigneten Weg implementieren, um einen Datenbankspeicherauszug zu generieren, ohne externe Programme auszuführen.
Diego

Antworten:

159

Mit der exec()Funktion können Sie einen externen Befehl ausführen.

Hinweis: Zwischen shell_exec()und exec()würde ich die zweite auswählen, die die Ausgabe nicht an das PHP-Skript zurückgibt. Das PHP-Skript muss nicht den gesamten SQL-Speicherauszug als Zeichenfolge abrufen. Sie müssen ihn nur in eine Datei schreiben. und dies kann durch den Befehl selbst erfolgen.


Dieser externe Befehl wird:

  • ein Aufruf sein mysqldump, mit den richtigen Parametern,
  • und leiten Sie die Ausgabe in eine Datei um.

Zum Beispiel :

mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql


Was bedeutet, dass Ihr PHP-Code so aussehen würde:

exec('mysqldump --user=... --password=... --host=... DB_NAME > /path/to/output/file.sql');


Natürlich liegt es an Ihnen, die richtigen Verbindungsinformationen zu verwenden und diese ...durch diese zu ersetzen .

Pascal MARTIN
quelle
2
Ich werde mich in Kürze damit befassen. Gibt es eine Möglichkeit, eine Ausgabe auf der PHP-Seite zu generieren, wenn die Meldung "Dump abgeschlossen!" oder so?
Thomas Ward
6
exec()wird nicht zurückkehren, bis der Befehl beendet ist; Also, setzen Sie einfach einige echo "dump complete"nach dem Anrufexec()
Pascal MARTIN
7
Dies hat mir heute geholfen - und ein Hinweis für Benutzer von osx lion: Die Verknüpfung mysqldump wurde bei der Installation von mysql nicht für mich eingerichtet, daher musste ich sie finden - hier ist der Pfad:/usr/local/mysql/bin/mysqldump
totalNotLizards
4
Ihr Kommentar, jammypeach, hat mir das Leben gerettet. Bitte beachten Sie, dass any1 möglicherweise diesen kleinen Zusatz benötigt: '/ usr / local / mysql / bin / mysqldump -u ...'
helpse
1
Hinweis für Windows-Benutzer: In Windows müssen Sie den vollständigen Pfad zu mysqldump.exe angeben, z. B.exec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama
83

Wenn Sie ein Backup erstellen möchten, um es über den Browser herunterzuladen, können Sie dies auch ohne Verwendung einer Datei tun.

Die PHP-Funktion passthru () leitet die Ausgabe von mysqldump direkt an den Browser weiter. In diesem Beispiel wird es auch komprimiert.

Pro: Sie müssen sich nicht mit temporären Dateien befassen.

Con: Funktioniert nicht unter Windows. Kann Grenzen mit riesigen Datensätzen haben.

<?php

$DBUSER="user";
$DBPASSWD="password";
$DATABASE="user_db";

$filename = "backup-" . date("d-m-Y") . ".sql.gz";
$mime = "application/x-gzip";

header( "Content-Type: " . $mime );
header( 'Content-Disposition: attachment; filename="' . $filename . '"' );

$cmd = "mysqldump -u $DBUSER --password=$DBPASSWD $DATABASE | gzip --best";   

passthru( $cmd );

exit(0);
?>
MajorLeo
quelle
25

Schauen Sie hier: https://github.com/ifsnop/mysqldump-php ! Es ist eine native Lösung in PHP geschrieben.

Sie können es mit Composer installieren und es ist so einfach wie:

<?php

use Ifsnop\Mysqldump as IMysqldump;

try {
    $dump = new IMysqldump\Mysqldump('database', 'username', 'password');
    $dump->start('storage/work/dump.sql');
} catch (\Exception $e) {
    echo 'mysqldump-php error: ' . $e->getMessage();
}

?>

Es unterstützt fortgeschrittene Benutzer mit vielen Optionen, die vom ursprünglichen mysqldump kopiert wurden.

Alle Optionen werden auf der Github-Seite erklärt, sind jedoch mehr oder weniger automatisch erklärend:

$dumpSettingsDefault = array(
    'include-tables' => array(),
    'exclude-tables' => array(),
    'compress' => 'None',
    'no-data' => false,
    'add-drop-database' => false,
    'add-drop-table' => false,
    'single-transaction' => true,
    'lock-tables' => false,
    'add-locks' => true,
    'extended-insert' => true,
    'disable-foreign-keys-check' => false,
    'where' => '',
    'no-create-info' => false
);
Diego
quelle
2
Selbst auf Servern, die aus Sicherheitsgründen deaktiviert execund / oder shell_execdeaktiviert wurden, funktioniert mysqldump-php hervorragend! Habe es gerade auf Umblers Servern versucht und den Dump erfolgreich erhalten. Vielen Dank für den Tipp!
Giovannipds
Dies ist perfekt für Server, auf denen auch keine MySQL-Shell-Befehle verfügbar sind!
Andrej
9

Bitte verweisen Sie auf den folgenden Link, der ein Skript enthält, das Ihnen helfen wird: http://davidwalsh.name/backup-mysql-database-php

Hinweis: Dieses Skript enthält möglicherweise Fehler mit NULL-Datentypen

André Puel
quelle
Vielen Dank, dies ist ein praktischer Plan B, wenn "shell_exec () aus Sicherheitsgründen deaktiviert wurde" (los geht's, Google)
Deebster
1
Beachten Sie, dass hierfür veraltete mysql-Befehle anstelle von mysqli verwendet werden.
Pascal Raszyk
"Fehler mit NULL-Datentypen" klingt nach einem Problem für eine Sicherungslösung.
Alexis
7

Aus Sicherheitsgründen wird empfohlen, das Kennwort in einer Konfigurationsdatei und nicht im Befehl anzugeben (ein Benutzer kann ein ps aux | grep mysqldumpKennwort ausführen und das Kennwort anzeigen).

//create a temporary file
$file   = tempnam(sys_get_temp_dir(), 'mysqldump');

//store the configuration options
file_put_contents($file, "[mysqldump]
user={$user}
password=\"{$password}\"");

//execute the command and output the result
passthru("mysqldump --defaults-file=$file {$dbname}");

//delete the temporary file
unlink($file);
Constantin Galbenu
quelle
5

Hier finden Sie eine umfassende Lösung zum Speichern von MySQL-Strukturen und -Daten wie in PMA (und ohne Verwendung von exec, passthru usw.):

https://github.com/antarasi/MySQL-Dump-with-Foreign-keys

Es ist eine Abzweigung des dszymczuk-Projekts mit meinen Verbesserungen.

Die Verwendung ist einfach

<?php
//MySQL connection parameters
$dbhost = 'localhost';
$dbuser = 'dbuser';
$dbpsw = 'pass';
$dbname = 'dbname';

//Connects to mysql server
$connessione = @mysql_connect($dbhost,$dbuser,$dbpsw);

//Set encoding
mysql_query("SET CHARSET utf8");
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'");

//Includes class
require_once('FKMySQLDump.php');


//Creates a new instance of FKMySQLDump: it exports without compress and base-16 file
$dumper = new FKMySQLDump($dbname,'fk_dump.sql',false,false);

$params = array(
    //'skip_structure' => TRUE,
    //'skip_data' => TRUE,
);

//Make dump
$dumper->doFKDump($params);

?>

klappt wunderbar :-)

ANTARA
quelle
Es funktioniert - aber es erzeugt eine andere Ausgabe als der PHPMYADMIN mysqldump. Warum ? Es fehlen Daten, während meine PHPMYADMIN-Sicherung abgeschlossen ist.
Ledawg
@ Ledew-de: Daten sollten nicht nur in den Speicherauszug aufgenommen werden, wenn die Option skip_data => true als Parameter übergeben wird
ANTARA
3

Solange Sie exec () verwenden dürfen , können Sie Shell-Befehle über Ihren PHP-Code ausführen.

Angenommen, Sie wissen, wie man den mysqldump in die Befehlszeile schreibt, d. H.

mysqldump -u [username] -p [database] > [database].sql

Dann können Sie dies als Parameter für die Funktion exec () verwenden.

exec("mysqldump -u mysqluser -p my_database > my_database_dump.sql");
charliefortune
quelle
3

Die Antwort von MajorLeo weist mich in die richtige Richtung, aber es hat bei mir nicht funktioniert. Ich habe diese Seite gefunden , die dem gleichen Ansatz folgt und funktioniert hat.

$dir = "path/to/file/";
$filename = "backup" . date("YmdHis") . ".sql.gz";

$db_host = "host";
$db_username = "username";
$db_password = "password";
$db_database = "database";

$cmd = "mysqldump -h {$db_host} -u {$db_username} --password={$db_password} {$db_database} | gzip > {$dir}{$filename}";
exec($cmd);

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$filename\"");

passthru("cat {$dir}{$filename}");

Ich hoffe es hilft jemand anderem!

Matías Cánepa
quelle
Ihre hier gibt die Ausgabe an den Endbenutzer zurück, nicht wahr? IE gibt es bei der Ausführung auf eine Weise aus, die Sie kopieren / einfügen können? Wenn ja, würde dies nicht das erreichen, was die akzeptierte Antwort bewirkt hat - erstellt einfach die Datei auf dem Server, damit ich sie von scp abrufen kann.
Thomas Ward
@ ThomasW. Dieser Code führt zwei Aktionen aus: Er generiert eine auf dem Server gespeicherte Datei und ruft den Download-Dialog auf. Wenn Sie nur die Datei speichern möchten, führen Sie nicht den Teil header () und passthru () aus. Und wenn Sie nur den Speicherort der Datei benötigen, können Sie jederzeit die Variablen $ dir & $
filename wiedergeben. Unabhängig von
0

<?php exec('mysqldump --all-databases > /your/path/to/test.sql'); ?>

Sie können den Befehl mit allen Optionen erweitern, die mysqldump natürlich verwendet. Verwenden Sie man mysqldumpfür mehr Optionen (aber ich denke, Sie wussten das;))

Rem.co
quelle
0

global $wpdb;
$export_posts = $wpdb->prefix . 'export_posts';
$backupFile = $_GET['targetDir'].'export-gallery.sql';
$dbhost=DB_HOST;
$dbuser=DB_USER;
$dbpass=DB_PASSWORD;
$db=DB_NAME;
$path_to_mysqldump = "D:\xampp_5.6\mysql\bin";
$query= "D:\\xampp_5.6\mysql\bin\mysqldump.exe -u$dbuser -p$dbpass $db $export_posts> $backupFile";
exec($query);
echo $query;

Fuad Hasan
quelle
0

Keiner der oben genannten Codes hat bei mir funktioniert. Ich benutze Windows. Der folgende Code hat für mich funktioniert ...

$sql = "SELECT * FROM  $tableName WHERE yourclause";
$result = $conn->query($sql);


if($result){

        if ($result->num_rows > 0) {

            $myfile = fopen("daily_events_$district.sql", "w") or die("Unable to open file!");

            while($row = $result->fetch_assoc()) {  

                $rowToString = implode("','",$row);
                $writeToFile = "INSERT INTO $tableName VALUES('$rowToString');". PHP_EOL;
                fwrite($myfile,$writeToFile);
            }
            echo "File saved successfully";
        }
    } else {
        echo "No result found";
    }

Dadurch wird die Datei in Ihrem Projektordner entsprechend Ihrer Abfrage gespeichert, unabhängig von den gewünschten Daten.

Swarnim Dixit
quelle
Diese Lösung ist im Wesentlichen fehlerhaft, da sie falsche SQL-Zeichenfolgen erstellt
Your Common Sense
-1

Um die Datenbank mit shell_exec () zu sichern, gehen Sie wie folgt vor:

shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');
Digisha
quelle
-2
<?php
    $toDay = date('d-m-Y');

    $dbhost =   "localhost";
    $dbuser =   "YOUR DB USER";
    $dbpass =   "USER PASSWORD";
    $dbname =   "DB NAME";

    exec("mysqldump --user=$dbuser --password='$dbpass' --host=$dbhost $dbname > /home/....../public_html/".$toDay."_DB.sql");


?>
PradeepJangid
quelle