Foros del Web » Programando para Internet » PHP »

Respaldar Base de datos...¿Alguién sabe?

Estas en el tema de Respaldar Base de datos...¿Alguién sabe? en el foro de PHP en Foros del Web. Hola!! Para finalizar con el desarrollo de mi Sitio Web deseo que haya una sección donde el administrador pueda respaldar la base de datos cuando ...
  #1 (permalink)  
Antiguo 09/08/2005, 13:10
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Respaldar Base de datos...¿Alguién sabe?

Hola!!

Para finalizar con el desarrollo de mi Sitio Web deseo que haya una sección donde el administrador pueda respaldar la base de datos cuando el así lo desee. El problema es que no se como puedo hacer la copia de seguridad de mi base de datos a través de un script en PHP.

Si alguién me pudiera proporcionar un link donde venga explicado el procedimiento para hacer la copia de seguridad, le estaría muy agradecida.

Salu2
  #2 (permalink)  
Antiguo 09/08/2005, 13:34
 
Fecha de Ingreso: septiembre-2003
Ubicación: Sentado frente a un computador
Mensajes: 191
Antigüedad: 14 años, 3 meses
Puntos: 0
aqui te dejo un codigo, espero que te sirva

include("config.php");

$EliminarTablas = true; //aqui poned si quereis que se elimen las tablas si existen

//Conectar con la base de datos
$Conexion = mysql_connect($Servidor, $Usuario, $Password);
mysql_select_db($BaseDeDatos, $Conexion);

$ListaTablas = mysql_listtables($BaseDeDatos);
For ($Numero = 0; $Numero < mysql_num_rows ($ListaTablas); $Numero++) {
$Tablas[] = mysql_tablename ($ListaTablas, $Numero);
$Querys .= CrearQuerys( $Conexion, $Tablas[$Numero], $EliminarTablas);
}

// Enviamos los datos
header("Pragma: no-cache");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=$Archivo");
echo $Querys;

Function CrearQuerys($Conexion, $Tabla, $EliminarTablas) {
// Query que elimina las tablas si existen
if ($EliminarTablas) {
$QueryEliminarTabla = "DROP TABLE IF EXISTS `$Tabla`;";
}

// Query que crea la estructura de la tabla
$sql= "SHOW CREATE TABLE $Tabla;";
$Respuesta = mysql_query($sql, $Conexion);
$ArrayRespuesta = mysql_fetch_array($Respuesta);
$QueryEstructuraTabla = $ArrayRespuesta[1].";";

// Query que introduce los datos en la tabla
$sql = "SELECT * FROM $Tabla;";
$Respuesta = mysql_query($sql, $Conexion);
while ($Fila = mysql_fetch_array($Respuesta, MYSQL_ASSOC)) {
$Columnas = array_keys($Fila);
foreach ($Columnas as $Columna) {
if ( gettype($Fila[$Columna]) == "NULL" ) {
$Valores[] = "NULL";
} else {
$Valores[] = "'".$Fila[$Columna]."'";
}
}
$QueryInsertarDatos .= "INSERT INTO `$Tabla` VALUES (".implode(", ", $Valores).");\n";
unset($Valores);
}

$Contenido = <<<EOT
$QueryEliminarTabla
$QueryEstructuraTabla
$QueryInsertarDatos

EOT;

return $Contenido;
}

?>
  #3 (permalink)  
Antiguo 09/08/2005, 13:40
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Tengo este script para respaldar una bd, tendrá deficiencias pero me sirve:

Código PHP:
<?php
   
//aqui falta configurar la conexion a la bd
   
$con_base=mysql_connect("servidor","usuario","password");

   
$tablas=mysql_query("show tables from base;",$con_base);
   
$texto ="create database if not exists base;\n";
   
$texto.="use base;\n";
   while(
$tabla=mysql_fetch_array($tablas))
   {
      
$mitabla=$tabla[0];
      
$texto.="drop table if exists base.".$mitabla.";\n";
      
$creates=mysql_query("show create table base.$mitabla;",$con_base);
      while(
$create=mysql_fetch_array($creates))
      {
         
$texto.=$create[1].";\n";
         
$datos=mysql_query("select * from base.$mitabla;",$con_base);
         
$campos=mysql_num_fields($datos);
         
$regs=mysql_num_rows($datos);
         for(
$i=0;$i<$regs;$i++)
         {
            
$inserta="insert into base.$mitabla(";
            for(
$j=0;$j<$campos;$j++)
            {
               
$nombre=mysql_field_name($datos,$j);
               
$inserta.="$nombre,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).") values(";
            for(
$j=0;$j<$campos;$j++)
            {
               
$tipo=mysql_field_type($datos,$j);
               
$valor=mysql_result($datos,$i,$j);
               switch(
$tipo)
               {
                  case 
"string":
                  case 
"date":
                  case 
"time":
                     
$valor="'$valor'";
                     break;
               }
               
$inserta.="$valor,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).");";
            
$texto.=$inserta."\n";
         }
      }
      
$texto.="\n";
   }
   
$archivo"base-".date("d-n-Y").".txt";
   
header("Content-disposition: attachment;filename=$archivo");
   
header("Content-Type: text/plain");
   echo 
$texto;
?>
Si no se entiende lo explico.
  #4 (permalink)  
Antiguo 09/08/2005, 17:14
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Si xfa....

Hola Claudio antes q nada, grax x la ayudadota pero la verdad si me lo pudieses explicar estaría mejor ya que de entrada no c a q t refieres con que tendrá deficiencias. Mientras lo voy a probar....gracias

Salu2
  #5 (permalink)  
Antiguo 09/08/2005, 17:42
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 14 años, 1 mes
Puntos: 11
Deficiencias:

1) se siente bien hacer el codigo, pero uno se pregunta si será eficiente cuando los datos crezcan y crezcan
2) en mi codigo los nombres de las tablas quedan con ese signo feo (´) lo cual en algunas versiones parece no funcionar, asi que antes de cargar un respaldo debo limpiar esos caracteres.
3) tambien en versiones mas recientes "show create table" agrega a final el tipo de caracter usado para la tabla, versiones anteriores no lo soportan.

Bueno esas veo yo.

La explicacion va en los comentarios del codigo:

Código PHP:
<?php
   
//aqui falta configurar la conexion a la bd
   
$con_base=mysql_connect("servidor","usuario","password");

   
//saco todas las tablas de la base elegida
   
$tablas=mysql_query("show tables from base;",$con_base);

   
//en general voy concatenando todos los comandos sql
   //en una variable llamado $texto

   //concateno el codigo para crear la base de datos
   
$texto ="create database if not exists base;\n";
   
//concateno el codigo para elegir la base de datos
   
$texto.="use base;\n";
   
//empiezo a recorrer la lista de tablas
   
while($tabla=mysql_fetch_array($tablas))
   {
      
//cojo una tabla
      
$mitabla=$tabla[0];
      
//concateno el codigo para borrar esa tabla si existe
      
$texto.="drop table if exists base.".$mitabla.";\n";
      
//obtengo el codigo para crear la tabla
      
$creates=mysql_query("show create table base.$mitabla;",$con_base);
      while(
$create=mysql_fetch_array($creates))
      {
         
//concateno el codigo de creacion
         
$texto.=$create[1].";\n";
         
//selecciono todos los campos de la tabla que estoy respaldando
         
$datos=mysql_query("select * from base.$mitabla;",$con_base);
         
$campos=mysql_num_fields($datos);
         
$regs=mysql_num_rows($datos);
         for(
$i=0;$i<$regs;$i++)
         {
            
//creo los insert a partir de los registros
            
$inserta="insert into base.$mitabla(";
            for(
$j=0;$j<$campos;$j++)
            {
               
//concateno el nombre de cada campo
               
$nombre=mysql_field_name($datos,$j);
               
$inserta.="$nombre,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).") values(";
            for(
$j=0;$j<$campos;$j++)
            {
               
//concateno los valores de los campos
               
$tipo=mysql_field_type($datos,$j);
               
$valor=mysql_result($datos,$i,$j);
               
//aqui identifico el tipo de dato y agrego comillas simples
               //a los valores de algunos tipos
               
switch($tipo)
               {
                  case 
"string":
                  case 
"date":
                  case 
"time":
                     
$valor="'$valor'";
                     break;
               }
               
$inserta.="$valor,";
            }
            
$inserta=substr($inserta,0,strlen($inserta)-1).");";
            
//concateno los insert a la variable $texto que contiene todo
            
$texto.=$inserta."\n";
         }
      }
      
$texto.="\n";
   }
   
//creo un nombre de archivo con el nombre de la base mas la fecha
   
$archivo"base-".date("d-n-Y").".txt";
   
//pongo el archivo para descarga
   
header("Content-disposition: attachment;filename=$archivo");
   
header("Content-Type: text/plain");
   echo 
$texto;
?>
  #6 (permalink)  
Antiguo 09/08/2005, 18:41
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Hola de nuevo claudio....

Sabes?, el código al parecer esta bien pero, no entiendo que hace exactamente porque a mi me muestra en el sitio web todo el procedimiento desde la creación de la base de datos hasta el insert de los registros....o sea, como quien dice me quede en las mismas jeje.
Yo no he hecho antes ninguna copia de seguridad de mi base de datos pero a lo que he leído se utiliza el dump, no?
Gracias x explikr el procedimiento del código pero en sí como lo utilizas, o sea, donde quedó el respaldo ????

Salu2

Última edición por Ultra Violeta; 09/08/2005 a las 18:47
  #7 (permalink)  
Antiguo 09/08/2005, 19:01
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Buscando en internet....

...encontre la manera de hacerlo a través de la consola, así:

shell> mysqldump[opciones] nombre_base_datos

El problema es que no lo quiero hacer a través de la consola. Quiero hacerlo una manera muy amigable para el usuario, de tal manera que en mi Sitio Web haya un link en el que solo sea cuestión de hacer clic en el y ya tenga respaldada la BD, me explíco??

¿¿¿¿Cómo sería mi respaldo de una BD en MySQL a través de un script en PHP utilizando el comando mysqldump(si es que es necesario utilizarlo en un script en PHP) ????

Salu2
  #8 (permalink)  
Antiguo 09/08/2005, 19:13
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 12 años, 5 meses
Puntos: 0
El código de dark_goldviper te hace la copia de seguridad através del script php como tu quieres. Solo tienes que indicar los datos de configuracion(servidor, password, usuario, y la base de datos que quieres copiar)
  #9 (permalink)  
Antiguo 09/08/2005, 19:21
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 12 años, 5 meses
Puntos: 0
Por cierto, al probar el código e intentar crear otra base de datos con los datos de mi bd me da el siguiente error en phpadmin

Parece haber un error en su consulta de SQL. La salida generada por el servidor de MySQL, de existir, aparece abajo, en cuyo caso puede ayudar a diagnosticar el problema.

ERROR: Signo de puntuación desconocido @ 105
STR: ://
SQL: INSERT INTO `tabla` VALUES ('32', 'Añadir a Favoritos', 'javascript:window.external.AddFavorite('http://www.miweb.com','miweb.com');', '7', '1')

consulta SQL:

INSERT INTO `tabla` VALUES ('32', 'Añadir a Favoritos', 'javascript:window.external.AddFavorite('http://www.miweb.com','miweb.com');', '7', '1')
MySQL ha dicho:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'http://www.miweb.com','miweb.com');', '7', '1')'


¿Porque me da este error?Me copia bien toda la base de datos hasta q llega a este registro y si quito este registro me copia bien toda la base de datos.¿Porque da ese error?
  #10 (permalink)  
Antiguo 09/08/2005, 19:38
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Tal vez...

Porque no intentas quitanto las comillas simples de la dirección en tu consulta y no se si lo omitiste x error ál mostrarlo aquí pero también te falta el ";" al final de la sentencia. Tal vez el problema este ahí, aun no lo he probado. Como sea, al parecer el problema es de sintaxis.

Tu sentencia quedaría como algo así:

INSERT INTO `tabla` VALUES ('32', 'Añadir a Favoritos', 'javascript:window.external.AddFavorite(http://www.miweb.com,miweb.com);', '7', '1');

Mientras probaré el otro código.

Espero te ayude...Salu2
  #11 (permalink)  
Antiguo 09/08/2005, 20:03
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Haber...

... he probado el código de dark_goldviper y me hace lo mismo que el de ClaudioVega.
No se si tengo una idea equivocada de lo que es un respaldo, si es así diganme por favor.
Según yo un respaldo de mi BD es una copia exacta de mi BD y todos los registros que hay en cada una de sus tablas. Esta copia quedaría alojada en un servidor distinto al que pertenece originalmente para que así en caso de perder mi BD del servidor original esta ya se encuentre respaldada en el otro servidor.
Ahora, lo que no entiendo es, en que otro servidor se queda alojada mi BD???.
Si alguien sabe bien el funcionamiento de un respaldo y como lo hacen estos códigos q me explique porfa ??

Salu2
  #12 (permalink)  
Antiguo 09/08/2005, 20:06
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Por cierto PHPMAN...

A mi no me causo ningún problema el código en las sentencias....tu problema esta en la sintaxis, chekle bien ;)
  #13 (permalink)  
Antiguo 09/08/2005, 21:18
 
Fecha de Ingreso: septiembre-2003
Ubicación: Sentado frente a un computador
Mensajes: 191
Antigüedad: 14 años, 3 meses
Puntos: 0
el codigo que puse crea un archivo que te permite obtener los datos de la BD, y la puedo restaurar cuando quiero.


<?

include("conectar.php");
?>
<html>
<head>

<link href="estilo.css" rel="stylesheet" type="text/css">
</head>
<img src="images/nuevas/utilidadesrestaurar.jpg" width="342" height="24"> <br>
<?

if ($ini<>"")
{
$mensaje="";
function crear_db($DBname, $sqlfile='galopin.sql') {
mysql_select_db($DBname);
$mqr = @get_magic_quotes_runtime();
@set_magic_quotes_runtime(0);
$query = fread(fopen($sqlfile, "r"), filesize($sqlfile));
@set_magic_quotes_runtime($mqr);
$pieces = split_sql($query);
$errors = array();
for ($i=0; $i<count($pieces); $i++) {
$pieces[$i] = trim($pieces[$i]);
if(!empty($pieces[$i]) && $pieces[$i] != "#") {
if (!$result = mysql_query ($pieces[$i])) {
$errors[] = array ( mysql_error(), $pieces[$i] );
}
}
}
}

function split_sql($sql) {
$sql = trim($sql);
$sql = ereg_replace("\n#[^\n]*\n", "\n", $sql);

$buffer = array();
$ret = array();
$in_string = false;

for($i=0; $i<strlen($sql)-1; $i++) {
if($sql[$i] == ";" && !$in_string) {
$ret[] = substr($sql, 0, $i);
$sql = substr($sql, $i + 1);
$i = 0;
}

if($in_string && ($sql[$i] == $in_string) && $buffer[1] != "\\") {
$in_string = false;
}
elseif(!$in_string && ($sql[$i] == '"' || $sql[$i] == "'") && (!isset($buffer[0]) || $buffer[0] != "\\")) {
$in_string = $sql[$i];
}
if(isset($buffer[1])) {
$buffer[0] = $buffer[1];
}
$buffer[1] = $sql[$i];
}

if(!empty($sql)) {
$ret[] = $sql;
}
return($ret);
}

$DBhostname = trim($Servidor);
$DBusername = trim($Usuario);
$DBpassword = trim($Password);
$DBname = trim($BaseDeDatos);

$correcto="si";
if (!($mysql_link = @mysql_connect( $DBhostname, $DBusername, $DBpassword ))) {
$mensaje= "El usuario y la clave introducida son incorrectos<br>";
$correcto="no"; }
if(($DBname == "") or ($restaurar=="")) {
$mensaje=$mensaje."El nombre de la base de datos está vacio<br>";
$correcto="no";
}
if ($correcto=="si") {

#borramos cualquier resto de la base de datos anterior
$borrar="drop database galopin;";
$query=mysql_query($borrar);

$var=$DBname.".*";
$var2=$DBusername."@".$DBhostname;
$consulta2="GRANT ALL PRIVILEGES ON $var TO $var2 IDENTIFIED BY $DBpassword WITH GRANT";
$query2=mysql_query($consulta2);
$consulta = "CREATE DATABASE $DBname";
$query = mysql_query($consulta);
$test = mysql_errno();

if ($test <> 0 && $test <> 1007) {
$mensaje= $mensaje."Error creando la base de datos. Error nº: ".$test."<br>";
$correcto="no";
}
if ($correcto=="si")
{
//creamos la base de datos desde el directorio seguridad donde se copió el fichero de restauración
if ($prueba==true) { crear_db($DBname,$restaurar); } else { crear_db($DBname,$restaurar); }
$mensaje=$mensaje."La restauración se ha realizado con éxito.";
$fp = fopen("../config.php", "w");
if (!$fp)
die(" ERROR: No se tiene acceso a fichero de configuracion: config.php. Instalación a medias");

$usuname="galopin";
$tbname="user_list";
fputs ($fp, "<?php\r\n");
fputs ($fp, "\$Usuario=\"$DBusername\";\r\n");
fputs ($fp, "\$Password=\"$DBpassword\";\r\n");
fputs ($fp, "\$Servidor=\"$DBhostname\";\r\n");
fputs ($fp, "\$BaseDeDatos=\"$DBname\";\r\n");
fputs ($fp, "\$usuarios_sesion=\"$usuname\";\r\n");
fputs ($fp, "\$sql_tabla=\"$tbname\";\r\n");
fputs ($fp, "?>\r\n");

fclose($fp);
chmod("../config.php",0777);
}
else
{
$mensaje= $mensaje."Error la base de datos ya existe. Error nº: ".$test."<br>";
$correcto="no";
}
}
?>
<body bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<?
if ($correcto=="no") {

$loguito="logomensaje.jpg";
$cabecera="clientes.jpg";
$texto=$mensaje;

$actionimp="";
$namevar="";
$valuevar="";
$valueimp="";

$actionv="index2.php";
$valuev="Regresar";

}
if ($correcto=="si") {

$loguito="logomensaje.jpg";
$cabecera="clientes.jpg";
$texto=$mensaje;

$actionimp="";
$namevar="";
$valuevar="";
$valueimp="";

$actionv="index.php";
$valuev="Reiniciar Galopín";

}

?>
<br><br>
<table class="mensaje" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2"><img src="images/<? echo $cabecera; ?>" width="460" height="18"></td>
</tr>
<tr>
<td width="30%" height="152" rowspan="2" align="center">
<img src="images/<? echo $loguito; ?>" width="118" height="80"></td>
<td width="70%">
<font color="#ff0000" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong><br>
<? echo $texto; ?><br>
<br>
</strong></font>
<table border="0" class="mensaje2" align="center">
<tr>

<?
if ($actionimp<>"")
{
?>
<td>
<form action="fpdf/<? echo $actionimp; ?>" target="_top" method="post">
<input type="hidden" name="<? echo $namevar; ?>" value="<? echo $valuevar; ?>">
<?
if ($namevar2<>"")
{
?>
<input type="hidden" name="<? echo $namevar2; ?>" value="<? echo $valuevar2; ?>">
<?
}
?>

<input name="submit" type="submit" value="<? echo $valueimp; ?>">
</form>
</td>
<?
}
?>

<td>
<center>
<form action="<? echo $actionv; ?>" method="post" target="_top">
<input name="submit" type="submit" value="<? echo $valuev; ?>">
</form>
</center>
</td>
</tr>
</table>
<div align="right"><font color="#299517" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>
<br>
</strong> <font size="1">Galopin v2.0</font></font></div>
</div></td>
</tr>
</table>
<?
}
else
{
?><br>
<br>

<table width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><div align="center"><font color="#CC0000" size="-2"><br>
Si su base de datos ha quedado corrupta tras un apag&oacute;n o cualquier
otro motivo puede restaurarla desde una copia anterior. Para ello seleccionel&aacute;
y pulse el bot&oacute;n &quot;Restaurar&quot;.<br>
<br>
</font></div></td>
</tr>
<tr>
<td>
<form action="restaurar.php" method="post" enctype="multipart/form-data">
<div align="center">
<p><br>
<input type="file" name="restaurar" title="Restaurar">
<br>
<br>
<input type="hidden" name="ini" value="segundavez">
<input type="submit" value="Restaurar">
<br>
<br>
</p>
</div>
</form>
</td>
</tr>
</table>
<?
}
?>
</body>
</html>

cuando quiero restaurarla llamo este archivo y listo
  #14 (permalink)  
Antiguo 10/08/2005, 11:26
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 12 años, 5 meses
Puntos: 0
Cita:
Iniciado por Ultra Violeta
A mi no me causo ningún problema el código en las sentencias....tu problema esta en la sintaxis, chekle bien ;)
Si, era por las comillas, gracias ;)
  #15 (permalink)  
Antiguo 10/08/2005, 11:28
 
Fecha de Ingreso: marzo-2005
Mensajes: 162
Antigüedad: 12 años, 9 meses
Puntos: 0
Dudas.....

Hola otra vez...

1.- ¿¿¿De dónde jalas la variable $restaurar???. En la siguiente parte de código la utilizas:

Código PHP:
if(($DBname == "") or ($restaurar=="")) {
    
$mensaje=$mensaje."El nombre de la base de datos está vacio<br>";
    
$correcto="no";

2.- ¿¿¿Que archivo es el config.php???, ¿¿¿El de conexión???

Código PHP:
$mensaje=$mensaje."La restauración se ha realizado con éxito.";
$fp fopen("../config.php""w"); 
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:32.