Foros del Web » Programando para Internet » PHP »

Mejorando backup de mysql

Estas en el tema de Mejorando backup de mysql en el foro de PHP en Foros del Web. hola nuevamente amigos de forosdelweb... tengo el siguiente codigo Código PHP: <?php  include( "../conexion/conexion.php" ); session_start (); if (isset( $_SESSION [ 'nombreusuario' ]))      {    $conexion  ...
  #1 (permalink)  
Antiguo 05/04/2011, 12:05
Avatar de Deathmetalrules  
Fecha de Ingreso: diciembre-2010
Ubicación: Mas - aya
Mensajes: 65
Antigüedad: 13 años, 4 meses
Puntos: 8
Pregunta Mejorando backup de mysql

hola nuevamente amigos de forosdelweb...

tengo el siguiente codigo
Código PHP:
<?php 
include("../conexion/conexion.php");
session_start();
if (isset(
$_SESSION['nombreusuario'])) 
    {
  
$conexion mysql_connect($servername,$dbusername,$dbpassword) or die(mysql_error());
  @
mysql_select_db($dbname,$conexion);
  
$fechaDeLaCopia "-".date("d l-F-Y");    
  
$ficheroDeLaCopia =$dbname.$fechaDeLaCopia.".sql";
  
$encabezamientoDeLaCopia "# Copia de la base de datos creada el: ".date("d-m-Y")."\n# BBDD: $dbname \r\n";
  
$manejadorDelFicheroDeLaCopia fopen($ficheroDeLaCopia,"a+b");
  
fwrite($manejadorDelFicheroDeLaCopia$encabezamientoDeLaCopia); 
  
fclose($manejadorDelFicheroDeLaCopia);     
 

  
$matrizDeTablas = array();
  
$indiceDeLaMatrizDeTablas 0;
  
$listadoDeTablas mysql_list_tables($dbname);
  for(
$recorridoDeTablas=0$recorridoDeTablas<mysql_num_rows($listadoDeTablas); $recorridoDeTablas++){     
    
$nombreDeTabla mysql_tablename($listadoDeTablas,$recorridoDeTablas);
    if (
$nombreDeTabla <>"") {
      
$matrizDeTablas[$indiceDeLaMatrizDeTablas] = mysql_tablename($listadoDeTablas,$recorridoDeTablas);

      
$indiceDeLaMatrizDeTablas++;
    }
  }
  


  for (
$recorridoDeTablas 0$recorridoDeTablas $indiceDeLaMatrizDeTablas$recorridoDeTablas++){

    
$autoincrementado="";
    
$nombreDeTabla=$matrizDeTablas[$recorridoDeTablas];

    
$cadenaSQL "";
    
$cadenaSQL .= "DROP TABLE IF EXISTS $nombreDeTabla; \n";
    
$cadenaSQL .= "CREATE TABLE $nombreDeTabla (\n";


    
$hacerConsultaDeLecturaDeEstructura mysql_query("SHOW FIELDS FROM $nombreDeTabla",$conexion);

    while(
$row mysql_fetch_array($hacerConsultaDeLecturaDeEstructura)) {
      
$cadenaSQL .= "    $row[Field] $row[Type]"
      if (
$row["Default"] != ""$cadenaSQL .= " DEFAULT '$row[Default]'"
      if (
$row["Null"] != "YES"$cadenaSQL .= " NOT NULL"
      if (
$row[Extra] != ""$cadenaSQL .= " $row[Extra]"
      if (
strstr (strtolower($row[Extra]),"auto_increment")) $autoincrementado=$row[Field];
      
$cadenaSQL .= ",\n"
    }


    
$cadenaSQL ereg_replace(",\n$",""$cadenaSQL);


    
$hacerConsultaDeLecturaDeEstructura mysql_query("SHOW KEYS FROM $nombreDeTabla",$conexion);
    while(
$row mysql_fetch_array($hacerConsultaDeLecturaDeEstructura)){
      
$nombreDeIndice=$row[Key_name];
      if((
$nombreDeIndice != "PRIMARY") && ($row[Non_unique] == 0)) $nombreDeIndice="UNIQUE|$nombreDeIndice";
      if(!isset(
$listaDeIndices[$nombreDeIndice])) $listaDeIndices[$nombreDeIndice] = array();
      
$listaDeIndices[$nombreDeIndice][] = $row[Column_name];
    }

    
$autoIncluido=FALSE;
    while(list(
$tipoDeIndice$columnas) = @each($listaDeIndices)){
      
$cadenaSQL .= ",\n";
      if(
$tipoDeIndice == "PRIMARY"$cadenaSQL .= "   PRIMARY KEY (" implode($columnas", ") . ")";
      else if (
substr($tipoDeIndice,0,6) == "UNIQUE"$cadenaSQL .= "   UNIQUE ".substr($tipoDeIndice,7)." (" implode($columnas", ") . ")";
      else 
$cadenaSQL .= "   KEY $tipoDeIndice (" implode($columnas", ") . ")";
      if (
implode($columnas", ")==$autoincrementado$autoIncluido=TRUE;
    }
    if (!
$autoIncluido && $autoincrementado>""$cadenaSQL .= ",\n   KEY $autoincrementado (" $autoincrementado ")";
        
    
$cadenaSQL .= "\n); \n";

    
$manejadorDelFicheroDeLaCopia fopen($ficheroDeLaCopia,"a+b"); 
    
fwrite($manejadorDelFicheroDeLaCopia"# Tabla: ".$nombreDeTabla."\n\r".$cadenaSQL); 
    
fclose($manejadorDelFicheroDeLaCopia);



    unset(
$lineaDeDatos);

    if (
$nombreDeTabla>""){ 

      
$hacerConsultaDeLecturaDeDatos=mysql_query("SELECT * FROM $nombreDeTabla"$conexion); 
      
$totalDeRegistrosmysql_num_rows ($hacerConsultaDeLecturaDeDatos); 
      
$totalDeCampos mysql_num_fields($hacerConsultaDeLecturaDeDatos); 

      for (
$cuentaDeRegistros=0;$cuentaDeRegistros<$totalDeRegistros;$cuentaDeRegistros++){
        
$matrizDeDatos=mysql_fetch_array($hacerConsultaDeLecturaDeDatos);
        
$lineaDeDatos.="INSERT INTO $nombreDeTabla ("
        for (
$cuentaDeCampos 0$cuentaDeCampos $totalDeCampos;$cuentaDeCampos++){
          
$nombreDeCampo mysql_field_name($hacerConsultaDeLecturaDeDatos$cuentaDeCampos); 

          if(
$cuentaDeCampos == ($totalDeCampos 1)){ 
            
$lineaDeDatos.= $nombreDeCampo
          } else { 
            
$lineaDeDatos.= $nombreDeCampo.",";
          }
        }

        
$lineaDeDatos.=") VALUES (";

        for (
$cuentaDeCampos=0;$cuentaDeCampos $totalDeCampos;$cuentaDeCampos++){ 
          if(
$cuentaDeCampos == ($totalDeCampos 1)){ 
            
$lineaDeDatos.="'".addslashes($matrizDeDatos[$cuentaDeCampos])."'"
          } else { 
            
$lineaDeDatos.="'".addslashes($matrizDeDatos[$cuentaDeCampos])."',";
          }

        } 
        
$lineaDeDatos.= ");\n"
      } 
      
$lineaDeDatos.= "\n";
    }

    
$manejadorDelFicheroDeLaCopia fopen($ficheroDeLaCopia,"a+b"); 
    
fwrite($manejadorDelFicheroDeLaCopia$lineaDeDatos); 
    
fclose($manejadorDelFicheroDeLaCopia);    
  }
  
header('Content-type: text/x-delimtext;');
  
header('Content-Disposition: attachment; filename="'.$ficheroDeLaCopia.'"');
  
readfile($ficheroDeLaCopia);
  
unlink ($ficheroDeLaCopia);
  
    }
else
    {
header("location: ../conexion/logout.php");
}
?>
este realiza el backup de mi base de datos de maravilla, el problema que he encontrado es que no me esta poniendo el Engine=innodb , asi como la codificacion con la cual trab por ejemplo:
DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci


ademas he intentado que me muestre las relaciones que hay entre las distintas tablas por ejemplo que me las muestre asi:

Código:
ALTER TABLE `procedencia`
  ADD CONSTRAINT `procedencia_ibfk_1` FOREIGN KEY (`nocedula`) REFERENCES `estudiante` (`nocedula`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `procedencia_ibfk_2` FOREIGN KEY (`idMunicipio`) REFERENCES `municipio` (`idMunicipio`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `RefEstudiante92` FOREIGN KEY (`nocedula`) REFERENCES `estudiante` (`nocedula`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `RefEstudiante921` FOREIGN KEY (`nocedula`) REFERENCES `estudiante` (`nocedula`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `RefMunicipio89` FOREIGN KEY (`idMunicipio`, `idDepartamento`) REFERENCES `municipio` (`idMunicipio`, `idDepartamento`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `RefMunicipio891` FOREIGN KEY (`idMunicipio`, `idDepartamento`) REFERENCES `municipio` (`idMunicipio`, `idDepartamento`);
ademas de intentar de mil maneras que me incluya los procedimientos almacenados alguna idea???? muchas gracias
  #2 (permalink)  
Antiguo 05/04/2011, 16:20
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Mejorando backup de mysql

Holas,

Hay un SQL que te genera toda la creacion de tu Tabla:

Cita:
SHOW CREATE TABLE nombre_de_tu_table;

Saludos
Gildus
__________________
.: Gildus :.
  #3 (permalink)  
Antiguo 05/04/2011, 16:25
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Mejorando backup de mysql

Para tus procedures, funciones y/o triggers:

Cita:
SHOW TRIGGERS;
SHOW FUNCTION STATUS;
SHOW PROCEDURE STATUS;
Saludos
Gildus
__________________
.: Gildus :.
  #4 (permalink)  
Antiguo 11/04/2011, 12:25
Avatar de Deathmetalrules  
Fecha de Ingreso: diciembre-2010
Ubicación: Mas - aya
Mensajes: 65
Antigüedad: 13 años, 4 meses
Puntos: 8
Respuesta: Mejorando backup de mysql

Hola gildus....gracias por tus comentarios....


bueno a lo que yo me referia era al hecho de mejorar todo el codigo fuente para crear backup de las base de datos....
y que me muestre todas las relaciones y procedimientos almacenados dentro del archivo .sql al igual como hace los backup wamp server al momento de exportar los datos....
no se si me explique ....he trabajado mucho tratando de saber como hacer esto pero los resultados son bajos
  #5 (permalink)  
Antiguo 11/04/2011, 13:27
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Mejorando backup de mysql

Holas,

Cuando haces un:

Cita:
SHOW CREATE TABLE nombre_de_tu_table;
Alli puedes recuperar las relaciones que tiene la tabla con otras. Pero cuando haces un bakcup simplemente al inicio podrias colocar un:

Cita:
SET FOREIGN_KEY_CHECKS = 0;
Y recien ejecutar todo el script SQL con sus relaciones triggers, procedures, etc. y luego al final cuando termines de ejecutar el sql colocas:

Cita:
SET FOREIGN_KEY_CHECKS = 1;
y listo, con esto no habria necesidad de saber a detalle cual es la relacion.

Saludos
Gildus
__________________
.: Gildus :.
  #6 (permalink)  
Antiguo 15/04/2011, 15:43
Avatar de Deathmetalrules  
Fecha de Ingreso: diciembre-2010
Ubicación: Mas - aya
Mensajes: 65
Antigüedad: 13 años, 4 meses
Puntos: 8
Mensaje Respuesta: Mejorando backup de mysql

Hola nuevamente gildus he estado haciendo correcciones en el codigo fuente y pues encontre uno mas viable para hacer las mejoras repectivas

Código PHP:
<?php
include("../conexion/conexion.php");
session_start();
/* Reconocimiento a Fran86 # | YoDumpeo! | por fran86 <[email protected]> Tomado de Forosdelweb.com*/
$fechaDeLaCopia "-".date("d l-F-Y");    
$ficheroDeLaCopia =$dbname.$fechaDeLaCopia.".sql";
$drop true;
$tablas false;
$compresion false;
$conexion mysql_connect($servername,$dbusername,$dbpassword) or die(mysql_error());
@
mysql_select_db($dbname,$conexion) or die("No se pudo seleccionar la Base de Datos: "mysql_error());
if ( empty(
$tablas) ){
$consulta "SHOW TABLES FROM $dbname;";
$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];}}
$info['fecha'] = date("d-m-Y");
$info['hora'] = date('h:m:s');
$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]);
$usuario=$_SESSION['nombreusuario'];
$dump = <<<EOT
#=====================================================================
#--Generado el 
{$info['fecha']} a las {$info['hora']} por el usuario $usuario
#--Servidor: 
{$_SERVER['HTTP_HOST']} 
#--MySQL Version: 
{$info['mysqlver']}
#--PHP Version: 
{$info['phpver']}
#=====================================================================


--
-- Base de datos: `$dbname `
--

EOT;
foreach (
$tablas as $tabla) {
$sql "SET FOREIGN_KEY_CHECKS=0";   
    
$drop_table_query "";
    
$create_table_query "";
    
$insert_into_query "";
    if (
$drop) {
        
$drop_table_query "DROP TABLE IF EXISTS `$tabla`;";
    } else {
        
$drop_table_query "# No especificado.";
    }
    
$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].";";
    }
    
//Fin de $create_table_query
    
$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);
    }
        
//Fin de $insert_into_query
$sql "SET FOREIGN_KEY_CHECKS=1";  
$dump .= <<<EOT


--
-- Estructura de tabla para la tabla `$tabla`
--
$drop_table_query
$create_table_query

--
-- Volcar la base de datos para la tabla `$tabla`
--
$insert_into_query







EOT;


}

/* 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="'.$ficheroDeLaCopia.'"');
        
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>";
}

?>
el caso seria ver mostrar las los alter table...he probado con las opciones que me diste pero solo me arroja la clave primaria
  #7 (permalink)  
Antiguo 15/04/2011, 15:49
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Mejorando backup de mysql

Exportar el SQL ALTER TABLE???, eso si que es bien raro, para hacer dumpeos, hasta donde se no uso ALTER TABLE, es muy raro eso, no se entiende para que necesitas el ALTER TABLE.

Una consulta haz usado o probado el codigo de arriba?

Saludos
Gildus
__________________
.: Gildus :.
  #8 (permalink)  
Antiguo 15/04/2011, 15:54
Avatar de Deathmetalrules  
Fecha de Ingreso: diciembre-2010
Ubicación: Mas - aya
Mensajes: 65
Antigüedad: 13 años, 4 meses
Puntos: 8
Respuesta: Mejorando backup de mysql

si lo he probado y con el estoy haciendo los backup de mi base de datos
pero bueno hay ciertas cosas que me estan pidiendo y precisamente son esos famosos alter table y la importacion de los procedimientos almacenados y la verdad les he dicho que solo basta con obtener los benditos datos que necesitan

pero ellos quieren algo como lo que hace phpmyadmin


en verdad gracias por la paciencia....
  #9 (permalink)  
Antiguo 15/04/2011, 16:02
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Mejorando backup de mysql

Sabes como lo hace phpmyadmin?

O como es la sintaxis del SQL que desean?

Saludos
Gildus
__________________
.: Gildus :.
  #10 (permalink)  
Antiguo 15/04/2011, 16:09
Avatar de Deathmetalrules  
Fecha de Ingreso: diciembre-2010
Ubicación: Mas - aya
Mensajes: 65
Antigüedad: 13 años, 4 meses
Puntos: 8
Mensaje Respuesta: Mejorando backup de mysql

bueno he estudiado un poco com lo hace phpmyadmin pero recorda que es un lenguaje orientado a objetos y muy complicado .......

lo que desean basicamente es:
1- hacer un backup de la base de datos ( esto ya lo esta haciendo)
2-que muestre los alter table (aca esta feo y ellos estan locos )
3-mostrar los procedimientos que estoy trab en ello.


el punto numero 2 es lo mas feo y ridiculo porque se supone que al hacer un create table se esta definiendo la clave primaria y las foraneas .....

Etiquetas: backup, mysql
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 00:56.