web-dev-qa-db-fra.com

Utiliser un fichier .php pour générer un dump MySQL

Voici les informations que j'ai:

Je travaille avec un système Linux utilisant MySQL et PHP5. Je dois pouvoir générer un mysqldump à partir d'un fichier .php, puis faire en sorte que ce cliché soit stocké dans un fichier sur le serveur, à un emplacement que je spécifierais.

En tant que PHP nooblet, j'aimerais que quelqu'un me donne de l'aide, des conseils ou du code, qui ferait ce dont j'ai besoin. Cela devrait être exécuté à distance à partir d'Internet.

114
Thomas Ward

Vous pouvez utiliser la fonction exec() pour exécuter une commande externe.

Remarque: entre Shell_exec() et exec(), je choisirais le second, qui ne renvoie pas la sortie au script PHP - inutile d'utiliser le script PHP pour obtenir l'intégralité du code SQL. dump en tant que chaîne: vous avez seulement besoin de l'écrire dans un fichier, et cela peut être fait par la commande elle-même.


Cette commande externe:

  • être un appel à mysqldump, avec les bons paramètres,
  • et redirigez la sortie vers un fichier.

Par exemple :

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


Ce qui signifie que votre code PHP devrait ressembler à ceci:

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


Bien sûr, c'est à vous d'utiliser les bonnes informations de connexion, en remplaçant le ... par celles-ci.

150
Pascal MARTIN

Si vous souhaitez créer une sauvegarde pour la télécharger via le navigateur, vous pouvez également le faire sans utiliser de fichier.

La fonction php passthru () redirigera directement la sortie de mysqldump vers le navigateur. Dans cet exemple, il sera également compressé.

Pro: Vous n'avez pas à traiter avec des fichiers temporaires.

Con: Ne fonctionnera pas sur Windows. Peut avoir des limites avec d'énormes jeux de données.

<?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);
?>
74
MajorLeo

Jetez un coup d'œil ici: https://github.com/ifsnop/mysqldump-php ! C'est une solution native écrite en php.

Vous pouvez l'installer en utilisant composer, et c'est aussi simple que faire:

<?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();
}

?>

Il supporte les utilisateurs avancés, avec de nombreuses options copiées à partir du mysqldump original.

Toutes les options sont expliquées sur la page github, mais plus ou moins sont auto-explicatives:

$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
);
22
diego

Merci de vous référer au lien suivant qui contient un scriptlet qui vous aidera: http://davidwalsh.name/backup-mysql-database-php

Remarque: Ce script peut contenir des bogues avec des types de données NULL

10
André Puel

Pour des raisons de sécurité, il est recommandé de spécifier le mot de passe dans un fichier de configuration et non dans la commande (un utilisateur peut exécuter un ps aux | grep mysqldump et voir le mot de passe).

//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);
7
Constantin Galbenu

Ici vous pouvez trouver une solution complète pour vider la structure et les données de mysql comme dans PMA (et sans utiliser exec, passthru, etc.):

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

Il est fork du projet dszymczuk avec mes améliorations.

L'utilisation est simple

<?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);

?>

fonctionne comme un charme :-)

5
ANTARA

Tant que vous êtes autorisé à utiliser exec () , vous pouvez exécuter des commandes Shell via votre code PHP.

Donc, en supposant que vous sachiez écrire mysqldump en ligne de commande, c.-à-d.

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

alors vous pouvez l'utiliser comme paramètre pour la fonction exec ().

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

La réponse de MajorLeo m'indique dans la bonne direction mais cela n'a pas fonctionné pour moi. J'ai trouvé ce site qui suit la même approche et a fonctionné.

$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}");

J'espère que ça aide quelqu'un d'autre!

3
Matías Cánepa

Aucun des codes ci-dessus n'a fonctionné pour moi. J'utilise des fenêtres. Le code ci-dessous a fonctionné pour moi ...

$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";
    }

Cela enregistre le fichier dans votre dossier de projet en fonction de votre requête, quelles que soient les données que vous souhaitez. Si vous souhaitez vider une base de données ou une table entière, vous pouvez utiliser ce lien http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/using-php-to-backup-mysql-databases .aspx

1
swarnim dixit

Pour vider la base de données à l'aide de Shell_exec (), voici la méthode:

Shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');
0
Digisha
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;
0
Fuad Hasan

Eh bien, vous pouvez toujours utiliser l'appel de fonction système de PHP.

http://php.net/manual/en/function.system.php

http://www.php.net/manual/en/function.exec.php

Cela exécute n'importe quel programme en ligne de commande depuis PHP.

0
jazztickets

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

Vous pouvez étendre la commande avec toutes les options que mysqldump prend bien sûr. Utilisez man mysqldump pour plus d'options (mais je suppose que vous le saviez;))

0
Rem.co

Voici une autre option native basée sur PHP: https://github.com/2createStudio/shuttle-export

0
Emil M