Copia de seguridad de la base de datos MySQL en Dropbox

9 minutos de lectura

En el pasado, recibí mucha ayuda de la comunidad SO, así que una vez que descubrí esto, pensé que esta era mi oportunidad de retribuir un poco. Espero que ayude a alguien.

El problema al que me enfrenté fue tener mi sitio principal creado en WordPress, con otra base de datos para una sección de comercio electrónico del sitio, quería hacer una copia de seguridad de todo el sitio (todos los archivos, ambas bases de datos, etc.) en Dropbox diariamente. base.

Después de una larga búsqueda, no pude encontrar nada que hiciera exactamente lo que estaba buscando.

Descargo de responsabilidad: no es necesario que esté ejecutando WordPress o un sitio de comercio electrónico para que esto funcione. Funcionará en cualquier base de datos MySQL y requiere PHP.

me encontré con el Complemento de copia de seguridad de WordPress a Dropbox, que me llevó alrededor del 90% allí. El complemento me permitió hacer una copia de seguridad de todos los archivos en el sitio y además hace una copia de seguridad de la base de datos de WordPress con la frecuencia que programe.

El problema es que el complemento solamente hace una copia de seguridad de la base de datos de WordPress, pero no de mi base de datos de comercio electrónico.

también encontré un Copia de seguridad de MySQL a Dropbox tutorial (crédito donde se debe), en el que se basa parte del código a continuación. Es un excelente tutorial, pero quería que hiciera una copia de seguridad y eliminara la copia de seguridad en diferentes momentos: el tutorial se respaldó y eliminó todo al mismo tiempo.

avatar de usuario
scottd

La solución que se me ocurrió no es específica de WordPress o de un sitio de comercio electrónico. Cualquiera que tenga una base de datos MySQL y pueda ejecutar PHP debería poder beneficiarse de esto. Tal vez con algunos ajustes a mi respuesta, pero aún así deberían poder lograr el resultado final.

Para almacenar una copia de seguridad de la base de datos de comercio electrónico, creé una carpeta en el directorio raíz de mi sitio (/temp – llámelo como quiera). Luego tuve que crear la copia de seguridad de la base de datos. Abra un editor de texto y cree un archivo llamado backup_dropbox.php.

backup_dropbox.php

<?php
// location of your /temp directory relative to this file. In my case this file is in the same directory.
$tempDir = "";
// username for e-commerce MySQL DB
$user = "ecom_user";
// password for e-commerce MySQL DB
$password = "ecomDBpa$$word";
// e-commerce DB name to backup
$dbName = "ecom_db_name";
// e-commerce DB hostname
$dbHost = "localhost";
// e-commerce backup file prefix
$dbPrefix = "db_ecom";

// create backup sql file
$sqlFile = $tempDir.$dbPrefix.".sql";
$createBackup = "mysqldump -h ".$dbHost." -u ".$user." --password='".$password."' ".$dbName." > ".$sqlFile;
exec($createBackup);

//to backup multiple databases, copy all of the above code for each DB, rename the variables to something unique, and set their values to whatever is appropriate for the different databases.
?>

Ahora este script debería crear una copia de seguridad de la base de datos “ecom_db_name” siempre que se ejecute. Para que se ejecute en un intervalo programado (quiero que se ejecute solo un par de minutos antes de que mi copia de seguridad de WordPress comience a ejecutarse a las 7 am). Puedes usar WP-Cron (si su sitio recibe suficiente tráfico para activarlo de manera confiable para que se ejecute en el momento adecuado) o programe un trabajo cron.

No soy un experto en trabajos cron y este tipo de comandos, por lo que puede haber una mejor manera. He usado esto en dos sitios diferentes y los he ejecutado de dos maneras diferentes. Juega con lo que funcione mejor para ti.

La primera forma es en un directorio que no está protegido con contraseña, la segunda es para un directorio protegido por contraseña. (Reemplace el nombre de usuario y la contraseña con su nombre de usuario y contraseña, y obviamente establezca example.com/temp/backup_dropbox.php en el lugar donde resida el archivo en su servidor).

Cron Job para ejecutar backup_dropbox.php 5 minutos antes de la copia de seguridad de WP

55 6 * * * php /home/webhostusername/public_html/temp/backup_dropbox.php

O

55 6 * * * wget -q -O /dev/null http://username:[email protected]/temp/backup_dropbox.php

Ahora el trabajo cron está configurado para ejecutar backup_dropbox.php y crear mi copia de seguridad de la base de datos todos los días a las 6:55 am. La copia de seguridad de WordPress a Dropbox que comienza a las 7 a. m. generalmente demora entre 5 y 6 minutos, pero podría demorar un poco más.

Quiero eliminar mis archivos de copia de seguridad .sql después de haber realizado correctamente una copia de seguridad en Dropbox, de modo que no esté ahí para siempre para que alguien de alguna manera abra o descargue el archivo de la base de datos.

Inicie el editor de texto nuevamente y cree otro archivo llamado clr_bkup.php.

clr_bkup.php

<?
$tmpDir = "";
//delete the database backup file

unlink($tmpDir.'db_ecom.sql');
// if you had multiple DB backup files to remove just copy the line above for each backup, and replace 'db_ecom.sql' with your DB backup file name

?>

Dado que la copia de seguridad de WordPress tarda unos minutos en finalizar, quiero ejecutar un trabajo cron para ejecutar clr_bkup.php a las 7:10, lo que debería dar tiempo suficiente. Nuevamente, el primer trabajo cron a continuación es para un directorio desprotegido y el segundo para un directorio protegido con contraseña.

Cron Job para ejecutar clr_bkup.php 10 minutos después de que comience la copia de seguridad de WP

10 7 * * * php /home/webhostusername/public_html/temp/clr_bkup.php

O

10 7 * * * wget -q -O /dev/null http://username:[email protected]/temp/clr_bkup.php

Secuencia de eventos

Para ayudarlo a comprender lo que está sucediendo, aquí está la línea de tiempo:

6:55 am: Cron Job está programado para ejecutar backup_dropbox.php, que crea un archivo de respaldo de mi base de datos.

7:00 a.m.: se ejecuta la copia de seguridad de WordPress en Dropbox y se realiza una copia de seguridad de todos los archivos que han cambiado desde la última copia de seguridad, que incluye mi copia de seguridad de la base de datos recién creada hace 5 minutos.

7:10 a. m.: A estas alturas, la copia de seguridad de Dropbox ha finalizado, por lo que Cron Job está programado para ejecutar clr_bkup.php, que elimina el archivo de copia de seguridad del servidor.

Variables, Notas y Misc. Información

Momento

Lo primero que me colgó fue conseguir el momento adecuado. Para simplificar, utilicé las horas del ejemplo anterior como si todo estuviera sucediendo en la misma zona horaria. En realidad, el servidor de mi alojamiento web está en la costa oeste de EE. UU., mientras que mi zona horaria de WordPress está configurada en la costa este de EE. UU. (una diferencia de 3 horas). Mis trabajos cron reales están configurados para ejecutarse 3 horas antes (hora del servidor) de lo que se muestra arriba. Esto será diferente para todos. La mejor apuesta es saber la diferencia horaria por adelantado.

Ejecutar copia de seguridad con una verificación de tiempo

En el directorio que no está protegido con contraseña, quería evitar que el script backup_dropbox.php se ejecutara en cualquier otro momento del día que no fuera a las 6:55 a. m. (visitándolo en un navegador a las 10 a. m., por ejemplo). Incluí una verificación de tiempo al comienzo del archivo backup_dropbox.php, que básicamente verifica si no son las 6:55 a.m., luego no dejes que ejecute el resto del código. Modifiqué backup_dropbox.php a:

<?php
$now = time();
$hm = date('h:i', $now);
if ($hm != '06:55') {
    echo "error message";
} else {
// DB BACKUP code from above goes here
}
?>

Supongo que también podría agregar esto al archivo clr_bkup.php para permitir que solo elimine los archivos de copia de seguridad a las 7:10 am, pero realmente no vi la necesidad ya que la única vez que clr_bkup.php hará algo es entre las 6:55 -7:10 am de todos modos. Sin embargo, depende de ti si decides ir por ese camino.

¿No está en WordPress?

Hay una serie de servicios gratuitos y de pago que harán una copia de seguridad de su sitio web en Dropbox u otro servicio similar como Google Drive, Amazonas S3, Cajaetc., o algunos almacenarán los archivos en sus servidores por una tarifa.

máquina de copia de seguridad, Guardacódigo, Dropmysite, Caja de respaldoo Agente de mudanzas para nombrar unos pocos.

¿Quiere copias de seguridad externas redundantes?

Hay muchos servicios que le permitirán crear automáticamente copias de seguridad redundantes remotas en cualquiera de los sitios de almacenamiento en la nube mencionados anteriormente.

Por ejemplo, si hace una copia de seguridad de su sitio en Dropbox, puede usar un servicio llamado Si esto, entonces aquello (IFTTT) para agregar automáticamente los archivos cargados a un determinado Carpeta de Dropbox a Google Drive. De esa manera, si Dropbox alguna vez tiene un problema con sus servidores, también tendrás una copia de seguridad de Google Drive. Backup Box mencionado anteriormente también podría hacer algo como esto.

Espero que esto ayude

Puede haber una mejor manera de hacer todo esto. Estaba en apuros y necesitaba encontrar algo que funcionara de manera confiable, y esto es lo que hace. Si hay alguna mejora que se pueda hacer, por favor compártala en los comentarios.

  • Tendría mucho sentido comprimir los archivos. Así es cómo: $sqlFile = $tempDir.$dbPrefix.".sql.gz"; $createBackup = "mysqldump -h ".$dbHost." -u ".$user." --password='".$password."' ".$dbName."| gzip > ".$sqlFile; (Nota: no creo que esto funcione en Windows).

    – Fabien Snauwaert

    21 de mayo de 2015 a las 7:20

Creo que esta publicación explica una solución que puede ayudarte:
http://ericsilva.org/2012/07/05/backup-mysql-database-to-dropbox/

  • De hecho, me vinculé a esa misma publicación en la pregunta anterior. Sin el código de esa publicación, no creo que hubiera encontrado la solución que estaba buscando. ¡Gracias!

    – ScottD

    3 de octubre de 2013 a las 12:47

¿Ha sido útil esta solución?