Foros del Web » Programando para Internet » PHP »

BACKUP Y RESTORE de MYSQL (muy bueno)

Estas en el tema de BACKUP Y RESTORE de MYSQL (muy bueno) en el foro de PHP en Foros del Web. He trabajado largo y tendido adaptando diversos scripts y sobretodo probando con distintos tamaños de Bases de Datos y usando la nueva estension MySQLi. 1º ...
  #1 (permalink)  
Antiguo 02/01/2014, 07:25
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 meses
Puntos: 2
Información BACKUP Y RESTORE de MYSQL (muy bueno)

He trabajado largo y tendido adaptando diversos scripts y sobretodo probando con distintos tamaños de Bases de Datos y usando la nueva estension MySQLi.
1º script Backup que toma los valores $_GET y si no los tiene los pide mediante un FORM:[URL="https://docs.google.com/document/d/1S3gXz8Nj5Cy1d0Ud1zASMUBOzvTQAWa9SL02TvHTcHs/edit?usp=sharing"]https://docs.google.com/document/d/1S3gXz8Nj5Cy1d0Ud1zASMUBOzvTQAWa9SL02TvHTcHs/edit?usp=sharing[/URL](he puesto un enlace porque este foro no me permite colgar más de 10000 caracteres. (si puedo lo colocare por trozos en respuestas a este tema.

2º script RESTORE

Código PHP:
[HIGHLIGHT="PHP"]
<?php
error_reporting
(E_ALL E_NOTICE);
ini_set('upload_max_filesize''80M');
ini_set('post_max_size''80M');
ini_set('memory_limit''-1'); //evita el error Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)...
ini_set('max_execution_time'300); // es lo mismo que set_time_limit(300) ;
ini_set('mysql.connect_timeout'300);
ini_set('default_socket_timeout'300);
//En MYSQL archivo "my.ini" ==> max_allowed_packet = 22M
//"SET GLOBAL max_allowed_packet = 22M;"
//"SET GLOBAL connect_timeout = 20;"
//"SET GLOBAL net_read_timeout=50;"
//esto no se si solo es modificable en php.ini
ini_set('file_uploads','On'); 
ini_set('upload_tmp_dir','upload');

function 
run_split_sql($uploadfile$host$usuario,$passwd){
    
$strSQLs file_get_contents($uploadfile);
    
unlink($uploadfile);
    
//  Elimina lineas vacias o que empiezan por -- #   //   o entre /* y */
    // Elimna los espacios en blanco entre ; y \r\n
    // handle DOS and Mac encoded linebreaks
                    
$strSQLs=preg_replace("/\r\n$/","\n",$strSQLs);
                    
$strSQLs=preg_replace("/\r$/","\n",$strSQLs);
    
$strSQLs trim(preg_replace('/ {2,}/'' '$strSQLs));    // ----- remove multiple spaces ----- 
    
$strSQLs str_replace("\r","",$strSQLs);                     //los \r\n los dejamos solo en \n
    
$lines=explode("\n",$strSQLs);
    
$strSQLs = array();
    
$in_comment false;
    foreach (
$lines as $key => $line){
        
$line=trim($line); //preg_replace("#.*/#","",$line)
        
$ignoralinea=(( "#" == $line[0] ) || ("--" == substr($line,0,2)) || (!$line) || ($line==""));
        if (!
$ignoralinea){
            
//Eliminar comentarios que empiezan por /* y terminan por */    
            
if( preg_match("/^\/\*/", ($line)) )       $in_comment true;
            if( !
$in_comment )     $strSQLs[] = $line ;
            if( 
preg_match("/\*\//", ($line)) )      $in_comment false;
        }
    }
    unset(
$lines);
    
// Particionar en sentencias
    
$IncludeDelimiter=false;
    
$delimiter=";";
    
$delimiterLen1;
    
$sql="";
    
// CONEXION 
    
$conexion = new mysqli($host$usuario$passwd) or die ("No se puede conectar con el servidor MySQL: %s\n"$conexion->connect_error);
    
$NumLin=0;
    foreach (
$strSQLs as $key => $line){
        
        if (
"DELIMITER" == substr($line,0,9)){  //empieza por DELIMITER
            
$D=explode(" ",$line);
            
$delimiter$D[1];
            
$delimiterLenstrlen($delimiter);
            
$sql=($IncludeDelimiter)? $line ."\n" "";
        }elseif (
substr($line,-1*$delimiterLen) == $delimiter) { //hemos alcanzado el  Delimiter
                
if (($NumLinea++ % 100)==0) {// ver con que base de datos estamos para poder reconectar caso de error
                        
$respuesta $conexion->query("select database() as db");
                        
$row $respuesta->fetch_array(MYSQLI_NUM);
                        
$db=$row[0];
                }
                
$sql .= ($IncludeDelimiter)? $line substr($line,0,-1*$delimiterLen);
                
$respuesta $conexion->query($sql);
                if (
$respuesta) echo "<br>$NumLinea Ejecutado:  "str_replace("\n"," ",substr($sql,0,130))."...";
                    else {
                        echo 
"<br><b><u>$NumLinea E R R O R: ".$conexion->errno." :</u></b>"$conexion->error ." ====> "substr($sql,0,1022)."...";
                        if (!
$conexion->ping() ){ 
                            
$conexion = new mysqli($host$usuario$passwd) or die ("No se puede RECONECTAR con el servidor MySQL: %s\n"$conexion->connect_error);
                            
$conexion->select_db($db);
                            
$respuesta $conexion->query($sql);
                            if (
$respuesta) echo "<br>$NumLinea REEJECUTADO:  "str_replace("\n"," ",substr($sql,0,130))."...";
                                else echo 
"<br><b><u>$NumLinea REPITE-E R R O R: ".$conexion->errno." :</u></b>"$conexion->error ." ====> "substr($sql,0,1022)."...";
                        }
                    }    
                        
                
$sql="";
        } else { 
//no hemos alcanzado el delimitador el delimitador siempre debe estar al final de linea
                
$sql .= $line ."\n";
        }
    }
    
$conexion->close();    
}

if (isset(
$_POST['upload'])) {
    
$uploadfile "./" basename($_FILES['userfile']['name']);
    print 
'<pre>';
    switch (
$_FILES['userfile']['error']){
        case 
0:// UPLOAD_ERR_OK
            
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
                    echo 
"El archivo <b> $uploadfile </b> es válido y fue cargado exitosamente.<br>";
                    
$host"localhost";  //valor predeterminado 
                    
$usuario=empty($_POST["usuario"])? "root":$_POST["usuario"]; //valor predeterminado
                    
$passwd$_POST["passwd"];
                    
run_split_sql($uploadfile$host$usuario,$passwd );
            } else     echo 
"<br>¡Posible errror en carga de archivos!";
            break;
        case 
1// UPLOAD_ERR_INI_SIZE
            
echo "<br>El archivo sobrepasa el limite autorizado por el servidor(archivo php.ini) !";
            break;
        case 
2// UPLOAD_ERR_FORM_SIZE
            
echo "<br>El archivo sobrepasa el limite autorizado en el formulario HTML !";
            break;
        case 
3// UPLOAD_ERR_PARTIAL
            
echo "<br>El envio del archivo ha sido suspendido durante la transferencia!";
            break;
        case 
4// UPLOAD_ERR_NO_FILE
            
echo "<br>El archivo que ha enviado tiene un tamaño nulo !";
            break;
        default: 
            echo 
"<br>ERROR DESCONOCIDO !"
            break;
    }
    print 
"</pre>";
    unset(
$_POST['upload']);
    
$_POST[]=array();
}
?>
RESTAURAR COPIA DE SEGURIDAD MySQL. (elegir Fichero .sql)
<FORM action="<?php echo $_SERVER['PHP_SELF']?>" method="POST" enctype="multipart/form-data">
    <INPUT type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAXFILESIZE?>">
    <INPUT type="file" name="userfile"><br />
    <b><u>Usuario :</u></b> <INPUT type="text" name="usuario" id ="usuario" value="root"><br />
    <u><b>Contraseña : </u></b> <INPUT type="text" name="passwd" id="passwd" value=""><br />
    <u><b>CREATE DATABASE IF NOT EXISTS </u></b> (opcional): <INPUT type="text" name="bd" id="bd" value="mydb"> ( <u>nota:</u> 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.)
    <br /><INPUT type="submit" name="upload" value="[ Restaurar ]">
</FORM>
[/HIGHLIGHT]
  #2 (permalink)  
Antiguo 02/01/2014, 08:48
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 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]
  #3 (permalink)  
Antiguo 02/01/2014, 08:50
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 meses
Puntos: 2
Información Respuesta: BACKUP Y RESTORE de MYSQL (muy bueno)

2ª PARTE DEL SCRIPT DE BACKUP:
Código PHP:
    // Se generan los INSERT de los datos. 
    
if ($InsertDatos && ($tabla != "audittrail")){//no salvamos datos de audittrail
            
$insert_into_query "";
            
$consulta "SELECT * FROM `".$tabla."`;";
            
$respuesta $conexion->query($consulta) or die("No se puede ejecutar la consulta: $consulta MySQL: "$conexion->error);
            if (
$fila $respuesta->fetch_array(MYSQLI_ASSOC)){ //generar una sola vez la cabecera del insert
                
foreach ($fila  as $columna  => $valor){
                    
$campos[] = "`".$conexion->real_escape_string($columna)."`";
                }
                
$insertSQLHead="\r\nCOMMIT;\r\nINSERT IGNORE INTO `$tabla` (" implode(", "$campos) . ") VALUES ";
                unset (
$campos);
                
$x=1;
                do {
                    foreach (
$fila  as $columna  => $valor) {
                        if ( 
gettype ($valor) == "NULL" ) {
                            
$values[] = "NULL";
                        } else {
                            
$values[] = "'".$conexion->real_escape_string($fila[$columna])."'"//guardar cada valor de campo
                        
}
                    }
                    
$regs[] ="\r\n      (" implode(", "$values) . ")"//meter en un array todos los valores de cada registro entre () y separado por ,
                    
unset ($values);
                    if (
$x++ == 300) {
                        
$insert_into_query .= $insertSQLHead implode(", "$regs) . ";"//generar un insert cada 300 registros
                        
unset ($regs);
                        
$x=1;
                    }
                } while (
$fila $respuesta->fetch_array(MYSQLI_ASSOC)) ;
                if (
$x==1)     {
                    
$insert_into_query .= "\r\nCOMMIT;\r\n";
                } else {
                    
$insert_into_query .= $insertSQLHead.implode (", "$regs).";\r\nCOMMIT;\r\n";
                    unset (
$regs);
                }   
            }
            
$respuesta->free();
            
$dump .= "
# | Carga de datos de la tabla '$tabla'
# +-------------------------------------
$insert_into_query
"
;
    } 
// insert
}
if (!
$SoloTablas && $EstructuraBD) {
// copiar ROUTINAS (PROCEDURE o FUNCTION  (se funde con un array de Views para evitar posibles dependencias en la restaruación (una vista basada en otra)
// tanto de otras routinas como de vistas no creadas).
// Falla si hay una function o un procedure que se llame igual que una vista.
    
$arrRoutinasViews =array();
    
//$arraySQL=array("SELECT `ROUTINE_TYPE`as `Type`,`ROUTINE_SCHEMA` as `Db`, `ROUTINE_NAME` AS `Name` FROM INFORMATION_SCHEMA.`ROUTINES` WHERE INFORMATION_SCHEMA.ROUTINES.`ROUTINE_SCHEMA` LIKE '". $bd ."';");
    
$arraySQL=array("SHOW FUNCTION STATUS where Db like '"$bd ."';","SHOW PROCEDURE STATUS where Db like '"$bd ."';");
    foreach (
$arraySQL as $sql) {
        
$routinasSQL $conexion->query($sql) or die("No se puede ejecutar la consulta: $sql MySQL: "$conexion->error);
        while (
$routina $routinasSQL->fetch_array(MYSQLI_ASSOC)) {
            
$nombre="`".$routina["Db"]."`.`".$routina["Name"]."`";
            
$sql='SHOW CREATE '.$routina["Type"].' '.$nombre;
            
$routinaDDL $conexion->query($sql) or die("No se puede ejecutar la consulta: $sql MySQL: "$conexion->error);
            
$rowDDL $routinaDDL->fetch_array(MYSQLI_BOTH);
            
$codigo="CREATE ".stristr($rowDDL[2],$routina["Type"]);
            
$arrRoutinasViews[$nombre]= "\r\n\r\n";
            if (
$drop$arrRoutinasViews[$nombre].="DROP ".$routina["Type"]." IF EXISTS ".$nombre";\r\n";
            if (
$DELIMITER==";"
                
$arrRoutinasViews[$nombre].="\r\n".$codigo.";\r\n# ------------------------------------------------------------------------------------------";    
            else
                
$arrRoutinasViews[$nombre].="DELIMITER ".$DELIMITER."\r\n".$codigo."\r\n".$DELIMITER."\r\nDELIMITER ;\r\n# ------------------------------------------------------------------------------------------";    
            
$routinaDDL->free();
        }
        
$routinasSQL->free();
    }
//VIEWs 
    
$respuesta $conexion->query($viewSQL) or die("No se puede ejecutar la consulta: MySQL: $viewSQL "$conexion->error);
    while (
$fila $respuesta->fetch_array(MYSQLI_NUM)) {
        
$consulta ="SHOW CREATE VIEW `".$bd."`.`".$fila[0]."`;";
        
$respuestaView $conexion->query($consulta) or die("No se puede ejecutar la consulta: $consulta MySQL: "$conexion->error);
        
$filaView $respuestaView->fetch_array(MYSQLI_NUM);
        
// vamos a eliminar lo que hay entre CREATE y VIEW para evitar que falle pq los usuarios creadores no existan en la máquina de restaruación 
        
$codigo="CREATE ".stristr($filaView[1],"View");
        
$arrRoutinasViews[$fila[0]]="\r\n";
        if (
$drop$arrRoutinasViews[$fila[0]].="DROP VIEW IF EXISTS `".$bd."`.`".$fila[0]."`;\r\n";
        
$arrRoutinasViews[$fila[0]].=$codigo."; \r\n";
        
$respuestaView->free();
    }
    
$respuesta->free();

    
// cargar VIEWs y ROUTINAS de modo que evite las dependencias en restauración:
    // cada elemento busca si está contenido en la definición de otros pendientes de definir en cuyo caso espera a definir primero los que él depende.
    
$ciclos=0;
    while ((
count($arrRoutinasViews)>0)&& (++$ciclos<30)){
        foreach(
$arrRoutinasViews as $indice => $valor){ 
            
$encontrado=false;
            foreach(
$arrRoutinasViews as $key => $val) {//buscar en los restantes
                
if ($indice != $key) {
                    if (
stripos($valor,"`".$key."`") !== false){ // lo ponemos entre "`" para garantizar que no es un prefijo de otra palabra. Esto obliga que las definiciones usen esta nomenclatura.
                        
$encontrado=true;
                        break;
                    }    
                }
            }
            if (!
$encontrado){ //imprimirlo y borrar elemento de array
                
$dump .= $valor
                unset(
$arrRoutinasViews[$indice]);
            }
        }
    }
    if (
$ciclos>=30) {
        echo 
"SET NEW='Superados 30 ciclos en busqueda de dependencias jerarquicas (quizas hay dependencias circulares mutuas)';";
        
$FicheroOUT="ERROR_bucle_$bd.sql";
    }

    
//TRIGGERs. Al estar al final no hay problema de que dependa de funciones o vistas, pues a estas alturas de restaruaciónya estarán creadas.
    
$consulta "SHOW FULL TRIGGERS FROM `".$bd."`;"//SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :database AND TABLE_NAME = :table
    
$respuesta $conexion->query($consulta) or die ("No se puede ejecutar la consulta: $consulta MySQL:"$conexion->error); 
    while (
$fila $respuesta->fetch_array(MYSQLI_NUM)) {
        if (
$drop$dump .="\r\nDROP TRIGGER IF EXISTS `".$bd."`.`".$fila[0]."`;\r\n";
        if (
$DELIMITER!=";")     $dump .="\r\nDELIMITER $DELIMITER\r\n";
        
$dump .= "Create trigger `".$bd."`.`".$fila[0]."`  ".$fila[4]." ".$fila[1]." ON `".$fila[2]."` \r\n";
        
$dump .= "      for each row \r\n";
        
$dump .= $fila[3];
        if (
$DELIMITER!=";")     $dump .="\r\n".$DELIMITER."\r\nDELIMITER  ";
        
$dump .=";\r\n";
    }
    
$respuesta->free();
// not $SoloTablas
//cerramos la conexión con la BBDD
$conexion->close();
 
/* Envio */
if ( !headers_sent () ) {
    
header ("Pragma: no-cache");
    
header ("Expires: 0");
    
header ("Content-Transfer-Encoding: binary");
    switch (
$compresion) {
    case 
"zip":
            
$enzipado = new ZipArchive();
            if (
$enzipado->open($FicheroOUT.".zip"ZIPARCHIVE::CREATE )!==TRUE)     exit("No se pudo abrir el archivo\n");
            
$enzipado->addFromString($FicheroOUT$dump);
            
$enzipado->close();
        
header ("Content-Disposition: attachment; filename=$FicheroOUT.zip");
        
header ("Content-type: application/zip");
        
header("Cache-Control: no-cache, must-revalidate"); 
        
header("Expires: 0");
        
readfile($FicheroOUT.".zip");
        
unlink($FicheroOUT.".zip");
        break;
    
    case 
"gz":
        
header ("Content-Disposition: attachment; filename=$FicheroOUT.gz");
        
header ("Content-type: application/x-gzip");
        echo  
gzencode ($dump9);
        break;
    case 
"bz2"
        
header ("Content-Disposition: attachment; filename=$FicheroOUT.bz2");
        
header ("Content-type: application/x-bzip2");
        echo  
bzcompress ($dump9);
        break;
    default:
        
header ("Content-Disposition: attachment; filename=$FicheroOUT");
        
header ("Content-type: application/force-download");
        echo  
$dump;
    }
} else {
    echo  
"<b>ATENCION: Probablemente ha ocurrido un error de envio de headers</b><br />\r\n <pre>\r\n $dump\r\n </pre>";
}
?> 
  #4 (permalink)  
Antiguo 27/03/2016, 01:35
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: BACKUP Y RESTORE de MYSQL (muy bueno)

Restaurar.php (corrige problemas de acentos y añade gestion SQL complementaria a PhpMyAdmin):
1ª PARTE
Código PHP:
<?php
header
("Content-Type: text/html;charset=utf-8");
setlocale(LC_ALL'es_ES');

error_reporting(E_ALL E_NOTICE);
ini_set('upload_max_filesize''80M');
ini_set('post_max_size''80M');
ini_set('memory_limit''-1'); //evita el error Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)...
ini_set('max_execution_time'300); // es lo mismo que set_time_limit(300) ;
ini_set('mysql.connect_timeout'300);
ini_set('default_socket_timeout'300);
// En MYSQL archivo "my.ini" o "my.cnf" ==> max_allowed_packet = 22M
//"SET GLOBAL max_allowed_packet = 22M;"
//"SET GLOBAL net_read_timeout=50;"
//esto no se si solo es modificable en php.ini:
ini_set('file_uploads','On'); 
ini_set('upload_tmp_dir','upload');
set_time_limit(300); //alarga el timeout


    
$host=empty($_POST["host"])? "localhost":$_POST["host"];  //valor predeterminado 
$usuario=empty($_POST["usuario"])? "root":$_POST["usuario"]; //valor predeterminado
$passwd= empty($_POST["passwd"])? "gtjclm":$_POST["passwd"]; //valor predeterminado
$BD$_POST["BD"];    

function 
convertir_utf8$cadena ) { 
    if ( 
strlen(utf8_decode($cadena)) == strlen($cadena) ) {           
                
// $cadena is not UTF-8            
        
return iconv("ISO-8859-1""UTF-8//TRANSLIT"$cadena);
    } else {    
// already UTF-8
        
return $cadena;
    }
    
// Alternativa0 $strSQLs = mb_convert_encoding($strSQLs, 'HTML-ENTITIES', "UTF-8");
    // Alternativa1 $strSQLs = iconv('ISO-8859-1','UTF-8//TRANSLIT',$strSQLs);
    // Alternativa2 $strSQLs = mb_convert_encoding($strSQLs, 'UTF-8',  mb_detect_encoding($strSQLs, 'UTF-8, ISO-8859-1', true));
}
                
function 
Debug($Texto,$variable,$crear=false){
   if (
$gestor fopen("log.txt", ($crear)?'w':'a')){ 
           
$t microtime(true);
        
$micro sprintf("%06d",($t floor($t)) * 1000000);
          
fwrite($gestordate("Y-m-d H:i:s.").$micro ."==***==== $Texto ===***===\r\n".print_r($variable,true)."\r\n") ;
         
fclose($gestor); 
   } else die(
"NO SE PUEDE CREAR log.txt");
}
function 
CadenaAcotada($Cadena,$CadenaInicio,$CadenaFinal){
    
$inicio=stripos(" ".$Cadena,$CadenaInicio);//ponemos un espacio para distinguir entre no encontrado o estar al prinicipio
    
if ($inicio) {
        
$inicio += strlen($CadenaInicio)-1;
        
$fin=stripos($Cadena,$CadenaFinal,$inicio);
        if (!
$fin) return false;
        return 
substr($Cadena,$inicio,$fin-$inicio);
    }else  return 
false;
}
function 
TableToHTML($conexion,$strSQL){
    
//$conexion  viene de hacer $conexion = new mysqli(...);
    //$strSQL es el SQL que retorna tegistos p.ej. SELECT
    
$rs $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
    
$num_rows$rs->num_rows;
    if ( 
$num_rows <> 0) {
            
$regSELECT$rs->fetch_assoc();
            
$strHTML '<table border="1" cellpadding="10" cellspacing="1" > <thead> <tr>';
            
$x=0;
            foreach (
$regSELECT as $key=>$value) {
                
$strHTML .= "<th><b>".$key."</b></th>";
            }     
            
$strHTML .= "</tr> </thead> <tbody>";
            do {
                
$strHTML .= "<tr>";
                
$x=0;
                foreach (
$regSELECT as $value) {
                    
$strHTML .= "<td > ".$value." </td>";                                
                }
                
$strHTML .= "</tr>";
            } While  (
$regSELECT$rs->fetch_assoc());
            
$strHTML .= " </tbody> </table>";
            return 
nl2br($strHTML);
    }
    return 
"Sin registros en resultado";
}

function 
run_sql($strSQLs,$BD$host$usuario,$passwd$DropDataBase,$InsertDatos,$VerSoloErrores,$tblName){
    
$lines=explode("\n",$strSQLs);
    
$strSQLs = array();
    
$in_comment false;
    foreach (
$lines as $key => $line){
        
$line=trim($line); //preg_replace("#.*/#","",$line)
        
$ignoralinea=(( "#" == $line[0] ) || ("--" == substr($line,0,2)) || (!$line) || ($line==""));
        if (!
$ignoralinea){
            
//Eliminar comentarios que empiezan por /* y terminan por */    
            
if( preg_match("/^\/\*/", ($line)) )       $in_comment true;
            if( !
$in_comment )     $strSQLs[] = $line ;
            if( 
preg_match("/\*\//", ($line)) )      $in_comment false;
        }
    }
    unset(
$lines);
    
// Particionar en sentencias
    
$IncludeDelimiter=false;
    
$delimiter=";";
    
$delimiterLen1;
    
$sql="";
    
// CONEXION 
    
$conexion = new mysqli($host$usuario$passwd) or die ("No se puede conectar con el servidor MySQL: %s\n"$conexion->connect_error);
    if (
$conexion->connect_errno) {
        
printf("No se puede conectar con el servidor MySQL: %s\n"$conexion->connect_error);
        exit();
    }
    if (!
$conexion->set_charset("utf8")) {  // cambiar el conjunto de caracteres a utf8 
        
printf("Error cargando el conjunto de caracteres utf8: %s\n"$conexion->error);
        exit();
    }
    if (
$DropDataBase) {
        
$respuesta $conexion->query("DROP DATABASE ".$BD);
    }
     
    
$NumLin=0;
    foreach (
$strSQLs as $key => $line){
        if (
"DELIMITER" == substr($line,0,9)){  //empieza por DELIMITER
            
$D=explode(" ",$line);
            
$delimiter$D[1];
            
$delimiterLenstrlen($delimiter);
            
$sql=($IncludeDelimiter)? $line ."\n" "";
        }elseif (
substr($line,-1*$delimiterLen) == $delimiter) { //hemos alcanzado el  Delimiter
                
if (($NumLinea++ % 100)==0) {// ver con que base de datos estamos para poder reconectar caso de error
                        
                        
$respuesta $conexion->query("select database() as db");
                        
$row $respuesta->fetch_array(MYSQLI_NUM);
                        
$db=$row[0];
                }
                
$sql .= ($IncludeDelimiter)? $line substr($line,0,-1*$delimiterLen);
                
$sqlInsert = (("INSERT"==substr($sql,0,6)) || ("COMMIT"==substr($sql,0,6))) ;
                if ((
$InsertDatos && $sqlInsert ) || !$sqlInsert){
                    if (!empty(
$tblName)) {
                    
/* restaurar solo una tabla o una vista --> sólo ejecutar las lineas que empiecen por USE,    DROP TABLE, CREATE TABLE, 
                    INSERT IGNORE,    DROP VIEW,    CREATE VIEW, Create trigger
                    */
                    
if ("USE" == strtoupper(substr($sql,0,3))){
                        
$db =substr($sql,5,strlen($sql)-7);
                        
$RunSQL true;
                    } elseif (
"CREATE DATABASE" == strtoupper(substr($sql,0,15))){
                        
$RunSQL true;
                    } else {
                        
$Instruccion=strtoupper(substr($sql,0,10));
                        
$TrozoTXT=explode("`",$sql);
                        switch (
$Instruccion){
                            case 
"DROP TABLE":
                            case 
"CREATE TAB":
                            case 
"DROP VIEW ":
                            case 
"CREATE VIE":
                                
// $tablePos = 3;
                                // break;
                            
case "DROP TRIGG"
                            case 
"INSERT IGN":
                                
$tablePos 1;
                                break;
                            case 
"CREATE TRI":
                                
$tablePos 5;
                        }    
                        if (
$TrozoTXT[$tablePos+1] === "."$tablePos += 2//incluye el nombre de BBDD
                        
$RunSQL= ($tblName == $TrozoTXT[$tablePos]);
                    }    
                } else {
                    
$RunSQL true;
                }
                if (
$RunSQL){
                    
$respuesta $conexion->query($sql);
                    if (
$respuesta){ 
                        if (!
$VerSoloErrores) echo "<br>$NumLinea Ejecutado:  "strtr((strlen($sql)>100)? substr($sql,0,100)."..." $sql, array("\n" => " "));
                    }else {
                            echo 
"<br><b><u>$NumLinea E R R O R: ".$conexion->errno." :</u></b>"$conexion->error ." ====> "substr($sql,0,1022)."...";
                            if (!
$conexion->ping() ){ 
                                
$conexion = new mysqli($host$usuario$passwd) or die ("No se puede RECONECTAR con el servidor MySQL: %s\n"$conexion->connect_error);
                                if (!
$conexion->set_charset("utf8")) {  // cambiar el conjunto de caracteres a utf8 
                                        
printf("Error cargando el conjunto de caracteres utf8: %s\n"$conexion->error);
                                        exit();
                                }
                                
$conexion->select_db($db);
                                
$respuesta $conexion->query($sql);
                                if (
$respuesta) echo "<br>$NumLinea REEJECUTADO:  "strtr(substr($sql,0,130),array("\n" => " ")) . "...";
                                    else echo 
"<br><b><u>$NumLinea REPITE-E R R O R: ".$conexion->errno." :</u></b>"$conexion->error ." ====> "substr($sql,0,1022)."...";
                            }
                        }
                    }
                }
                
$sql="";
        } else { 
//no hemos alcanzado el delimitador el delimitador siempre debe estar al final de linea
                
$sql .= $line ."\n";
        }
    }
    
$conexion->close();    
}
function 
run_split_sql($uploadfile$host$usuario,$passwd,$NewBD,$DropDataBase,$InsertDatos,$VerSoloErrores,$fixUtf8,$tblName){
    
$x =explode("."$uploadfile);
    
$ext end($x);
    switch (
$ext){
        case 
"sql":
            
$strSQLs file_get_contents($uploadfile);
            
unlink($uploadfile);
            break;
        case 
"zip":
            
$zip = new ZipArchive
            
$zip->open($uploadfile); 
            
$zip->extractTo("./"); 
            
$zip->close(); 
            
unlink($uploadfile);//borra el zip
            
$NewFile=stristr($uploadfile,".".$ext,true);//le quitamos la ext
            
$strSQLs file_get_contents($NewFile);
            break;
        case 
"gz":
            
$strSQLs implode(""gzfile($uploadfile));
            break;
        case 
"bz2":
            
$bz bzopen($uploadfile"r") or die("No se pudo abrir el fichero $file para lectura");
            
$decompressed_file '';
            while (!
feof($bz)) {
                
$strSQLs .= bzread($bz4096);
            }
            
bzclose($bz);
            break;
    }
  #5 (permalink)  
Antiguo 27/03/2016, 01:42
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: BACKUP Y RESTORE de MYSQL (muy bueno)

2ª Parte continuación de Restaurar de 2016
Código PHP:
  // PROBLEMAS EN LA INTERPRETACION DEL JUEGO DE CARACTERES
    $strSQL= convertir_utf8($strSQL);
    
    // Elimina lineas vacias o que empiezan por -- #   //   o entre /* y */
    // Elimna los espacios en blanco entre ; y \r\n
    // handle DOS and Mac encoded linebreaks
    $strSQLs=preg_replace("/\r\n$/","\n",$strSQLs);
    $strSQLs=preg_replace("/\r$/","\n",$strSQLs);
    $strSQLs = trim(preg_replace('/ {2,}/', ' ', $strSQLs));    // ----- remove multiple spaces ----- 
    $strSQLs = strtr($strSQLs, array("\r" =>""));                     //los \r\n los dejamos solo en \n
    if ($fixUtf8) {    $strSQLs = strtr($strSQLs, array("latin1" => "utf8"));}
    $BD=CadenaAcotada($strSQLs,"USE `","`");
    if(!empty($NewBD)) {
        if ($BD) $strSQLs = strtr($strSQLs,array("`".$BD."`" => "`".$NewBD."`")); 
        echo "********** $BD --> $NewBD ******************************************";
        $BD =$NewBD;
    }
    
    run_sql($strSQLs,$BD, $host, $usuario,$passwd, $DropDataBase,$InsertDatos,$VerSoloErrores,$tblName);

    
    echo " <br>---FIN IMPORTACION---";    
    return $BD;
}
?>
<h3>RESTAURAR COPIA DE SEGURIDAD MySQL. (version: 21-2-2016) ---------> <a href='BackupMySQL-i.php'> Ir a BackupMySQL-i.php <a> </h3>
<FORM action="<?php echo $_SERVER['PHP_SELF']?>" method="POST" enctype="multipart/form-data">
    <p><b>Fichero (*.sql):</b> 
    <INPUT type="file"  name="userfile"><br />
    <INPUT type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAXFILESIZE?>">
    <b>Servidor &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</b> 
    <INPUT type="text" name="host" id ="host" value="localhost"><br />
    <b>Usuario &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:</b> 
    <INPUT type="text" name="usuario" id ="usuario" value="root"><br />
    <b>Contrase&ntilde;a : </b> 
    <INPUT type="text" name="passwd" id="passwd" value="gtjclm"><br />
    <input name="DropDataBase" id="DropDataBase" type="checkbox" value="true" TITLE="Primero DROP DATABASE"/>  Primero ejecutar DROP DATABASE <br />
    <input name="InsertDatos" id="InsertDatos" type="checkbox" value="true" checked="checked" TITLE="Restaurar inserciones de datos "/>  Restaurar inserciones de datos <br />
    <input name="VerSoloErrores" id="VerSoloErrores" type="checkbox" value="true" checked="checked" />  Mostrar solo errores (no cada linea de ejecucion) <br />
    <input name="fixUtf8" id="fixUtf8" type="checkbox" value="true"  />Cambiar charset a utf8 <br />
    <br />
    O P C I O N A L <br />
    <b>Restaurar solo la Tabla :</b> <INPUT type="text" name="tblName" id ="tblName" value=""><br />
    <b>Restaurar en otra Base de Datos con nombre distinto al que origino la copia: </b>: <INPUT type="text" name="NewBD" id="NewBD" value="">
    </p>
  <h6>( <u>nota:</u> Restaurar en otra Base de Datos se usa para restaurar en cualquier otra Base de datos distinta a la que se genero la copia. Si no existe la nueva base de datos, la crea. <br> SI HAY UNA TABLA o VISTA CON EL MISMO NOMBRE DE LA BASE DE DATOS QUE ORIGINO LA COPIA DE SEGURIDAD, FALLARA LA IMPORTACION EN OTRA BASE DE DATOS CON NOMBRE DISTINTO)</h6>
    <INPUT type="submit" name="upload" id="upload" value="[ Restaurar ]">
    <BR /><BR />
    <b> Base datos para ejecutar SQL &nbsp;&nbsp;:</b> 
    
    
    <?PHP    //<INPUT type="text" name="BD" id ="BD" value=" <?PHP echo $BD; ? > ">
    
$conexion = new mysqli($host$usuario$passwd) or die ("No se puede conectar con MySQL: %s\n"$conexion->connect_error);
    if (!
$conexion->set_charset("utf8")) {  // cambiar el conjunto de caracteres a utf8 
        
printf("Error cargando el conjunto de caracteres utf8: %s\n"$conexion->error);
        exit();
    }
    
$strSQL "SHOW DATABASES;"//SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :database AND TABLE_NAME = :table
    
$respuesta $conexion->query($strSQL)or die("No se puede ejecutar la consulta: $strSQL MySQL: \n"$conexion->error);
    
$BaseDatos $respuesta->num_rows;
    
$opcionesSelect="";
    while (
$BaseDatos $respuesta->fetch_array(MYSQLI_NUM)) {
        if (
$BaseDatos[0] == $BD){
            
$opcionesSelect.= "<option value='$BaseDatos[0]' selected='selected'> $BaseDatos[0] </option>";
        } else     
$opcionesSelect.= "<option value='$BaseDatos[0]'> $BaseDatos[0] </option>";
    }
    
$respuesta->free();
    
$conexion->close();    
    echo 
"<select name='BD' id='BD' size='$BaseDatos' >
                        $opcionesSelect
                        </select> <BR />"
;
    
?>
<br />
    
    
    <INPUT type="submit" name="runSQL" id="runSQL" value="[ Seleccionar Base Datos ]" 

/>
</FORM>
<?PHP

if (isset($_POST['DoSQL'])) {
    echo 
"procesando peticion de formulario SQL.....";
    
// CONEXION 
    
$conexion = new mysqli($host$usuario$passwd,$BD) or die ("No se puede conectar con MySQL: %s\n"$conexion->connect_error);
    if (!
$conexion->set_charset("utf8")) {  // cambiar el conjunto de caracteres a utf8 
        
printf("Error cargando el conjunto de caracteres utf8: %s\n"$conexion->error);
        exit();
    }
    if (!empty(
$_POST['Tablas']))    
        foreach (
$_POST['Tablas'] as $tabla){
            Switch (
$_POST['OpSQL']){
                case 
'Select':
                    
$strSQL="SELECT * FROM `".$tabla."`; ";
                    echo 
"<BR /><BR /><BR /><BR /><BR /><H1><U>".$tabla."</U></H1>";
                    echo 
TableToHTML($conexion$strSQL);
                    break;
                case 
'Empty':
                    
$strSQL="TRUNCATE TABLE `".$tabla."`; ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    break;
                case 
'Drop':
                    
$strSQL="DROP TABLE `".$tabla."`; ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    break;
                case 
'Rename'
                    
$newTabla $tabla.date("_d_m_Y");
                    
$strSQL="RENAME TABLE `".$tabla."` TO ".$newTabla.";  ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);    
                    break;
                case 
'Duplicate':
                    
$newTabla $tabla.date("_d_m_Y");
                    
$strSQL="CREATE TABLE `".$newTabla."` LIKE `".$tabla."`;  ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    
$strSQL="ALTER TABLE `".$newTabla."` DISABLE KEYS;  ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    
$strSQL="INSERT INTO `".$newTabla."` SELECT * FROM  `".$tabla."`;  ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    
$strSQL="ALTER TABLE `".$newTabla."` ENABLE KEYS; ";
                    
$respuesta $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    
$strSQL='SELECT CONCAT_WS(" "," CREATE TRIGGER ",CONCAT_WS("_","'.$tabla.'", ACTION_TIMING,EVENT_MANIPULATION), ACTION_TIMING,EVENT_MANIPULATION, " ON '.$tabla.' FOR EACH ROW ",ACTION_STATEMENT," " ) AS x
                            FROM INFORMATION_SCHEMA.TRIGGERS
                            WHERE TRIGGER_SCHEMA = database() AND EVENT_OBJECT_TABLE = "'
.$tabla.'";';
                    
$rs $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);
                    
$num_rows$rs->num_rows;
                    if ( 
$num_rows <> 0) {
                        While  (
$regSELECT$rs->fetch_assoc()){
                            
$strSQL=$regSELECT["x"];
                            
$rsRUN $conexion->query$strSQL )or die("No se puede ejecutar la consulta: $strSQL MySQL: \n".$conexion->error);    
                        }
                    }        
                    break;
                case 
'ShowCreateTable':
                    
$strSQL="SHOW CREATE TABLE `".$tabla."`";
                    echo 
"<BR /><BR /><BR /><BR /><BR /><H1><U>".$strSQL."</U></H1>";
                    echo 
TableToHTML($conexion$strSQL);
                    
$strSQL='SELECT "'.$tabla.'" as Tabla,CONCAT_WS(" "," CREATE TRIGGER ",CONCAT_WS("_","'.$newTabla.'",ACTION_TIMING,EVENT_MANIPULATION), ACTION_TIMING,EVENT_MANIPULATION, " ON '.$newTabla.' FOR EACH ROW ",ACTION_STATEMENT," " ) AS Def_TRIGGER
                            FROM INFORMATION_SCHEMA.TRIGGERS
                            WHERE TRIGGER_SCHEMA = database() AND EVENT_OBJECT_TABLE = "'
.$tabla.'";';
                    echo 
TableToHTML($conexion$strSQL);
                    break;
                case 
'ShowTableStatus':
                    
$strSQL="SHOW TABLE STATUS LIKE '".$tabla."' ";
                    echo 
"<BR /><BR /><BR /><BR /><BR /><H1><U>".$strSQL."</U></H1>";
                    echo 
TableToHTML($conexion$strSQL);
                    break;
            }
    }
    
    if (!empty(
$_POST["strSQL"])){
        echo 
"<BR /><BR /><H6><U>".$_POST["strSQL"]."</U></H6>";
        
$strSQLs $_POST["strSQL"];
        
$Instruccion=substr($strSQLs,0,4);
        if (
false === strripos("SHOW,SELE,DESC",$Instruccion)){
            
run_sql($strSQLs,$BD$host$usuario,$passwd$DropDataBase,$InsertDatos,$VerSoloErrores,$tblName);
        } else {
            echo 
TableToHTML($conexion$strSQLs);
        }
    }
        
    
$conexion->close();    
}
  #6 (permalink)  
Antiguo 27/03/2016, 01:44
Avatar de a2garrido  
Fecha de Ingreso: diciembre-2013
Mensajes: 6
Antigüedad: 10 años, 3 meses
Puntos: 2
Respuesta: BACKUP Y RESTORE de MYSQL (muy bueno)

3ª Parte continuación de Restaurar de 2016
Código PHP:
if (isset($_POST['upload'])) {
    
//echo "Files ".print_r($_FILES)."<br>";
    //echo "POST ".print_r($_POST);
    
$path dirname__FILE__ );
    
$dir$path.'/uploads/';
    if (!
is_dir($dir)) {
        if (!
mkdir($dir0777true)) {
            die(
'No se pudo crear el directorio.');
        }
    }
    
$uploadfile $dirbasename($_FILES['userfile']['name']);
    
    print 
'<pre>';
    switch (
$_FILES['userfile']['error']){
        case 
0:// UPLOAD_ERR_OK
            //Debug("Sin error en fichero",$_FILES['userfile']['error'],true);
            
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
                    
//Debug("Archivo subido",$uploadfile);
                    
echo "El archivo <b> $uploadfile </b> es v&aacute;lido y fue cargado exitosamente.<br>";
                    
$NewBD=$_POST["NewBD"];
                    
$tblName=$_POST["tblName"];
                    
$DropDataBase= isset($_POST["DropDataBase"]) && ($_POST['DropDataBase'] =="true")? true false;
                    
$InsertDatos= isset($_POST["InsertDatos"]) && ($_POST['InsertDatos'] =="true")? true false;
                    
$VerSoloErrores= isset($_POST["VerSoloErrores"]) && ($_POST['VerSoloErrores'] =="true")? true false;
                    
$fixUtf8=isset($_POST["fixUtf8"]) && ($_POST['fixUtf8'] =="true")? true false;
                    
$BDrun_split_sql($uploadfile$host$usuario,$passwd ,$NewBD,$DropDataBase,$InsertDatos,$VerSoloErrores$fixUtf8,$tblName);
            } else     echo 
"<br>¡Posible errror en carga de archivos!";
            break;
        case 
1// UPLOAD_ERR_INI_SIZE
            
echo "<br>El archivo sobrepasa el limite autorizado por el servidor(archivo php.ini) !";
            break;
        case 
2// UPLOAD_ERR_FORM_SIZE
            
echo "<br>El archivo sobrepasa el limite autorizado en el formulario HTML !";
            break;
        case 
3// UPLOAD_ERR_PARTIAL
            
echo "<br>El envio del archivo ha sido suspendido durante la transferencia!";
            break;
        case 
4// UPLOAD_ERR_NO_FILE
            
echo "<br>El archivo que ha enviado tiene un tamaño nulo !";
            break;
        default: 
            echo 
"<br>ERROR DESCONOCIDO !"
            break;
    }
    print 
"</pre>";
    unset(
$_POST['upload']);
    
$_POST[]=array();
}
if (!empty(
$BD))    {
    
$conexion = new mysqli($host$usuario$passwd,$BD) or die ("No se puede conectar con MySQL: %s\n"$conexion->connect_error);
    if (!
$conexion->set_charset("utf8")) {  // cambiar el conjunto de caracteres a utf8 
        
printf("Error cargando el conjunto de caracteres utf8: %s\n"$conexion->error);
        exit();
    }
    
$strSQL "SHOW FULL TABLES FROM $BD WHERE Table_Type='BASE TABLE';"//SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :database AND TABLE_NAME = :table
    
$respuesta $conexion->query($strSQL)or die("No se puede ejecutar la consulta: $strSQL MySQL: \n"$conexion->error);
    
$NumTablas $respuesta->num_rows;
    
$opcionesSelect="";
    while (
$tabla $respuesta->fetch_array(MYSQLI_NUM)) {
        
$opcionesSelect.= "<option value='$tabla[0]'> $tabla[0] </option>";
    }
    
$respuesta->free();
    
$conexion->close();    
        
$CurrentURL=$_SERVER['PHP_SELF'];
        echo 
"<form id='formEmptyTables' name='formEmptyTables' method='POST' action='$CurrentURL'> 
                <INPUT type='hidden' name='host' value='$host'>
                <INPUT type='hidden' name='usuario' value='$usuario'>
                <INPUT type='hidden' name='passwd' value='$passwd'>
                <INPUT type='hidden' name='BD' value='$BD'>
                <h2>Tablas en la Base de Datos : </h2>
                <label>
                Mantener pulsado la tecla &lt;ctrl&gt; + clic  
                </label><BR />
                        <select name='Tablas[]' size='$NumTablas' multiple='multiple' tabindex='1'>
                        $opcionesSelect
                        </select> <BR /><BR />
                    <label> Operacion sobre tablas seleccionadas:        </label><BR />
                        <select name='OpSQL' size='7' >
                            <option value='Select'> Select </option>
                            <option value='Empty'> Empty/Truncate/Delete </option>
                            <option value='Drop'> Drop </option>
                            <option value='Rename'> Rename </option>
                            <option value='Duplicate'> Duplicate/Copy </option>
                            <option value='ShowCreateTable'> Definicion DDL </option>
                            <option value='ShowTableStatus'> Propiedades </option>
                        </select><BR /><BR />
                     <label> Instruccion SQL :  (es idependiente de las tablas seleccionadas)</label><BR />
                            <TEXTAREA name='strSQL' rows='4' cols='80'></TEXTAREA><BR />                
                    <input type='submit' name='DoSQL' value='[ Ejecutar ]' tabindex='2' />
                </form>    "
;    
    }
    
?> 

Etiquetas: backup, mysql, mysqli, restore
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 1 personas




La zona horaria es GMT -6. Ahora son las 04:34.