Foros del Web » Programando para Internet » PHP »

BackUp de MySQL con PHP y compresión ZIP

Estas en el tema de BackUp de MySQL con PHP y compresión ZIP en el foro de PHP en Foros del Web. Muy buenas La base de datos con la que trabajo ha llegado a 1GB de tamaño, por lo que seguir haciendo dumps a lo bruto ...
  #1 (permalink)  
Antiguo 01/02/2010, 06:46
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Información BackUp de MySQL con PHP y compresión ZIP

Muy buenas

La base de datos con la que trabajo ha llegado a 1GB de tamaño, por lo que seguir haciendo dumps a lo bruto no es viable.

Es por ello que me he currado un script y lo he añadido al "cron diario" del servidor.

La forma de funcionar es ver las distintas bases de datos de usuario y volcarlas mediante el comando mysqldump. Posteriormente se comprime en ZIP y se eliminan los archivos temporales utilizados. Luego eliminaría las copias antiguas (en este caso, anteriores a 3 dias)

He visto en otro tema un script bastante bueno que prescinde del uso de mysqldump (enlace), pero tardaría más en ejecutarse.

Código PHP:
<?php
#############################################
#
# Tarea de copia seguridad de todas las bases de datos en MySQL
#
# CopyLeft, puedes hacer con este script lo que te de la gana
#
#############################################
set_time_limit(0);
header("Content-type: text/plain; charset=UTF-8");
echo 
date("Y-m-d H:i"time()) . " Creando copia de seguridad MySQL...\r\n";

// Datos de acceso a MySQL
$myhost "localhost";
$myuser 'root';
$mypass 'miclave';
$DB mysql_connect($myhost$myuser$mypass) or die(date("Y-m-d H:i"time()) . " ERROR!! No se pudo conectar a MySQL.\r\n");

// Otros parámetros
$OUTDIR "D:\\backup\\"// Cambiar segun necesidades y tipo servidor
$now date("YmdHi"time());
$outfile "MySQL_$now.zip";
$periodo time() - 259200// Los archivos anteriores a este periodo (3 dias = 259200 segundos) serán borrados

// Crear nuevo archivo ZIP
# Más información sobre la clase PHP
# http://es.php.net/manual/en/class.ziparchive.php
echo date("Y-m-d H:i"time()) . " Creando '$OUTDIR$outfile.zip' ... ";
$zip = new ZipArchive;
if (!
$zip->open("$OUTDIR$outfile"ZIPARCHIVE::CREATE)) die("ERROR!!\r\n");
echo 
"OK.\r\n";

// Tomar un listado de bases de datos
$q mysql_query("SHOW DATABASES");

// Volcar todas las bases
while ($database mysql_fetch_row($q))
    if (
$database[0] != "information_schema" && $database[0] != "mysql")
        {
        
// Nombrar archivo
        
$filename "{$database[0]}.sql";
        
$tempfile date("YmdHis"time()) . ".~swap";

        echo 
date("Y-m-d H:i"time()) . " Volcando '$filename' ... ";

        
// Volcar datos
        
system("mysqldump -h $myhost -u $myuser -p$mypass --opt {$database[0]} > $OUTDIR$tempfile");

        echo 
"OK.\r\n"
        
date("Y-m-d H:i"time()) . " Agregando '$filename' a '$outfile' ... ";

        
//  Agregar archivo al ZIP
        
$zip->addFile($OUTDIR.$tempfile$filename);

        
// Recordar los temporales utilizados
        
$DUMPFILES[] = $OUTDIR.$tempfile;

        echo 
"OK.\r\n";
        }

// Desconectar de la base de datos
mysql_close($DB);

// Cerrar archivo ZIP
$zip->close();

// Eliminar temporales. Importante hacerlo DESPUÉS de cerrar el ZIP
foreach($DUMPFILES as $file)
    
unlink($file);

// Elminar archivos antiguos
echo date("Y-m-d H:i"time()) . " Eliminando copias antiguas...\r\n";
$D opendir($OUTDIR);
while (
$F readdir($D))
    if (
$F != "." && $F != "..")
        if (
filectime($OUTDIR.$F) < $periodo)
            if (!
unlink($OUTDIR.$F))
                echo 
date("Y-m-d H:i"time()) . " No se pudo eliminar el archivo $F.\r\n";        
closedir($D);

echo 
date("Y-m-d H:i"time()) . " Tarea finalizada.\r\n";
?>
Gracias a la compresión en ZIP ahora la copia diaria ocupa ~77MB en vez de ~1GB.

Espero que os sirva a muchos/as.

Saludos
  #2 (permalink)  
Antiguo 01/02/2010, 07:37
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Gracias por compartirlo, lo pruebo y te dejo saber.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/02/2010, 09:19
 
Fecha de Ingreso: abril-2009
Mensajes: 45
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenas yo tambien tengo un Script muy Similar a ese solo que no uso system si no ssh_exec

pero eso no importa... de echo tengo un problema similar de permisos en un servidor compartido...

de echo voy a abrir un tema pero gracias por compartirlo
  #4 (permalink)  
Antiguo 01/02/2010, 09:25
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Cita:
Iniciado por AztekaMX Ver Mensaje
Buenas yo tambien tengo un Script muy Similar a ese solo que no uso system si no ssh_exec

pero eso no importa... de echo tengo un problema similar de permisos en un servidor compartido...

de echo voy a abrir un tema pero gracias por compartirlo
Los permisos pueden ser un dolor de cabeza si ejecutas el script desde el servidor web, ya que en window$ se ejecutan como WWWUSR (o algo así) y en linux se ejecutan con los privilegios del propietario del script.

Al ponerlo en tareas programadas se ejecuta como el propietario de la tarea (que debe ser un administrador).
Al ponerlo en el cron puedes especificar quien ejecuta la tarea (que "normalmente" es root)

Te lo cuento porque yo tuve el problema de privilegios al probar el script desde web, pero desde tareas programadas va perfecto.

Suerte.
  #5 (permalink)  
Antiguo 26/05/2011, 14:46
 
Fecha de Ingreso: mayo-2010
Mensajes: 53
Antigüedad: 14 años, 6 meses
Puntos: 6
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Eres un genio!!!. Este script es...en dos palabras impre - zionante.
Muchas gracias por compartirlo.
  #6 (permalink)  
Antiguo 16/03/2012, 12:28
 
Fecha de Ingreso: mayo-2008
Mensajes: 253
Antigüedad: 16 años, 5 meses
Puntos: 8
Respuesta: BackUp de MySQL con PHP y compresión ZIP

siento si contesto a este post que lleva mas e 6 meses sin actividad pero es que creo que esto me puede servir, pero en este apartado no se que debo de poner realmente

Cita:
// Otros parámetros
$OUTDIR = "D:\\backup\\"; // Cambiar segun necesidades y tipo servidor
Gracias y perdon
  #7 (permalink)  
Antiguo 16/03/2012, 12:37
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Ahí se pone la carpeta destino donde se grabará la copia. Puede ser la ruta absoluta, por ejemplo:
Windows:
"C:\\backup\\"
Linux:
"/var/backup/"

O la ruta relativa a la ubicación del script, por ejemplo:

Windows:
"..\\backup\\"
Linux:
"../backup/"
__________________
$ DEITY = NULL
  #8 (permalink)  
Antiguo 16/03/2012, 12:44
 
Fecha de Ingreso: mayo-2008
Mensajes: 253
Antigüedad: 16 años, 5 meses
Puntos: 8
Respuesta: BackUp de MySQL con PHP y compresión ZIP

ah ok ok muchisimas gracias por tu rapida respuesta mgus ;)))
  #9 (permalink)  
Antiguo 22/11/2014, 05:34
 
Fecha de Ingreso: noviembre-2014
Mensajes: 1
Antigüedad: 10 años
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Hola,

Lo primero muchas Gracias por el Aporte ! Me esta valiendo para hacer el backup de la base de datos de mi libreria pero no consigo sacar lo siguiente

No consigo que cree los zips en el xampp que estoy arrancando me da el error

<b>Fatal error</b>: Class 'ZipArchive' not found in <b>/opt/lampp/htdocs/backup.php</b> on line <b>29</b><br />


Cuando He conseguido sacar el Backup en otro xampp me salian los ficheros pero con 0KB ¿A que se puede deber esto ultimo?

Muchas Gracias!!
  #10 (permalink)  
Antiguo 22/11/2014, 08:15
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenas!
En cuanto al error en la clase ZIP lo más seguro es que no esté activa en tu instalación de xamp, revisa que el módulo está activo en php.ini

En cuanto al tamaño 0 haz una breve depuración, lo más seguro es que haya un fallo al ejecutar mysqldump, ya sea por las credenciales de acceso (sobre todo si hay un cáracter especial en la contraseña) o porque el sistema te impide ejecutarlo desde PHP.
__________________
$ DEITY = NULL
  #11 (permalink)  
Antiguo 10/05/2015, 06:19
 
Fecha de Ingreso: enero-2011
Ubicación: España
Mensajes: 12
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Hola he puesto este escript y me extrae las bases de datos en un comprimido pero los ficheros .sql están vacíos ¿como puedo solucionarlo?

Quiero usar las tareas programadas de windows para que me haga una copia de la BD diariamente de la BD que tengo en xampp pero siempre me saca el dump vacio...
  #12 (permalink)  
Antiguo 10/05/2015, 07:41
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: BackUp de MySQL con PHP y compresión ZIP

¿Y te aseguraste de modificar todos los valores de las variables para que se ajusten a tu instancia de MySQL? ¿Todos?
Usualmente lo que sucede en casos como el tuyo es que simplemente algo no es lo que debes poner, sea el directorio destino, password, username, host, etc.
¿Verificaste todo?
¿Intentaste generar manualmente esos backup, desde la líena de comandos del sistema, sin usar el script?
Vamos, son las pruebas mínimas que debes hacer antes que nada...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 12/05/2015, 02:26
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

En Windows es posible que necesites poner la ruta completa al ejecutable de MySQLDump incluso estando este incluído en %PATH%
__________________
$ DEITY = NULL
  #14 (permalink)  
Antiguo 12/05/2015, 02:30
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Iba a modificar el mensaje original pero no me deja

Para no tener problemas con la codificación es recomendable generar el archivo volcado mediante el parámetro -r
Código PHP:
system("mysqldump -h $myhost -u $myuser -p$mypass --opt {$database[0]} -r $OUTDIR$tempfile"); 
A la hora de importar mejor también hacerlo desde la consola MySQL con SOURCE <nombre_archivo_sql>, en lugar de mysql < <nombre_archivo_sql>
__________________
$ DEITY = NULL
  #15 (permalink)  
Antiguo 16/03/2016, 05:16
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenos días,

Se que es un tema antíguo, pero recientemente me he puesto a utilizar este script.

Aparentemente todo funciona, me arroja el siguiente mensaje:

2016-03-16 10:28 Creando copia de seguridad MySQL...
2016-03-16 10:28 Creando './MySQL-16-Wednesday-March-2016-.zip' ... OK.
2016-03-16 10:28 Volcando 'nombre.sql' ... OK.
2016-03-16 10:28 Agregando 'nombre.sql' a 'MySQL-16-Wednesday-March-2016-.zip' ... OK.
2016-03-16 10:28 Eliminando copias antiguas...
2016-03-16 10:28 Tarea finalizada.

Pero no veo que se genere ningún archivo. He revisado la ruta de salida $OUTDIR pero no doy con la tecla de que puede estar pasando, me pone ese mensaje de todo ok pero no veo que se genere ningún archivo.

Ruego alguien me ayude.

Un saludo.
  #16 (permalink)  
Antiguo 16/03/2016, 09:05
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Dos soluciones mas completas:
https://phpbu.de/
https://github.com/backup-manager/backup-manager
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #17 (permalink)  
Antiguo 16/03/2016, 09:12
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenas SGG

Es posible que al eliminar las copias antiguas se elimine el archivo actual ya que filectime no está devolviendo un valor váĺido, comenta esa parte.
__________________
$ DEITY = NULL
  #18 (permalink)  
Antiguo 21/03/2016, 11:34
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Cita:
Iniciado por mgusdl Ver Mensaje
Buenas SGG

Es posible que al eliminar las copias antiguas se elimine el archivo actual ya que filectime no está devolviendo un valor váĺido, comenta esa parte.
Buenas tardes,

Gracias por la respuesta. He pensado en eso, que puede que se borre el archivo junto con las copias antíguas, pero estoy completamente perdido, no se en que línea tengo que mirar o que debo editar.

Un saludo.
  #19 (permalink)  
Antiguo 21/03/2016, 12:03
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

He localizado estas dos línes:

$periodo = time() - 259200; // Los archivos anteriores a este periodo (3 dias = 259200 segundos) serán borrados

Y

if (filectime($OUTDIR.$F) < $periodo)

He modificado los valores, he probado a poner date donde time, pero nada de nada.

Un saludo.
  #20 (permalink)  
Antiguo 22/03/2016, 05:19
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenos días,

mgusdl eso de que filectime no está devolviendo un valor váĺido, a que te refieres?

Un saludo.
  #21 (permalink)  
Antiguo 23/03/2016, 07:42
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Ruego alguien me eche una mano, estoy totalmente bloqueado con este tema.

Un saludo.
  #22 (permalink)  
Antiguo 27/03/2016, 14:55
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenas noches,

mgusdl sobre que filectime no está devolviendo un valor váĺido, donde puedo mirar el valor que devuelve, me dices que comente esa parte, al ejecutar el script lo único que me pone es esto:


2016-03-16 10:28 Creando copia de seguridad MySQL...
2016-03-16 10:28 Creando './MySQL-16-Wednesday-March-2016-.zip' ... OK.
2016-03-16 10:28 Volcando 'nombre.sql' ... OK.
2016-03-16 10:28 Agregando 'nombre.sql' a 'MySQL-16-Wednesday-March-2016-.zip' ... OK.
2016-03-16 10:28 Eliminando copias antiguas...
2016-03-16 10:28 Tarea finalizada.

Aparentemente todo bien, he probado varias cosas por si el archivo que se genera se elimina al mismo tiempo, pero no doy con el error.

Disculpa mi ignorancia y lo pegado que estoy, pero ruego si me puedes echar un cable, pídeme la información que necesites sobre este tema.

Un saludo.
  #23 (permalink)  
Antiguo 02/04/2016, 20:37
 
Fecha de Ingreso: julio-2010
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Amigo agregame a Skype y vemos he tratado con este codigo y igual me da problemas, pero debe ser algo que estamos haciendo mal.

cristian.antonio.ceron

ahora estaba probando con otro pero volvere a intentar con este.
  #24 (permalink)  
Antiguo 04/04/2016, 04:24
 
Fecha de Ingreso: julio-2010
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Hola !

Probando el codigo y desglozandolo, sin la opcion de borrado:

2016-04-05 13:04 Creando 'C:/wamp/www/demo/backup/MySQL_201604051304.zip.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 works its done.

el tema es que el archivo simplemente no esta pero lo esta generando el codigo es este :

Código PHP:
Ver original
  1. <?php
  2.  
  3. // set_time_limit(0);
  4. //header("Content-type: text/plain; charset=UTF-8");
  5. // echo date("Y-m-d H:i", time()) . " Create Backup MySql...\r\n";
  6.  
  7. // Datos de acceso a MySQL
  8. $myhost = "localhost";
  9. $myuser = 'xxx';
  10. $mypass = 'xxx';
  11. $dbName  = "xxx";
  12. $DB = mysqli_connect($myhost, $myuser,$mypass,$dbName) or die(date("Y-m-d H:i", time()) . " ERROR!! No se pudo conectar a MySQL.\r\n");
  13.  
  14. // Otros parámetros
  15. $OUTDIR = "C:/wamp/www/demo/backup/"; // Cambiar segun necesidades y tipo servidor - Probe con C: y con los c:\\ y tampoco funciono.
  16.  
  17. $now = date("YmdHi", time());
  18. $outfile = "MySQL_$now.zip";
  19. $periodo = time() - 259200; // Los archivos anteriores a este periodo (3 dias = 259200 segundos) serán borrados
  20.  
  21. // Crear nuevo archivo ZIP
  22. # Más información sobre la clase PHP
  23. # http://es.php.net/manual/en/class.ziparchive.php
  24. echo date("Y-m-d H:i", time()) . " Creando '$OUTDIR$outfile.zip' ... ";
  25. $zip = new ZipArchive;
  26. if (!$zip->open("$OUTDIR$outfile", ZIPARCHIVE::CREATE)) die("ERROR!!\r\n");
  27. echo "OK.\r\n";
  28.  
  29. // Tomar un listado de bases de datos
  30.  
  31. $q = mysqli_query($DB,"SELECT * FROM checkper,employee");
  32.  
  33. // Crear programacion para respaldar 3 tablas por separado al mismo tiempo en un zip.
  34.  
  35. // Volcar todas las bases
  36. while ($database = mysqli_fetch_row($q))
  37.     if ($database[0] != "information_schema" && $database[0] != "mysql")
  38.         {
  39.         // Nombrar archivo
  40.         $filename = "{$database[0]}.sql";
  41.         $tempfile = date("YmdHis", time()) . ".~swap";
  42.  
  43.         echo date("Y-m-d H:i", time()) . " Volcando '$filename' ... ";
  44.  
  45.         // Volcar datos
  46.  
  47.         system("mysqldump -h $myhost -u $myuser -p$mypass --opt {$database[0]} -r $OUTDIR$tempfile");  
  48.  
  49.  
  50.         echo "OK.\r\n"
  51.         . date("Y-m-d H:i", time()) . " Agregando '$filename' a '$outfile' ... ";
  52.  
  53.         //  Agregar archivo al ZIP
  54.         $zip->addFile($OUTDIR.$tempfile, $filename);
  55.  
  56.         // Recordar los temporales utilizados
  57.         $DUMPFILES[] = $OUTDIR.$tempfile;
  58.  
  59.         echo "OK.\r\n";
  60.         }
  61.  
  62. // Desconectar de la base de datos
  63.  
  64. // Cerrar archivo ZIP
  65. $zip->close();
  66.  
  67. // Eliminar temporales. Importante hacerlo DESPUÉS de cerrar el ZIP
  68. // foreach($DUMPFILES as $file)
  69. //     unlink($file);
  70.  
  71. // Elminar archivos antiguos
  72. // echo date("Y-m-d H:i", time()) . " Delete backup before 3 days....\r\n";
  73. // $D = opendir($OUTDIR);
  74. // while ($F = readdir($D))
  75. //     if ($F != "." && $F != "..")
  76. //         if (filectime($OUTDIR.$F) < $periodo)
  77. //             if (!unlink($OUTDIR.$F))
  78.                 // echo date("Y-m-d H:i", time()) . " Can delete the files $F.\r\n";        
  79. // closedir($D);
  80.  
  81. echo date("Y-m-d H:i", time()) . " works its done.\r\n";
  82. ?>

La direccion podria estar mal ??? no entiendo :S ! quedo atento :D !
  #25 (permalink)  
Antiguo 05/04/2016, 01:42
Avatar de mgusdl  
Fecha de Ingreso: abril-2007
Ubicación: Malaga, España
Mensajes: 190
Antigüedad: 17 años, 6 meses
Puntos: 5
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Cita:
Iniciado por aquilesnake Ver Mensaje
Hola !

Probando el codigo y desglozandolo, sin la opcion de borrado:

2016-04-05 13:04 Creando 'C:/wamp/www/demo/backup/MySQL_201604051304.zip.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '1.sql' ... OK. 2016-04-05 13:04 Agregando '1.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '2.sql' ... OK. 2016-04-05 13:04 Agregando '2.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '3.sql' ... OK. 2016-04-05 13:04 Agregando '3.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 Volcando '4.sql' ... OK. 2016-04-05 13:04 Agregando '4.sql' a 'MySQL_201604051304.zip' ... OK. 2016-04-05 13:04 works its done.

el tema es que el archivo simplemente no esta pero lo esta generando el codigo es este :

Código PHP:
Ver original
  1. <?php
  2.  
  3. // set_time_limit(0);
  4. //header("Content-type: text/plain; charset=UTF-8");
  5. // echo date("Y-m-d H:i", time()) . " Create Backup MySql...\r\n";
  6.  
  7. // Datos de acceso a MySQL
  8. $myhost = "localhost";
  9. $myuser = 'xxx';
  10. $mypass = 'xxx';
  11. $dbName  = "xxx";
  12. $DB = mysqli_connect($myhost, $myuser,$mypass,$dbName) or die(date("Y-m-d H:i", time()) . " ERROR!! No se pudo conectar a MySQL.\r\n");
  13.  
  14. // Otros parámetros
  15. $OUTDIR = "C:/wamp/www/demo/backup/"; // Cambiar segun necesidades y tipo servidor - Probe con C: y con los c:\\ y tampoco funciono.
  16.  
  17. $now = date("YmdHi", time());
  18. $outfile = "MySQL_$now.zip";
  19. $periodo = time() - 259200; // Los archivos anteriores a este periodo (3 dias = 259200 segundos) serán borrados
  20.  
  21. // Crear nuevo archivo ZIP
  22. # Más información sobre la clase PHP
  23. # http://es.php.net/manual/en/class.ziparchive.php
  24. echo date("Y-m-d H:i", time()) . " Creando '$OUTDIR$outfile.zip' ... ";
  25. $zip = new ZipArchive;
  26. if (!$zip->open("$OUTDIR$outfile", ZIPARCHIVE::CREATE)) die("ERROR!!\r\n");
  27. echo "OK.\r\n";
  28.  
  29. // Tomar un listado de bases de datos
  30.  
  31. $q = mysqli_query($DB,"SELECT * FROM checkper,employee");
  32.  
  33. // Crear programacion para respaldar 3 tablas por separado al mismo tiempo en un zip.
  34.  
  35. // Volcar todas las bases
  36. while ($database = mysqli_fetch_row($q))
  37.     if ($database[0] != "information_schema" && $database[0] != "mysql")
  38.         {
  39.         // Nombrar archivo
  40.         $filename = "{$database[0]}.sql";
  41.         $tempfile = date("YmdHis", time()) . ".~swap";
  42.  
  43.         echo date("Y-m-d H:i", time()) . " Volcando '$filename' ... ";
  44.  
  45.         // Volcar datos
  46.  
  47.         system("mysqldump -h $myhost -u $myuser -p$mypass --opt {$database[0]} -r $OUTDIR$tempfile");  
  48.  
  49.  
  50.         echo "OK.\r\n"
  51.         . date("Y-m-d H:i", time()) . " Agregando '$filename' a '$outfile' ... ";
  52.  
  53.         //  Agregar archivo al ZIP
  54.         $zip->addFile($OUTDIR.$tempfile, $filename);
  55.  
  56.         // Recordar los temporales utilizados
  57.         $DUMPFILES[] = $OUTDIR.$tempfile;
  58.  
  59.         echo "OK.\r\n";
  60.         }
  61.  
  62. // Desconectar de la base de datos
  63.  
  64. // Cerrar archivo ZIP
  65. $zip->close();
  66.  
  67. // Eliminar temporales. Importante hacerlo DESPUÉS de cerrar el ZIP
  68. // foreach($DUMPFILES as $file)
  69. //     unlink($file);
  70.  
  71. // Elminar archivos antiguos
  72. // echo date("Y-m-d H:i", time()) . " Delete backup before 3 days....\r\n";
  73. // $D = opendir($OUTDIR);
  74. // while ($F = readdir($D))
  75. //     if ($F != "." && $F != "..")
  76. //         if (filectime($OUTDIR.$F) < $periodo)
  77. //             if (!unlink($OUTDIR.$F))
  78.                 // echo date("Y-m-d H:i", time()) . " Can delete the files $F.\r\n";        
  79. // closedir($D);
  80.  
  81. echo date("Y-m-d H:i", time()) . " works its done.\r\n";
  82. ?>

La direccion podria estar mal ??? no entiendo :S ! quedo atento :D !
Buenas, yo lo que veo incorrecto es la consulta a la base de datos, has cambiado "SHOW DATABASES" por "SELECT * FROM checkper,employee". Como comprenderás no tiene nada que ver una consulta con la otra.
Si sólo quieres guardar 2 tablas de una base de datos tendrias que alterar el script más.
__________________
$ DEITY = NULL
  #26 (permalink)  
Antiguo 05/04/2016, 17:33
 
Fecha de Ingreso: julio-2010
Mensajes: 19
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Código HTML:
Buenas, yo lo que veo incorrecto es la consulta a la base de datos, has cambiado "SHOW DATABASES" por "SELECT * FROM checkper,employee". Como comprenderás no tiene nada que ver una consulta con la otra.
Si sólo quieres guardar 2 tablas de una base de datos tendrias que alterar el script más.
Disculpa mi ignorancia pero "SHOW DATABASES" se refiere a poner la variable de la base de datos o una consulta, es que me da errores y creo que era por eso.

Este código me encanta pero no me ha funcionado, y he tratado cambiarlo, ayúdame por favor.

cristian.antonio.tapia es mi skype
  #27 (permalink)  
Antiguo 06/04/2016, 04:09
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Buenos días,

Tras mucho pelearme para que me funciones este maravilloso script, mi hosting me responde esto:

Para que su script funcione correctamente no debe utilizar llamadas como "system", "exec" o "passthru" ya que están dehabilitadas.

Las funciones que soporta son las funciones nativas de PHP, pero no las que permiten larzar un ejecutable externo como por ejemplo mysqldump.

Para realizar un backup de una base de datos de realizar llamadas SQL (SHOW TABLES, SELECT...) desde PHP y volcar los contenidos a un fichero de texto.

Ojo aquilesnake por si tampoco te lo permiten. Mi Hosting es webempresa, y hasta ahora estaba muy contento con ellos.

Alguien sabe alguna alternativa que pueda utilizar? lo que necestito es un script en PHP que pueda ejecutar en un cron tag que me respalde las bases de datos y me las comprima en zip para que pueda ponerle una contraseña, posteriormente quiero subirlas a dropbox (subir el archivo a dropbox ya lo he conseguido). La parte del respaldo (script) es la que me falla.

Saludos.
  #28 (permalink)  
Antiguo 06/04/2016, 04:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: BackUp de MySQL con PHP y compresión ZIP

PHP en si carece de integración con oos DBMS como para que se pueda aprovechar el manejo de files en ese lenguaje por parte de MySQL. No hay alternativas a eso.
Hay dos posibilidades a explorar: por un lado si puedes guardar archivos planos creados por todas aplicación, es perfectamente posible crear un proceso programado por ti que realice tal backup. Por otro, habría que buscar si ya existe algún recurso en o para PHP que pueda cumplir esa funcionalidad y a la que el hosting ponga reparos.
¿Les preguntaste directamente sobre cómo podrías hacer esos backups en SUS SISTEMAS?
Es decir, preguntar si ellos cuentan con herramientas que te permitan hacer lo que necesitas. Tal vez en otro nivel de cuenta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #29 (permalink)  
Antiguo 06/04/2016, 04:28
SGG
 
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Parece que este codigo puede servirme:

======================USAGE=====================//see the IMPORT.php too
EXPORT_TABLES("localhost","user","pass","db_name" ); //or add 5th parameter(array) of specific tables: array("mytable1","mytable2","mytable3")

<?php
//https://github.com/tazotodua/useful-php-scripts
function EXPORT_TABLES($host,$user,$pass,$name, $tables=false, $backup_name=false ){
$mysqli = new mysqli($host,$user,$pass,$name); $mysqli->select_db($name); $mysqli->query("SET NAMES 'utf8'");
$queryTables = $mysqli->query('SHOW TABLES'); while($row = $queryTables->fetch_row()) { $target_tables[] = $row[0]; } if($tables !== false) { $target_tables = array_intersect( $target_tables, $tables); }
$content = "SET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\r\nSET time_zone = \"+00:00\";\r\n\r\n\r\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\r\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\r\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\r\n/*!40101 SET NAMES utf8 */;\r\n--Database: `".$name."`\r\n\r\n\r\n";
foreach($target_tables as $table){
$result = $mysqli->query('SELECT * FROM '.$table); $fields_amount=$result->field_count; $rows_num=$mysqli->affected_rows; $res = $mysqli->query('SHOW CREATE TABLE '.$table); $TableMLine=$res->fetch_row();
$content .= "\n\n".$TableMLine[1].";\n\n";
for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) {
while($row = $result->fetch_row()) { //when started (and every after 100 command cycle):
if ($st_counter%100 == 0 || $st_counter == 0 ) {$content .= "\nINSERT INTO ".$table." VALUES";}
$content .= "\n(";
for($j=0; $j<$fields_amount; $j++) { $row[$j] = str_replace("\n","\\n", addslashes($row[$j]) ); if (isset($row[$j])){$content .= '"'.$row[$j].'"' ; }else {$content .= '""';} if ($j<($fields_amount-1)){$content.= ',';} }
$content .=")";
//every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler
if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {$content .= ";";} else {$content .= ",";} $st_counter=$st_counter+1;
}
} $content .="\n\n\n";
}
$content .= "\r\n\r\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\r\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\r\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;";
$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql";
header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"".$backup_name."\""); echo $content; exit;
}
?>
  #30 (permalink)  
Antiguo 06/04/2016, 04:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: BackUp de MySQL con PHP y compresión ZIP

Podría... siempre que el orden de creacion de las tablas fuese alfabético, o las tablas usasen el motor de tablas MyISAM, de MySQL. Si fuese el InnoDB, y existiesen foreign keys, no te sirve.
Además, ese script no recupera indices no primarios, procedimientos almacenados, triggers o funciones almacenadas.

Hacer un backup de una BBDD no es un simple descargar de tablas.

Y, por favor, USA LOS HIGHLIGHTS que tienes disponibles en el área de edición de mensajes.
Los códigos puestos como texto plano son ILEGIBLES e INENTENDIBLES.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: backup, mysql, zip
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 02:15.