LeeMiBlog

 


Web sobre Informática, Internet y Nuevas Tecnologias.

Un lugar en el que podrás encontrar articulos, noticias, tutoriales, trucos, ayudas, etc...

Inicio   Categorias   Contactar   Politica de Privacidad
Hacer BackUp de MySql desde un Script en PHP
Escrito por Manu   
Lunes, 21 de Enero de 2008 23:00

my SQL   Hoy he visto publicado en fosswire un artículo desde en el que se presenta un script en PHP para hacer copias de seguridad de nuestra base de datos de MySQL, de manera remota, a través del navegador. Así que me he decidido a traducirlo para aquellos que no dominen el inglés suficientemente. Para los que si, pues podeis dirigiros a la web de su autor en inglés.

Enlace:   fosswire

   ¿ Por qué podrías necesitar este script ? Bien, el backup en remoto desde un navegador web podría ser muy útil, ya que podrás realizar las copias desde cualquier ordenador que tenga navegador web, desde el que no tengas la posibilidad o no quieras conectarte via SSH.

   En primer lugar, quiero señalar algo importante. Este ejemplo no tiene autentificación. Lo cual significa que cualquiera que acceda a través de este script puede realizar un backup de tu base de datos MySQL si conocen una clave correcta, o podrían intentar entrar. Os recomiendo que restrinjais el acceso al script que vamos a escribir, usando algún formulario de autentificación, o bien a través de .htpasswd o  similar, o construyendo un sistema de login propio sobre este script.

Algunas observaciones más:

  •  Este script es básico. No está diseñado para ser lo mejor de lo mejor, y es sólo un punto de partida para tu propio script. Úsalo con cuidado.
  • Necesita un directorio que sea escribible por el servidor web para almacenar los ficheros. Y debería estar fuera del directorio raíz de la web. Para que sea imposible que cualquiera se baje tu base de datos con su navegador.
  • Cualquier error que ocurra en el proceso mysqldump se devolverá directamente al navegador. Hacer esto de una manera más elegante está fuera del ámbito de este script.
  • Es feo, pero hacerlo bonito no es mi trabajo, o mi fuerte. ;)
  • Está diseñado para servidores en los que MySQL corre en localhost (ej. la misma máquina que el servidor web). Aunque puede ser facilmente adaptado, tan solo cambiando el comando mysqldump.
  • El programa mysqldump debe estar en el PATH, o sino se debe suministrar el path completo en $command.
<?php
 
// Añade tu codigo de autentificación aquí, etc.
  
// ¿ Donde se almacena la copia? Debe ser escribible por el servidor web
// y estar fuera del directorio raiz de la web, para que nadie pueda
//
bajarse tu BD desde su navegador
define('BACKUPDIR', '/var/www/privatedata/');
 
// para crear enlaces a esta pagina ( accion del formulario, etc.)
define('THISPAGE', $_SERVER['PHP_SELF']);
 
/**** ALGUNAS FUNCIONES ****/
function doHeader($title) {
  // crea una encabezado de página sencillo.
  ?><html><head><title>
<?php echo $title;?></title></head><body><?php
}
 
function doFooter() {
// crea un pie de página sencillo
?></body></html><?php
}
 
// si la variable filename en POST no está vacia, es que se ha enviado
// el formulario

if (!empty($_POST['filename'])) {
   // ahora validaremos y verificaremos las entradas
// para saber lo que tenemos y abortar si hay algo mal
$errors = array();
$n = 0;
/* pondremos cualquier error dentro de este array, y al final
los listaremos todos para que los vea el usuario
y pueda corregirlos */
if (empty($_POST['filename'])) { // no hay nombre de fichero
  $errors[$n] = "Debe introducir un nombre de fichero.";
$n++;
  }
 
if (empty($_POST['mysqluser'])) { // no hay usuario MySQL
$errors[$n] = "Debe introducir un nombre de usuario MySQL.";
$n++;
}
 
if (empty($_POST['mysqlpass'])) { // no hay password MySQL
$errors[$n] = "Debe introducir un password MySQL .";
$n++;
}
 
// Ha seleccionado copiar una BD, pero no han dicho cual
if ($_POST['backupall'] == 'false' AND
empty
($_POST['backupwhichdb'])) {
  $errors[$n] = "Has selecciona copiar una base de datos, ".
"pero no especificaste cual."
;
$n++;
}
 
if ($n > 0) { // Si hubo errores en la fase de validacion...
  // muestra una pagina de error
   doHeader('Remote Database Backup');
 
?><h1>Remote Database Backup</h1>
<h2>No se pudo realizar la copia.</h2>
<ul>
// recorre los errores
<?php foreach ($errors as $err) {
?><li>
<?php echo $err; // y muestra su texto ?>
</li><?php

}
?>
</ul>
 
<a href="<?php echo THISPAGE;?>">
Volver al formulario de Backup</a>
<?php
 
doFooter();

die(); // sale del script 
}
 
// Si estamos aqui, es que se ha acabado bien la validación 
// hacemos "escape shell" a los argumentos para evitar
// la inyección de código

// recuerda que esto es solo seguridad basica, se deberian
// añadir mas capas para mayor seguridad

$_POST['filename'] = escapeshellcmd($_POST['filename']);
$_POST['mysqluser'] = escapeshellarg($_POST['mysqluser']);
$_POST['mysqlpass'] = escapeshellcmd($_POST['mysqlpass']);
$_POST['backupwhichdb']=escapeshellarg($_POST['backupwhichdb']);
 
// Queremos copiar todas las bases de datos?
$backupall = ($_POST['backupall'] == 'false') ? false : true;
 
// Si queremos copiar todas, ponemos esto con -A en el comando,
// sino, lo ponemos con el nombre de la base de datos a copiar

$dbarg = $backupall ? '-A' : $_POST['backupwhichdb'];
 
// formamos el comando a ejecutar
$command = "mysqldump ".$dbarg." -u ".$_POST['mysqluser'].
" -p"
.$_POST['mysqlpass']." -r \"".BACKUPDIR.$_POST['filename'].
"\" 2>&1"
;
 
// creamos una cabecera y mostramos el progreso al usuario
// Podria tomar su tiempo

doHeader('Remote Database Backup');
 
?><h1>Ejecutando el backup, por favor espere...</h1><?php
 
// execute the command we just set up
system($command);
 
// si eligieron comprimir con bzip, entonces se hace
if ($_POST['bzip'] == 'true') {
system('bzip2 "'.BACKUPDIR.$_POST['filename'].'"');
}
 
// OK, terminamos. Digale al usuario lo que ha pasado.
// Si ocurrio algun error, se muestran en la llamada a system()

?><h2>Comando ejecutado.
Si hubo errores, Se mostrarán arriba.</h2>
<a href="<?php echo THISPAGE;?>">
Volver al formulario de Backup</a>
<?php
 
// pretty footer
doFooter();
 
// y salidos, hemos terminado!
die();
}
 
// Si el formulario no se envió, entonces se muestra al usuario
// por primera vez con su cabecera
doHeader('Remote Database Backup');
 
?><h1>Remote Database Backup</h1>
<p><em><strong>Por favor:</strong> una vez pulse Crear,
la copia podría durar unos 15 seg. para que se cree.
La página no se cargará inmediatamente, ten paciencia.</em></p>
 
<form name="dbbackup" method="post" action="<?php echo THISPAGE;?>">
Nombre del fichero: <strong><?php echo BACKUPDIR;?></strong>
<input type="text" name="filename"
value="<?php echo date('dMY_H.i.s').'.sql';?>" /><br />
<input type="checkbox" name="bzip" value="true" id="bzipTick" />
<label for="bzipTick">Usar Bzip2 para compresion</label><br /><br />
Nombre de usuario MySQL:
<input type="text" name="mysqluser" value="" /><br />
Password MySQL:
<input type="password" name="mysqlpass" value="" /><br /><br />
Backup ¿ de que ?<br />
<input type="radio" name="backupall"
value="true" id="backupallTrue" />
<label for="backupallTrue">Todas las bases de datos</label><br />
<input type="radio" name="backupall"
value="false" id="backupallFalse" />
<label for="backupallFalse">Una en especifico</label>
<input type="text" name="backupwhichdb" value="" /><br />
<br /><br />
<input type="submit" value="Crear" />
</form>
 
<?php
 
// el pie de página
doFooter();

?>

 

Y eso es todo. Una vez funcionando, este script es una interfaz simple para hacer copias de seguridad remotamente de tus bases de datos MySQL desde un navegador web.

Hits: 10444
Comentarios (5)add comment
elizabeth: ...
Hola

tengo un problema, cuando aprieto el boton crear me da el siguiente error: "mysqldump" no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.
Si alguien pudiera ayudarme por favor.
Otra cosa necesito convertir este bachuo a excel, pues luego lo necesitare para importarlo e insertalo en otra base de datos pero si lo restauro perdere los datos anteriores, no se como hacerlo......??????
Desde ya muchas gracias.
1

01-10-09
Jonathan Izquierdo: ... http://www.adsertech.es
Buenas Elizabeth, comprueba que estás ejecutando correctamente la ruta de mysqldump. Puedes exportarlo también a csv que es un fichero separado por comas, en excel lo puedes importar perfectamente. También puedes insertarlo en la bd mediante un script que lea este fichero ejecutando los insert...
Un cordial saludo.
2

23-02-10
sandro: ...
probe el codigopero no se porque tarda mucho estado manejando el wamp 2.0 y tambien lo copie el mysqldump tambien a mi carpeta, que tengo que hacer.....
3

23-02-10
Saludos a todos esta buscando por ahi y encontre este script pero me da el mismo problema que a Elizabeth. si lo solucionaron me podrian decir como lo arreglo grax.
4

21-03-10
greenhell8: ...
es cierto esta mal la ruta bueno en el caso tendrias que poner la ruta del mysqldump en mi caso yo tenia instalado xampp y localic la ruta y la agregue al escript en la parte donde dice mysqldump asi:
$command = "C:xamppmysqlinmysqldump".$dbarg." -u ".$_POST['mysqluser']." -p".$_POST['mysqlpass']." -r "".BACKUPDIR.$_POST['filename']."" 2>&1";
5

18-04-10

Escribir comentario
quote
bold
italicize
underline
strike
url
image
quote
quote
smile
wink
laugh
grin
angry
sad
shocked
cool
tongue
kiss
cry
smaller | bigger

busy
 


También te puede interesar:


   
 

Sitios interesantes

LeeMiBlog recomienda:

Clicky Web Analytics

Clicky

 
Contenido liberado bajo licencia CC por LeeMiBlog.
Joomla!
es un software libre publicado bajo la licencia GNU/GPL.
Top