Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/01/2014, 08:48
Avatar de a2garrido
a2garrido
 
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 10 meses
Puntos: 2
Información Respuesta: BACKUP Y RESTORE de MYSQL (muy bueno)

1º PARTE DEL SCRIPT DE BACKUP:
Código PHP:
[HIGHLIGHT="PHP"]

<?php
//Parametros de conexion, Se puden pasar como argumentos GET     ?host=10.44.130.21&bd=bdprincipal o esperar a un formulario
$host=empty($_GET["host"])? "localhost":$_GET["host"];  //valor predeterminado 
$usuario=empty($_GET["usuario"])? "root":$_GET["usuario"]; //valor predeterminado
if (empty($_GET["passwd"]) || empty($_GET["bd"])){ //OBLIGATORIOS
    
?>
    CREAR COPIA DE SEGURIDAD MySQL
    <FORM action="<?php echo $_SERVER['PHP_SELF']?>" method="GET" >
    <b>Servidor :</b> <INPUT type="text" name="host" id ="host" value="localhost">
    <b>Base de datos :</b> <INPUT type="text" name="bd" id ="bd" value="mydb"><br />
    
    <b>Usuario :&nbsp;</b> <INPUT type="text" name="usuario" id ="usuario" value="root">
    <b>Contraseña &nbsp;&nbsp;&nbsp;&nbsp;: </b><INPUT type="password" name="passwd" id="passwd" value="gtjclm"><br />
    
    <b>Compresion : </b><select name="compresion" >
            <option value="false" selected="selected">Sin compresion</option>
            <option value="zip">zip</option>
            <option value="gz">gz</option>
            <option value="bz2">bz2</option>
            </select><br />
    <b>lista de tablas :</b> <INPUT type="text" name="tablas" id ="tablas" value="" size="80" TITLE="Dejar en blanco para copiar todas las tablas, o bien escribir el nombre de tablas separado por coma. "> 
    <br /><input name="SoloTablas" id="SoloTablas" type="checkbox" value="true" TITLE="No copiar vistas, triggers, function y procedures."/>  <b>Solo tablas (sin routinas de triggers, procedures, functions o eventos)</b> 
    <br /><input name="EstructuraBD" id="EstructuraBD" type="checkbox" value="true" checked="checked" TITLE="Copiar  definiciones de estructura de Base de datos"/>  <b>Definicion de Estructura </b> 
    <br /><input name="InsertDatos" id="InsertDatos" type="checkbox" value="true" checked="checked" TITLE="Copiar  inserciones de datos "/>  <b>Inserciones de Datos</b> 
    <br /><b><input name="CreateDataBase" id="CreateDataBase" type="checkbox" value="true" checked="checked" TITLE="Este dato se usa para copias de seguridad que no tienen el nombre de la base de datos y por tanto se pueden restaurar en cualquier otra." />  Generar CREATE DATABASE IF NOT EXISTS</b> 
    <br /><b>DELIMITER en triggers,procedures, function:</b> <INPUT type="text" name="DELIMITER" id ="DELIMITER" value="$$" TITLE="Caracteres que limitaran el final de una routina(funciones, procedores, triggers y events) "><br />
    <br /><INPUT type="submit" name="upload" value="[ Crear copia ]">
    </FORM>
    <?php
    
exit();
}
$bd=empty($_GET["bd"])? die("se precisa el argumento bd"):$_GET["bd"]; //parametro obligatorio 
$passwd=$_GET["passwd"];
// Tipo de compresion. 
// Puede ser "zip", "gz", "bz2", o false (sin comprimir)
$compresion = empty($_GET["compresion"])? "zip":$_GET["compresion"];
// Determina si será borrada el objeto (si existe) cuando  restauremos .           
$drop = empty($_GET["drop"])? true :$_GET["drop"]; //valor predeterminadotrue;
$DELIMITER = empty($_GET["DELIMITER"])? "$$" :$_GET["DELIMITER"]; //valor predeterminadotrue;
$SoloTablas= isset($_GET["SoloTablas"]) && ($_GET['SoloTablas'] =="true")? true false;
$EstructuraBD= isset($_GET["EstructuraBD"]) && ($_GET['EstructuraBD'] =="true")? true false;
$InsertDatos= isset($_GET["InsertDatos"]) && ($_GET['InsertDatos'] =="true")? true false;
$CreateDataBase = isset($_GET['CreateDataBase']) && ($_GET['CreateDataBase']=="true")  ? true false;
if ( empty(
$_GET["tablas"]))
    
$tablas false//un array con las tablas de la bd que se desean copiar.
else{
    
$tablas =explode(",",$_GET["tablas"]);
    foreach(
$tablas as $num => $tabla$tablas[$num] =trim($tabla);
}
//--------------------- PARAMETRIZACION: -------------------------------------------------------------------- 

//las Views de la bd que se desean copiar en el orden adecuado. Puede atacar a una tabla que liste en el orden deseado las views para tener encuenta las dependencias  
$viewSQL  "SHOW FULL TABLES FROM `".$bd."` WHERE Table_Type='VIEW';"//SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :database AND TABLE_NAME = :table
$tablaSQL "SHOW FULL TABLES FROM $bd WHERE Table_Type='BASE TABLE';"//SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :database AND TABLE_NAME = :table
set_time_limit(300); //alarga el timeout

// CONEXION 
$conexion = new mysqli($host$usuario$passwd$bd);
if (
$conexion->connect_errno) {
    
printf("No se puede conectar con el servidor MySQL: %s\n"$conexion->connect_error);
    exit();
}
//SET NAMES
//$consulta="SHOW CREATE DATABASE `".$bd."`;";
//$respuesta = $conexion->query($consulta)or die("No se puede ejecutar la consulta: $consulta MySQL: \n". $conexion->error);
//if ($fila = $respuesta->fetch_array(MYSQLI_NUM)) {//CREATE DATABASE `kk` /*!40100 DEFAULT CHARACTER SET latin1 */
//    $s= stristr($fila[1]," SET ");
//    $z=explode(" ",$s);
//    $SetNames="/*!40101 SET NAMES ".$z[2]." */;";
//}else $SetNames="/*!40101 SET NAMES utf8 */;";
//$respuesta->free();

// Se busca las tablas en la base de datos 
if (empty ($tablas) ) {
    
$respuesta $conexion->query($tablaSQL)or die("No se puede ejecutar la consulta: $tablaSQL MySQL: \n"$conexion->error);
    while (
$fila $respuesta->fetch_array(MYSQLI_NUM)) {
            
$tablas[] = $fila[0];
    }
    
$respuesta->free();
}

/* Se crea la cabecera del archivo */
$info['dumpversion'] = "2.15";
$info['fecha'] = date ("d-m-Y");
$info['hora'] = date ("h:m:s A");
$info['mysqlver'] = $conexion->server_info;
$info['phpver'] = phpversion ();
ob_start ();
$representacion ob_get_contents ();
ob_end_clean  ();
preg_match_all ('/(\[\d+\] => .*)\n/'$representacion$matches);
$info['tablas'] = implode (";  "$tablas);

$FicheroOUT=$bd."_backup_".$info['fecha'].".sql"//Este es el nombre del archivo a generar 
$dump = <<<EOT
# +===================================================================
# | Generado el 
{$info['fecha']} a las {$info['hora']} 
# | Servidor: 
{$_SERVER['HTTP_HOST']}
# | MySQL Version: 
{$info['mysqlver']}
# | PHP Version: 
{$info['phpver']}
# | Base de datos: '$bd'
# | Tablas: 
{$info['tablas']}
# +-------------------------------------------------------------------
# Si tienen tablas con relacion y no estan en orden dara problemas al recuperar datos. Para evitarlo:
SET FOREIGN_KEY_CHECKS=0; 
SET time_zone = '+00:00';
SET sql_mode = ''; 

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

EOT;

if (
$CreateDataBase && $EstructuraBD)
$dump .= <<<EOT

CREATE DATABASE IF NOT EXISTS `$bd`;
 
USE `$bd`;

EOT;

foreach (
$tablas as $tabla) {
    
$drop_table_query "";
    
$create_table_query "";
    
$insert_into_query "";
    if (
$EstructuraBD){
        
// 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 DROP.";
        }
    
        
// Se halla el query que será capaz de recrear la estructura de la tabla. 
        
$create_table_query "";
        
$consulta "SHOW CREATE TABLE `".$tabla."`;";
        
$respuesta $conexion->query($consulta) or die("No se puede ejecutar la consulta: $consulta MySQL: "$conexion->error);
        while (
$fila $respuesta->fetch_array(MYSQLI_NUM)) {
             
$create_table_query $fila[1].";";
        }
        
$respuesta->free();
        
$dump .= <<<EOT
# | Vaciado de tabla '$tabla'
# +-------------------------------------
$drop_table_query

# | Estructura de la tabla '$tabla'
# +-------------------------------------
$create_table_query
        
EOT;
    }
[/
HIGHLIGHT]