Utilizzo di un file .php per generare un dump MySQL


118

Ecco le informazioni che ho:

Sto lavorando con un sistema basato su Linux utilizzando MySQL e PHP5. Devo essere in grado di generare un file mysqldumpda un file .php, quindi memorizzare quel dump in un file sul server in una posizione che vorrei specificare.

Dato che sono un nooblet PHP, vorrei che qualcuno mi desse assistenza, guida o codice, che farebbe ciò di cui ho bisogno. Questo dovrebbe essere eseguito in remoto da Internet.


2
Controlla questo . Userei mysqldumpda system().
dave


Questo aiuta a creare mysqldump con l'aiuto di un file php. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha

Non fare affidamento su exec () o system (), perché la maggior parte delle volte sono disabilitati sugli host condivisi. La risposta dovrebbe implementare un modo corretto per generare un dump del database senza eseguire programmi esterni.
diego

Risposte:


159

È possibile utilizzare la exec()funzione per eseguire un comando esterno.

Nota: tra shell_exec()e exec(), sceglierei il secondo, che non restituisce l'output allo script PHP - non è necessario che lo script PHP ottenga l'intero dump SQL come stringa: è sufficiente che sia scritto in un file, e questo può essere fatto dal comando stesso.


Quel comando esterno:

  • essere una chiamata a mysqldump, con i giusti parametri,
  • e reindirizza l'output a un file.

Per esempio :

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


Il che significa che il tuo codice PHP sarebbe simile a questo:

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


Naturalmente, sta a te utilizzare le giuste informazioni di connessione, sostituendo le ...con quelle.


2
Ci proverò a breve. C'è un modo per generare l'output sulla pagina PHP quando ha completato dicendo "Dump completato!" o qualcosa?
Thomas Ward

6
exec()non tornerà fino al termine del comando; quindi, mettine un po ' echo "dump complete"dopo aver chiamatoexec()
Pascal MARTIN

7
Questo mi ha aiutato oggi - e una nota per gli utenti di osx lion: il collegamento a mysqldump non è stato impostato per me quando ho installato mysql, quindi ho dovuto trovarlo - ecco il percorso:/usr/local/mysql/bin/mysqldump
totalmenteNotLizards

4
Il tuo commento, jammypeach, mi ha salvato la vita. Si prega di notare che any1 potrebbe aver bisogno di questa piccola aggiunta: "/ usr / local / mysql / bin / mysqldump -u ..."
helpse

1
Nota per utenti Windows: in Windows è necessario specificare il percorso completo di mysqldump.exe, ad esempioexec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama

83

Se desideri creare un backup per scaricarlo tramite il browser, puoi farlo anche senza utilizzare un file.

La funzione php passthru () reindirizzerà direttamente l'output di mysqldump al browser. In questo esempio verrà anche zippato.

Pro: non devi occuparti dei file temporanei.

Contro: non funziona su Windows. Può avere limiti con enormi set di dati.

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

25

Dai un'occhiata qui: https://github.com/ifsnop/mysqldump-php ! È una soluzione nativa scritta in php.

Puoi installarlo usando il compositore ed è facile come farlo:

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

?>

Supporta utenti avanzati, con molte opzioni copiate dal mysqldump originale.

Tutte le opzioni sono spiegate nella pagina github, ma più o meno sono autoesplicative:

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

2
Anche su server che hanno exece / o shell_execdisabilitati dalla sicurezza, mysqldump-php funziona alla grande! Ho appena provato in questo momento sui server di Umbler e ho ottenuto il dump con successo. Grazie mille per il suggerimento!
giovannipds

questo è perfetto per i server che non hanno anche i comandi della shell mysql disponibili!
Andrej

9

Fare riferimento al seguente collegamento che contiene uno scriptlet che ti aiuterà: http://davidwalsh.name/backup-mysql-database-php

Nota: questo script potrebbe contenere bug con tipi di dati NULL


Grazie, questo è un comodo piano B se "shell_exec () è stato disabilitato per motivi di sicurezza" (ecco fatto, Google)
Deebster

1
Nota che questo utilizza comandi mysql deprecati invece di mysqli.
Pascal Raszyk

"Bug con tipi di dati NULL" sembra un problema per una soluzione di backup.
alexis

7

Per motivi di sicurezza, si consiglia di specificare la password in un file di configurazione e non nel comando (un utente può eseguire un ps aux | grep mysqldumpe vedere la password).

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

5

Qui puoi trovare una soluzione completa per eseguire il dump della struttura e dei dati di mysql come in PMA (e senza usare exec, passthru ecc.):

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

È il fork del progetto dszymczuk con i miei miglioramenti.

L'utilizzo è semplice

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

?>

funziona come un fascino :-)


Funziona, ma produce un output diverso dal mysqldump di PHPMYADMIN. Perché ? Mancano dei dati, mentre il backup di PHPMYADMIN è completo.
ledawg

@ Ledew-de: i dati non devono essere inclusi nel dump solo se l'opzione skip_data => true viene passata come parametro
ANTARA

3

Finché ti è permesso usare exec () , puoi eseguire comandi della shell tramite il tuo codice PHP.

Quindi supponendo che tu sappia come scrivere mysqldump nella riga di comando, ad es

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

quindi puoi usarlo come parametro per la funzione exec ().

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

3

La risposta di Major Leo mi ha indirizzato nella giusta direzione ma non ha funzionato per me. Ho trovato questo sito che segue lo stesso approccio e ha funzionato.

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

Spero che aiuti qualcun altro!


Il tuo qui restituisce l'output all'utente finale, vero? IE al momento dell'esecuzione lo restituisce in un modo che potresti copiare / incollare? In tal caso, ciò non otterrebbe ciò che ha fatto la risposta accettata: crea semplicemente il file sul server in modo da poterlo afferrare da scp.
Thomas Ward

@ThomasW. Questo codice fa due cose: genera un file salvato sul server e richiede la finestra di dialogo di download. Se vuoi solo memorizzare il file, non fare la parte header () e passthru (). E se hai bisogno solo della posizione del file, puoi sempre echeggiare le variabili $ dir e $ filename .... Indipendentemente da ciò che scegli, puoi comunque accedere al file tramite SCP
Matías Cánepa


0

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

Puoi estendere il comando con qualsiasi opzione che mysqldump prende ofcourse. Usa man mysqldumpper più opzioni (ma immagino che tu lo sapessi;))



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;


0

Nessuno dei codici di cui sopra ha funzionato per me. Sto usando Windows. Sotto il codice ha funzionato per me ...

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

Questo salverà il file nella cartella del progetto in base alla tua query, qualunque dato tu voglia.


Questa soluzione è essenzialmente difettosa, in quanto crea stringhe SQL errate
Il tuo senso comune

-1

Per eseguire il dump del database utilizzando shell_exec (), di seguito è riportato il metodo:

shell_exec('mysqldump -h localhost -u username -ppassword databasename  | gzip > dbname.sql.gz');

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


?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.