Usando un archivo .php para generar un volcado de MySQL

118

Aquí está la información que tengo:

Estoy trabajando con un sistema basado en Linux usando MySQL y PHP5. Necesito poder generar un mysqldumparchivo desde dentro de un archivo .php, y luego hacer que ese volcado se almacene en un archivo en el servidor en una ubicación que yo especifique.

Como soy un nooblet de PHP, me gustaría que alguien me brindara ayuda, orientación o código, que haría lo que necesito. Esto tendría que ejecutarse de forma remota desde Internet.

Thomas Ward
fuente
2
Compruebe esto . Yo usaría mysqldumppor system().
Dave
Este ayuda a crear mysqldump con ayuda de un archivo php. kvcodes.com/2017/10/php-create-mysql-backup
Kvvaradha
No confíe en exec () o system (), porque la mayoría de las veces están deshabilitados en alojamientos compartidos. Answer debería implementar una forma adecuada de generar un volcado de base de datos sin ejecutar programas externos.
diego

Respuestas:

159

Puede utilizar la exec()función para ejecutar un comando externo.

Nota: entre shell_exec()y exec(), elegiría el segundo, que no devuelve la salida al script PHP; no es necesario que el script PHP obtenga todo el volcado SQL como una cadena: solo lo necesita escrito en un archivo, y esto lo puede hacer el propio comando.


Ese comando externo:

  • ser una llamada a mysqldump, con los parámetros adecuados,
  • y redirigir la salida a un archivo.

Por ejemplo :

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


Lo que significa que su código PHP se vería así:

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


Por supuesto, depende de usted usar la información de conexión correcta, reemplazándola ...por esa.

Pascal MARTIN
fuente
2
Lo intentaré en breve. ¿Hay alguna forma de generar resultados en la página PHP cuando se ha completado diciendo "Volcado completo!" ¿o algo?
Thomas Ward
6
exec()no regresará hasta que finalice el comando; entonces, solo ponga algunos echo "dump complete"después de llamarexec()
Pascal MARTIN
7
Esto me ayudó hoy, y una nota para los usuarios de osx lion: el acceso directo de mysqldump no estaba configurado para mí cuando instalé mysql, así que tuve que encontrarlo, aquí está la ruta:/usr/local/mysql/bin/mysqldump
totalmenteNotLizards
4
Tu comentario, Jammypeach, me salvó la vida. Tenga en cuenta que any1 podría necesitar esta pequeña adición: '/ usr / local / mysql / bin / mysqldump -u ...'
helpse
1
Nota para los usuarios de Windows: en Windows debe especificar la ruta completa a mysqldump.exe, por ejemploexec("C:/pathto/mysql/bin/mysqldump.exe <options as above>");
pogosama
83

Si desea crear una copia de seguridad para descargarla a través del navegador, también puede hacerlo sin usar un archivo.

La función php passthru () redirigirá directamente la salida de mysqldump al navegador. En este ejemplo, también estará comprimido.

Ventaja: no tienes que lidiar con archivos temporales.

Con: no funcionará en Windows. Puede tener límites con grandes conjuntos de datos.

<?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
fuente
25

Eche un vistazo aquí: https://github.com/ifsnop/mysqldump-php ! Es una solución nativa escrita en php.

Puede instalarlo usando Composer, y es tan fácil como hacerlo:

<?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 compatible con usuarios avanzados, con muchas opciones copiadas del mysqldump original.

Todas las opciones se explican en la página de github, pero más o menos son autoexplicativas:

$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
fuente
2
Incluso en servidores que tienen execy / o están shell_execdeshabilitados por seguridad, mysqldump-php funciona muy bien. Lo intenté ahora mismo en los servidores de Umbler y obtuve el volcado con éxito. ¡Muchas gracias por el consejo!
giovannipds
¡esto es perfecto para servidores que no tienen comandos de shell mysql disponibles también!
Andrej
9

Consulte el siguiente enlace que contiene un scriptlet que lo ayudará: http://davidwalsh.name/backup-mysql-database-php

Nota: este script puede contener errores con tipos de datos NULL

André Puel
fuente
Gracias, este es un plan B útil si "shell_exec () ha sido deshabilitado por razones de seguridad" (ahí tienes, Google)
Deebster
1
Tenga en cuenta que esto usa comandos mysql obsoletos en lugar de mysqli.
Pascal Raszyk
"Errores con tipos de datos NULL" suena como un problema para una solución de respaldo.
Alexis
7

Por razones de seguridad, se recomienda especificar la contraseña en un archivo de configuración y no en el comando (un usuario puede ejecutar un ps aux | grep mysqldumpy ver la contraseña).

//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
fuente
5

Aquí puede encontrar una solución integral para volcar la estructura y los datos de mysql como en PMA (y sin usar exec, passthru, etc.):

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

Es una bifurcación del proyecto dszymczuk con mis mejoras.

El uso es 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);

?>

Funciona de maravilla :-)

ANTARA
fuente
Funciona, pero produce una salida diferente a PHPMYADMIN mysqldump. Por qué ? Faltan datos, mientras que mi copia de seguridad PHPMYADMIN está completa.
ledawg
@ Ledew-de: Los datos no deben incluirse en el volcado solo si la opción skip_data => true se pasa como parámetro
ANTARA
3

Siempre que se le permita usar exec () , puede ejecutar comandos de shell a través de su código PHP.

Entonces, suponiendo que sepa cómo escribir mysqldump en la línea de comando, es decir

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

entonces puede usar esto como parámetro para la función exec ().

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

La respuesta de MajorLeo me indicó la dirección correcta, pero no funcionó para mí. Encontré este sitio que sigue el mismo enfoque y funcionó.

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

¡Espero que ayude a alguien más!

Matías Cánepa
fuente
El suyo aquí devuelve la salida al usuario final, ¿no es así? IE, al ejecutarse, lo genera de una manera que podría copiar / pegar. Si es así, esto no lograría lo que hizo la respuesta aceptada: simplemente crea el archivo en el servidor para que pueda tomarlo por scp.
Thomas Ward
@ThomasW. Este código hace dos cosas: genera un archivo guardado en el servidor y solicita el diálogo de descarga. Si solo desea almacenar el archivo, no haga la parte de encabezado () y passthru (). Y si necesita solo la ubicación del archivo, siempre puede hacer eco de las variables $ dir & $ filename .... No importa lo que elija, aún puede acceder al archivo a través de SCP
Matías Cánepa
0

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

Puede extender el comando con cualquier opción que mysqldump tome por supuesto. Úsalo man mysqldumppara más opciones (pero supongo que lo sabías;))

Rem.co
fuente
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
fuente
0

Ninguno de los códigos anteriores funcionó para mí. Estoy usando windows. El siguiente código funcionó para mí ...

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

Esto guardará el archivo en la carpeta de su proyecto de acuerdo con su consulta, los datos que desee.

Swarnim Dixit
fuente
Esta solución es esencialmente defectuosa, ya que crea cadenas SQL incorrectas
Your Common Sense
-1

Para volcar la base de datos usando shell_exec (), a continuación se muestra el método:

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