Solución:
Puedes usar el 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 puede ser hecho por 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, reemplazando el ...
Con ésos.
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 pasar a través de() 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);
?>
¡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 IfsnopMysqldump as IMysqldump;
try {
$dump = new IMysqldumpMysqldump('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
);