Cómo sincronizar tus bases de datos en MySQL y PostgreSQL

Sólo un idiota puede ser totalmente feliz.

Mario Vargas Llosa

Suscríbete al feed

Comentarios recientes

Si desarrollas aplicaciones web ya debes estar usando algún sistema de control de versiones para mantener tu código sincronizado entre servidores, ¿pero qué sucede con tus bases de datos en MySQL o PostgreSQL?

Claro, es posible replicar, un posible escenario sería un servidor maestro con uno o más servidores esclavos, pero eso puede ser demasiado para simples proyectos o si solo necesitas estar seguro de que tienes los mismos datos en tus servidores de desarrollo, staging y producción luego de cambios importantes en el código, como por ejemplo, antes de lanzar una nueva versión.

Afortunadamente bastan unos pocos y sencillos comandos para mantener tus bases de datos sincronizadas. Sí, nuevamente la consola al rescate.

El ciclo dump, drop, create

Al igual que la mayoría de desarrolladores creo mis aplicaciones en un servidor de desarrollo. Allí ingreso datos y parámetros de configuración para ser almacenados en una base de datos. Luego, al llegar el momento de enviar mi código al sistema de control de versiones, uso Bazaar por estos días, tengo tres opciones para sincronizar la base de datos con staging y producción:

  1. Ingresar todos los datos nuevos manualmente, tedioso y proclive al error.
  2. Duplicar toda la base de datos —la opción que usaremos.
  3. Duplicar solo las tablas que han cambiado, una sencilla variación a la opción anterior.

Me concentraré en la duplicación de toda la base de datos por ahora pues adaptar para trabajar por tablas es muy sencillo.

Para que este método funcione es necesario que la base de datos tenga el mismo nombre y credenciales de acceso en ambos servidores. En mis ejemplos consideraré un usuario alexis que es propietario de una base de datos llamada cataybea.

Imaginemos que tenemos la base de datos con la información más reciente en un servidor que llamaremos el origen y queremos transferir a otro servidor que llamaremos el destino. El servidor de origen puede ser el de producción cuando queremos usar los últimos datos en vivo en staging, que sería el destino, o podemos tener al servidor de desarrollo como origen y a staging como destino, si queremos probar nuevas funciones que involucran modificaciones en la base de datos. Sea cual sea el caso estos son los pasos a seguir:

  • Exporta la estructura y datos de la base de datos en el servidor de origen a un archivo, una copia de seguridad también conocida como dump.
  • Transfiere el archivo con la copia de seguridad al servidor destino. Yo uso scp pero podrías incluirlo en tu sistema de control de versiones.
  • Borra la base de datos en el servidor destino, como precaución realiza una copia de seguridad, otro dump, antes de hacerlo.
  • Crea una nueva base de datos, con el mismo nombre de la original, en el servidor destino y usa la copia de seguridad del servidor de origen para recrear la estructura y los datos.

Si prefieres puede escribir un script para automatizar el proceso. Veamos ahora los comandos para la consola, empezamos con PostgreSQL.

Sincroniza tu base de datos con PostgreSQL

El usuario administrativo para PostgreSQL suele llamarse postgres. Si aún no lo haces utiliza este usuario para, vía sudo, crear el propietario de la base de datos que quieres sincronizar, el usuario alexis:

sudo -u postgres createuser -P alexis

Ahora crea la base de datos, recuerda que llamo a la mía cataybea:

sudo -u postgres createdb cataybea -O alexis

Cuando tengas todos los datos en el servidor de origen crea el archivo con la copia de seguridad usando:

pg_dump -f cataybea.sql cataybea

El archivo cataybea.sql contiene todo el SQL necesario para recrear la base de datos. Transfiere este archivo al servidor de destino, crea una copia de seguridad de la base de datos existente allí y luego borra la base de datos en el servidor de destino:

dropdb cataybea

Ahora crea otra base de datos con el mismo nombre, los permisos ya están definidos, y usa el archivo con la copia de seguridad del servidor de origen para recrear la estructura y datos:

sudo -u postgres createdb cataybea -O alexis
psql -U alexis -d cataybea -f cataybea.sql

Finalmente confirma que tienes los datos correctos ejecutando algunas consultas:

psql -d cataybea

Sincroniza tu base de datos con MySQL

El usuario administrativo para MySQL suele llamarse root. Si aún no lo haces crea la base de datos en todos tus servidores y asigna un usuario como propietario. Recuerda que en mi ejemplo la base de datos es cataybea y el propietario alexis:

mysqladmin -u root -p create cataybea

Los permisos se configuran a través del cliente de MySQL:

mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON cataybea.* TO 'alexis'@'%' IDENTIFIED BY 'secret';

Cuando tengas los datos listos en el servidor de origen crea el archivo con la copia de seguridad:

mysqldump -u alexis -p cataybea > cataybea.sql

cataybea.sql contiene todo el SQL necesario para recrear la estructura y datos en la base de datos. Transfiere este archivo al servidor de destino, crea una copia de seguridad de la base de datos allí y luego borra la base de datos en el servidor de destino:

mysqladmin -u root -p drop cataybea

Crea ahora una base de datos con el mismo nombre en el servidor de destino, los permisos ya están definidos, e importa la copia de seguridad que transferiste desde el servidor de origen:

mysqladmin -u root -p create cataybea
mysql -u alexis -p cataybea < cataybea.sql

Prueba algunas consultas para confirmar que todo está en orden:

mysql -u alexis -p cataybea

Más ayuda en camino

Puedes sincronizar todas tus bases de datos en PostgreSQL y MySQL con solo seguir los pasos que he presentado. Si deseas más detalles puedes usar el parámetro --help en todos los comandos mencionados, por ejemplo:

psql --help
mysql --help
createdb --help
mysqladmin --help

Y eso es todo, a divertirse sincronizando bases de datos.

Publica comentarios relevantes, usa español correcto y no envíes publicidad. Creemos discusiones en las que valga la pena participar. Puedes usar Markdown.

Tu comentario