El Puerto de Santa Maria
 
Juegos de ingenio    
Inicio
Hacer backup de MySQL desde un script en PHP
Escrito por Manu   
Martes, 22 de Enero de 2008

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.



Lecturas: 3575
Comentarios (4)add
Muy bien
escrito por Isaac , 24-01-08
Esta super chido
psche
escrito por horda , 07-02-08
Tiene fallos de seguridad, menuda porquería.... scripts de tres duros....
yo seguiré usando el mío
Fallos de seguridad
escrito por Manu_ , 07-02-08
Horda,

Se deja bien claro en el articulo que no se ha tenido en cuenta el tema de seguridad, ya que lo que se intenta en el es mostrar como se hace el tema del backup.

Ademas se resalta este tema en negrita cada vez que se cita, para que nadie lo use directamente. Si tu tienes uno y crees que es mejor, o tienes implementado la seguridad, puedes publicarlo en tu blog (en el caso de que lo tengas) o algun sitio para compartirlo o al menos puedes indicar en tus comentarios algo al respecto de manera mas positiva.

De cualquier manera, gracias por leernos.
Muy bueno
escrito por david , 18-02-08
Esta muy bien, me ha servido para hacerme un componente en Joomla que me automatice la copia de seguridad de mi base de datos.
Psche, si tiene algún fallo de seguridad arreglalo, en este post se habla de como hacer un backup de tu BD no de como escribir código seguro.

Un Saludo!!
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
 
< Anterior   Siguiente >