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 : </b> <INPUT type="text" name="usuario" id ="usuario" value="root">
<b>Contraseña : </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]