Foros del Web » Programando para Internet » PHP »

backup db desde script?

Estas en el tema de backup db desde script? en el foro de PHP en Foros del Web. Hola!! He leído algo sobre el tema pero no se adapta bien a lo que quiero conseguir. En mi aplicación web tengo que dar la ...
  #1 (permalink)  
Antiguo 04/07/2011, 01:07
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
backup db desde script?

Hola!!
He leído algo sobre el tema pero no se adapta bien a lo que quiero conseguir.
En mi aplicación web tengo que dar la opción al administrador de hacer una copia de la base de datos en el momento que lo necesite y de poder guardarlo en donde desee.
Sólo hay una base de datos de la que hacer la copia, así que no debe ser muy complicado.
Voy a seguir buscando información pero, mientras encuentro lo que busco, os dejo la pregunta a ver si podeis darme una respuesta válida.
Gracias y saludos.
  #2 (permalink)  
Antiguo 04/07/2011, 01:28
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: backup db desde script?

Busca por dump (no se si es mysql, sql, access, dbase, etc...) pero trata de buscar informacion de como hacer un dump de tu base de datos por comandos... con eso podras identificar lo que debes hacer... luego es cosa que ejecutes la funcion exec() (www.php.net/exec)

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 04/07/2011, 01:59
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

Gracias Marvin.
Estaba buscando por mysqldump porque uso mysql, creo que es eso a lo que te refieres.
Pero aún no he encontrado un script que especifique bien la sintaxis.
Pongo
Código PHP:
Ver original
  1. shell> mysql -e "source /ruta/fichero_de_seguridad.sql" nombre_de_base_de_datos

con mis datos, pero me da error porque estoy empezando por shell a secas.
Voy a ver lo que más puedo obtener.

Otra cosa, trabajo con xajax para las llamadas asíncronas. Así que en la función para generar la copia añado una salida que me imprime un icono para poder descargar el fichero generado si se ha generado correctamente. Algo así como
Código PHP:
Ver original
  1. $genero = mysql_dump...;
  2. if($genero)
  3. $salida = ".....";
Saludos!!
  #4 (permalink)  
Antiguo 04/07/2011, 02:46
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: backup db desde script?

Mira este mensaje.

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #5 (permalink)  
Antiguo 04/07/2011, 05:17
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

Gracias otra vez por la respuesta Marvin.

Veamos. La función que contiene el código para generar el archivo es una función xajax, por el tema de llamarla con un botón desde otra función xajax. No sé si eso será correcto o es lo que me está fallando.

Pulso el botón de generar y no hace nada. Absolutamente nada, ni me da error.
Puede ser por lo que digo anteriormente o porque no se especifica dónde guardar el archivo.
Os paso algo de código para que veais lo que he hecho

Código PHP:
//este es el botón del menú que invoca a la primera función
<div id='copia_seguridad' class='bot_izqd'>
                <
a href='#' onclick='xajax_eliminaTabla(); xajax_creaCopiaS(); '>Copia de Seguridad</a>
            </
div

//la función que aparece en pantalla cuando pulso el botón del menú
function creaCopiaS()
{
    
$respuesta = new xajaxResponse();
    
    
$salida .= "<div id='divcreacs'>
    <form name='fCopia' id='fCopia' action='#' value=''>
        <table id='tcopia' class='form'>
            <thead>
            <tr>
                <th>Copia de Seguridad</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <th colspan='2'>&nbsp;</th>
            </tr>
            
            <tr>
                <th colspan='2'>&iquest;Est&aacute;s seguro de que deseas hacer una copia de seguridad de la base de datos?</th>
            </tr>
            <tr>
                <td colspan='2'><input type='button' id='bcreacopia' name='bcreacopia' value='Aceptar' onclick='xajax_copiaBD()'/></td>
            </tr>
            </tbody>
        </table>
    </form>
    </div>"
;

//la función adaptada que copié del enlace

function copiaBD()
{
    
$conexion conectar();
    
    
$date_month date('m');
    
$date_year date('Y');
    
$date_day date('d');
    
$Date "$date_year-$date_month-$date_day";
    
$nombre "copiabd_$Date.sql";

    
$drop false;
    
$tablas false;
    
    
$compresion "gz";
    
/* Se busca las tablas en la base de datos */
    
if ( empty($tablas) ) 
    {
        
$consulta "SHOW TABLES FROM ilscnse;";
        
$respuesta mysql_query($consulta$conexion) or die("No se pudo ejecutar la consulta: ".mysql_error());
        while (
$fila mysql_fetch_array($respuestaMYSQL_NUM)) 
        {
            
$tablas[] = $fila[0];
        }
    }


/* Se crea la cabecera del archivo */
    
$info['dumpversion'] = "1.1b";
    
$info['fecha'] = date("d-m-Y");
    
$info['hora'] = date("h:m:s A");
    
$info['mysqlver'] = mysql_get_server_info();
    
$info['phpver'] = phpversion();
    
ob_start();
    
print_r($tablas);
    
$representacion ob_get_contents();
    
ob_end_clean ();
    
preg_match_all('/(\[\d+\] => .*)\n/'$representacion$matches);
    
$info['tablas'] = implode(";  "$matches[1]);
    
$dump "
    # +===================================================================
    # | Generado el {$info['fecha']} a las {$info['hora']} por el usurio '$usurio'
    # | Servidor: {$_SERVER['HTTP_HOST']}
    # | MySQL Version: {$info['mysqlver']}
    # | PHP Version: {$info['phpver']}
    # | Base de datos: '$bd'
    # | Tablas: {$info['tablas']}
    # |
    # +-------------------------------------------------------------------
    
    "
;
    foreach (
$tablas as $tabla
    {
    
        
$drop_table_query "";
        
$create_table_query "";
        
$insert_into_query "";
        
        
/* Se halla el query que será capaz vaciar la tabla. */
        
if ($drop
        {
            
$drop_table_query "DROP TABLE IF EXISTS `$tabla`;";
        } 
        else 
        {
            
$drop_table_query "# No especificado.";
        }

        
/* Se halla el query que será capaz de recrear la estructura de la tabla. */
        
$create_table_query "";
        
$consulta "SHOW CREATE TABLE $tabla;";
        
$respuesta mysql_query($consulta$conexion) or die("No se pudo ejecutar la consulta: ".mysql_error());
        while (
$fila mysql_fetch_array($respuestaMYSQL_NUM)) 
        {
                
$create_table_query $fila[1].";";
        }
    
    
/* Se halla el query que será capaz de insertar los datos. */
        
$insert_into_query "";
        
$consulta "SELECT * FROM $tabla;";
        
$respuesta mysql_query($consulta$conexion) or die("No se pudo ejecutar la consulta: ".mysql_error());
        while (
$fila mysql_fetch_array($respuestaMYSQL_ASSOC)) 
        {
            
$columnas array_keys($fila);
            foreach (
$columnas as $columna
            {
                if ( 
gettype($fila[$columna]) == "NULL" 
                {
                    
$values[] = "NULL";
                } 
                else 
                {
                    
$values[] = "'".mysql_real_escape_string($fila[$columna])."'";
                }
            }
            
$insert_into_query .= "INSERT INTO `$tabla` VALUES (".implode(", "$values).");\n";
            unset(
$values);
        }
    
        
$dump .= "
        
        # | Vaciado de tabla '$tabla'
        # +------------------------------------->
        $drop_table_query

        # | Estructura de la tabla '$tabla'
        # +------------------------------------->
        $create_table_query

        # | Carga de datos de la tabla '$tabla'
        # +------------------------------------->
        $insert_into_query
        "
;
    }

/* Envio */
    
if ( !headers_sent() ) 
    {
        
header("Pragma: no-cache");
        
header("Expires: 0");
        
header("Content-Transfer-Encoding: binary");
        switch (
$compresion) {
        
            case 
"gz":
                
header("Content-Disposition: attachment; filename=$nombre.gz");
                
header("Content-type: application/x-gzip");
                echo 
gzencode($dump9);
                break;
            case 
"bz2"
                
header("Content-Disposition: attachment; filename=$nombre.bz2");
                
header("Content-type: application/x-bzip2");
                echo 
bzcompress($dump9);
                break;
            default:
                
header("Content-Disposition: attachment; filename=$nombre");
                
header("Content-type: application/force-download");
                echo 
$dump;
        }
    }
     else 
     {
        echo 
"<b>ATENCION: Probablemente ha ocurrido un error</b><br />\n<pre>\n$dump\n</pre>";
    } 


Sé que entra en esta última función pues le puse un objResponse que me genera un popup. Pero ya os digo, no hace nada y no sé por qué es.

Gracias de nuevo y un saludo
  #6 (permalink)  
Antiguo 04/07/2011, 06:01
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

También he probado esta forma:
Código PHP:

$conexion 
conectar();
    
    
$db 'ilscnse';
    
$nombre_backup date("Y-m-d") . "-" $db ".sql";
 
    
// CABECERAS PARA DESCARGAR EL ARCHIVO
    
header"Content-type: application/savingfile" );
    
header"Content-Disposition: attachment; filename=$nombre_backup" );
    
header"Content-Description: Document." );
     
    
// CONEXION A LA DB
    
$conexion conectar();
     
    
// RECUPERO LAS TABLAS
    
$tablas mysql_list_tables($db);
    if (!
$tablas) {
        echo 
"Error en la base de datos: no se pueden listar las tablas \n";
        echo 
'MySQL Error: ' mysql_error();
        exit;
    }
     
    
// RECORRO TODAS LAS TABLAS
    
while ($tabla mysql_fetch_row($tablas)) {
     
        
// RECUPERO LA INFORMACION DE CREACION DE LA TABLA
        
$creacion mysql_fetch_array(mysql_query("SHOW CREATE TABLE $tabla[0]"));
        echo 
"-- Informacion de creacion de la tabla $tabla[0]\n\n";
        echo 
$creacion['Create Table']."\n\n";
     
        
// VUELCO LOS REGISTROS DE LA TABLA
        
echo "-- Volcado de registros en la tabla $tabla[0]\n\n";
     
        
// RECUPERO LOS NOMBRES DE LOS CAMPOS
        
$columnas_txt "";
        
$columnas mysql_query("SHOW COLUMNS FROM $tabla[0]");
        
$cantidad_columnas mysql_num_rows($columnas);
        if (
mysql_num_rows($columnas) > 0) {
            while (
$columna mysql_fetch_assoc($columnas)) {
                
$columnas_txt .= $columna['Field'] . ", ";
            }
        }
        
$columnas substr($columnas_txt0, -2);
        echo 
"INSERT INTO $tabla[0] ($columnas) VALUES\n";
     
        
$registros_txt "";
        
$registros mysql_query("SELECT * FROM $tabla[0]");
        while (
$registro mysql_fetch_array($registros)) {
            
$i 0;
            
$registro_txt "";
            while (
$i $cantidad_columnas) {
                
$registro_txt .= "'$registro[$i]', ";
                
$i++;
            }
            
$registros_txt .= "(".substr($registro_txt0, -2)."),\n";
        }
        echo 
substr($registros_txt0, -2).";\n\n\n";
    } 
Y ocurren 2 cosas:
Si la llamo desde xajax no me da error. Se queda un ratillo cargando y no hace nada más.
Si la llamo como función php normal me aparece durante segundos varios warnings diciendo que no puedo cambiar las cabeceras...

Ésto es un lío.

Gracias!!
  #7 (permalink)  
Antiguo 04/07/2011, 09:40
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: backup db desde script?

Jojo... si estas haciendolo por ajax tienes algun depurador para ver que devuelve la llamada a la pagina??... (instala firebug en firefox para ver esto)

A mi me parece que el proceso esta bien pero no esta llegando a devolver lo que necesitas y seguramente se cae justo antes...

Ojala este plugin de firefox te de mas respuestas (es bien util para el futuro tambien)

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #8 (permalink)  
Antiguo 05/07/2011, 00:15
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

Gracias Marvin.

Ya tenía instalado el firebug, pero como no lo domino aún en este aspecto no lo utilicé. Lo he probado ahora y creo que no me devuelve nada relevante. Siempre parece fallar en la llamada a ajax, haga lo que haga. Pero dicha llamada funciona correctamente.

Estoy intentando con los objResponse->return .... y me devuelve hasta esta línea
Código PHP:
Ver original
  1. $creacion = mysql_fetch_array(mysql_query("SHOW CREATE TABLE $tabla[0]"));
Después de ahí me da errores de sintaxis.
Decir que imprimiendo $creación me sale
Código PHP:
Ver original
  1. (
  2.     [0] => tabla1
  3.     [Table] => tabla1
  4.     [1] => CREATE TABLE `mitabla` (
  5.   `campo1` int(11) NOT NULL auto_increment,
  6.   `campo2` int(11) NOT NULL,
  7.   `cam,po3` varchar(200) NOT NULL,
  8.   PRIMARY KEY  (`campo1`),
  9.   KEY `fk_tabla1_otratabla` (`campo2`),
  10.   CONSTRAINT `fk_tabla1_otratabla` FOREIGN KEY (`campo2`) REFERENCES `otratabla` (`campo1`) ON DELETE CASCADE ON UPDATE CASCADE
  11. ) ENGINE=InnoDB AUTO_INCREMENT=137 DEFAULT CHARSET=utf8
  12.     [Create Table] => CREATE TABLE `tabla1` (
  13.   `campo1` int(11) NOT NULL auto_increment,
  14.   `campo2` int(11) NOT NULL,
  15.   `campo3` varchar(200) NOT NULL,
  16.   PRIMARY KEY  (`campo1`),
  17.   KEY `fk_tabla1_otratabla` (`campo2`),
  18.   CONSTRAINT `fk_tabla1_otratabla` FOREIGN KEY (`campo2`) REFERENCES `otratabla` (`campo1`) ON DELETE CASCADE ON UPDATE CASCADE
  19. ) ENGINE=InnoDB AUTO_INCREMENT=137 DEFAULT CHARSET=utf8
  20. )

Cuando intento sacar $creacion['Create Table'] o $creacion[1] después de imprimir las siguientes líneas(por ejemplo
Código PHP:
Ver original
  1. echo "-- Informacion de creacion de la tabla $tabla[0]\n\n";
) es cuando me dice que error de sintaxis CREATE TABLE `tabla1` (

Lo que falla es el echo. Pero no sé cómo asignar la respuesta al fichero que se va a crear. Y como decía, si llamo a la función como php normal me salen varios warnings donde se imprime el menú, antes de que este se imprima...

Alguna idea?
Saludos y gracias

Última edición por aniMAYtions; 05/07/2011 a las 01:38
  #9 (permalink)  
Antiguo 11/07/2011, 00:34
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

Con el siguiente script he conseguido que me genere el txt aparentemente correcto. Pero me imprime algo que no entiendo

Código PHP:
Ver original
  1. function copiaBD()
  2. {
  3.    
  4.    
  5. $nombre = "copia_bd.txt";
  6. /* Determina si la tabla será vaciada (si existe) cuando  restauremos la tabla. */            
  7. $drop = false;
  8. /*
  9. * Array que contiene las tablas de la base de datos que seran resguardadas.
  10. * Puede especificarse un valor false para resguardar todas las tablas
  11. * de la base de datos especificada en  $bd.
  12. *
  13. * Ejs.:
  14. * $tablas = false;
  15. *    o
  16. * $tablas = array("tabla1", "tabla2", "tablaetc");
  17. *
  18. */
  19. $tablas = false;
  20. /*
  21. * Tipo de compresion.
  22. * Puede ser "gz", "bz2", o false (sin comprimir)
  23. */
  24. $compresion = false;
  25.  
  26. /* Conexion y eso*/
  27. $conexion = conectar() or die("No se conectar con el servidor MySQL: ".mysql_error());
  28.  
  29. $bd = "basededatos";
  30. mysql_select_db($bd, $conexion) or die("No se pudo seleccionar la Base de Datos: ". mysql_error());
  31.  
  32.  
  33. /* Se busca las tablas en la base de datos */
  34. if ( empty($tablas) ) {
  35.     $consulta = "SHOW TABLES FROM $bd;";
  36.     $respuesta = mysql_query($consulta, $conexion) or die("No se pudo ejecutar la consulta: ".mysql_error());
  37.     while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
  38.         $tablas[] = $fila[0];
  39.     }
  40. }
  41.  
  42.  
  43. /* Se crea la cabecera del archivo */
  44. $info['dumpversion'] = "1.1b";
  45. $info['fecha'] = date("d-m-Y");
  46. $info['hora'] = date("h:m:s A");
  47. $info['mysqlver'] = mysql_get_server_info();
  48. $info['phpver'] = phpversion();
  49. print_r($tablas);
  50. $representacion = ob_get_contents();
  51. preg_match_all('/(\[\d+\] => .*)\n/', $representacion, $matches);
  52. $info['tablas'] = implode(";  ", $matches[1]);
  53. $dump = <<<EOT
  54. # +===================================================================
  55. # | COPIA DE SEGURIDAD DE LA BASE DE DATOS DE INTÉRPRETES
  56. # |
  57. # | Generado el {$info['fecha']} a las {$info['hora']} por el usurio '$usurio'
  58. # | Base de datos: '$bd'
  59. # | Tablas: {$info['tablas']}
  60. # |
  61. # +-------------------------------------------------------------------
  62.  
  63. EOT;
  64. foreach ($tablas as $tabla) {
  65.    
  66.     $drop_table_query = "";
  67.     $create_table_query = "";
  68.     $insert_into_query = "";
  69.    
  70.     /* Se halla el query que será capaz vaciar la tabla. */
  71.     if ($drop) {
  72.         $drop_table_query = "DROP TABLE IF EXISTS `$tabla`;";
  73.     } else {
  74.         $drop_table_query = "# No especificado.";
  75.     }
  76.  
  77.     /* Se halla el query que será capaz de recrear la estructura de la tabla. */
  78.     $create_table_query = "";
  79.     $consulta = "SHOW CREATE TABLE $tabla;";
  80.     $respuesta = mysql_query($consulta, $conexion)
  81.     or die("No se pudo ejecutar la consulta: ".mysql_error());
  82.     while ($fila = mysql_fetch_array($respuesta, MYSQL_NUM)) {
  83.             $create_table_query = $fila[1].";";
  84.     }
  85.    
  86.     /* Se halla el query que será capaz de insertar los datos. */
  87.     $insert_into_query = "";
  88.     $consulta = "SELECT * FROM $tabla;";
  89.     $respuesta = mysql_query($consulta, $conexion)
  90.     or die("No se pudo ejecutar la consulta: ".mysql_error());
  91.     while ($fila = mysql_fetch_array($respuesta, MYSQL_ASSOC)) {
  92.             $columnas = array_keys($fila);
  93.             foreach ($columnas as $columna) {
  94.                 if ( gettype($fila[$columna]) == "NULL" ) {
  95.                     $values[] = "NULL";
  96.                 } else {
  97.                     $values[] = "'".mysql_real_escape_string($fila[$columna])."'";
  98.                 }
  99.             }
  100.             $insert_into_query .= "INSERT INTO `$tabla` VALUES (".implode(", ", $values).");\n";
  101.             unset($values);
  102.     }
  103.    
  104. $dump .= <<<EOT
  105.  
  106. # | Vaciado de tabla '$tabla'
  107. # +------------------------------------->
  108. $drop_table_query
  109.  
  110.  
  111. # | Estructura de la tabla '$tabla'
  112. # +------------------------------------->
  113. $create_table_query
  114.  
  115.  
  116. # | Carga de datos de la tabla '$tabla'
  117. # +------------------------------------->
  118. $insert_into_query
  119.  
  120. EOT;
  121. }
  122.  
  123. /* Envio */
  124. if ( !headers_sent() ) {
  125.     header("Pragma: no-cache");
  126.     header("Expires: 0");
  127.     header("Content-Transfer-Encoding: binary");
  128.     switch ($compresion) {
  129.     case "gz":
  130.         header("Content-Disposition: attachment; filename=$nombre.gz");
  131.         header("Content-type: application/x-gzip");
  132.         echo gzencode($dump, 9);
  133.         break;
  134.     case "bz2":
  135.         header("Content-Disposition: attachment; filename=$nombre.bz2");
  136.         header("Content-type: application/x-bzip2");
  137.         echo bzcompress($dump, 9);
  138.         break;
  139.     default:
  140.         header("Content-Disposition: attachment; filename=$nombre");
  141.         header("Content-type: application/force-download");
  142.         echo $dump;
  143.     }
  144. } else {
  145.     echo "<b>ATENCION: Probablemente ha ocurrido un error</b><br />\n<pre>\n$dump\n</pre>";
  146. }
  147. }

Me imprime correctamente la copia de seguridad. Pero al final de este código también me imprime el javascript con el que consulto a la base de datos para los combos anidados.
Alguien puede decirme dónde está la orden para que me haga eso??
Gracias!!

Última edición por aniMAYtions; 11/07/2011 a las 02:49
  #10 (permalink)  
Antiguo 11/07/2011, 10:33
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: backup db desde script?

Podrias poner todo el codigo que utilizas para ver donde podria estar sucediendo el problema.

Saludos!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #11 (permalink)  
Antiguo 12/07/2011, 00:12
Avatar de aniMAYtions  
Fecha de Ingreso: diciembre-2007
Ubicación: Granada
Mensajes: 519
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: backup db desde script?

Hola Marvin, qué más de código hace falta? He puesto toda la función que me crea e imprime la copia...
Gracias por tu respuesta.

Etiquetas: backup
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

SíEste tema le ha gustado a 2 personas




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