Sincronización de bases de datos entre entornos dev/staging y producción en WordPress

22 sept 2010, 16:18:30
Vistas: 16.1K
Votos: 37

Tengo un problema con la sincronización de bases de datos de WordPress entre desarrollo y producción y me pregunto cómo lo resuelven otras personas. Sé que existe esta pregunta pero no cubre realmente el caso de uso más complejo y realista.

Supongamos que tengo un sitio WordPress en vivo. Hice un volcado de todo, replicándolo en nuestro entorno de desarrollo. Comencé a hacer cambios. 1 semana después estoy listo para implementar mis actualizaciones. Mientras tanto, la base de datos en el sitio de producción ha cambiado (nuevos posts, nuevos comentarios, etc.). ¿Cómo sincronizo los cambios entre producción y desarrollo durante el despliegue y es posible automatizar (al menos parcialmente) este proceso?

2
Comentarios
Todas las respuestas a la pregunta 4
2
10

Puede que haya una mejor manera que se me esté pasando, pero te voy a dar 2 opciones:

1. Usar la exportación XML para exportar tus nuevas entradas y comentarios. Luego usar el Importador de WordPress para importar las nuevas entradas y comentarios de vuelta a la base de datos de desarrollo

Es mejor importar al entorno de desarrollo y luego mover la base de datos a producción porque cuando importes, se descargarán todos los nuevos archivos multimedia desde producción.

Mientras tanto, producción ha cambiado (nuevas entradas, nuevos comentarios, etc.)

Esto resolvería tu problema de incorporar cualquier contenido cambiado.

2. Usar el comando MySQL INSERT IGNORE INTO para añadir las nuevas tablas desde desarrollo. O el comando REPLACE para sobrescribir filas duplicadas en la misma tabla.

Antes de usar MySQL haz una copia de seguridad de ambas bases de datos y mueve la base de datos comprimida (gz) al servidor de producción y sube el volcado (cambia el nombre de la de desarrollo si es el mismo que producción).

INSERT IGNORE INTO `_wp_production_db`.`wp_cool_plugin_options`
SELECT *
FROM `_wp_dev_db`.`wp_cool_plugin_options`

Personalmente no me siento cómodo con comandos MySQL, así que yo elegiría la opción 1.

23 sept 2010 04:45:31
Comentarios

nota que la exportación XML se detiene en algún punto con la cantidad de publicaciones, por ejemplo en mi blog con +10.000 publicaciones no puedo usarlo.

edelwater edelwater
14 nov 2010 23:26:06

@edelwater, sí esto depende de la configuración del servidor para max_execution_time (normalmente 30 segundos), para exportaciones muy grandes este valor debe establecerse más alto (1-2 minutos o más)

mike23 mike23
28 jul 2011 17:18:41
3

Si solo se trata de más datos del mismo tipo (algunas publicaciones nuevas en el blog, nuevos comentarios), no estoy seguro de por qué necesitas sincronizarlos realmente. No es que vaya a cambiar la forma en que funciona el código en el sitio, ya que simplemente es más de lo mismo. Normalmente no me preocupo por ello a menos que sea un nuevo tipo de datos.

Siempre me aseguro de tener una buena muestra de los datos del sitio, no cada publicación, página o comentario del sitio en vivo.

22 sept 2010 17:21:33
Comentarios

¡Buen punto! Sin embargo, si en producción hay algunos cambios en el área de contenido puro (publicaciones, comentarios) y en desarrollo hay cambios en configuraciones y ajustes (por ejemplo, se agregaron 5 plugins y se modificaron sus configuraciones), ¿cómo transferirías esos cambios de configuración sin tener que hacer el trabajo dos veces (una en desarrollo y otra en producción)?

Alex Alex
22 sept 2010 17:39:26

esa es la verdadera pregunta, ¿no? Y no tengo una respuesta para eso.

curtismchale curtismchale
23 sept 2010 00:26:16

-1. A veces sí necesitamos tenerlos sincronizados. Especialmente para los id de publicaciones/páginas de la base de datos.

Francisco Corrales Morales Francisco Corrales Morales
21 jul 2014 23:22:30
0

Tan pronto como tocas el tema de realizar cambios en paralelo, entras en el área de gestión de configuración. Con muchos patrones, comunidades propias (http://www.cmcrossroads.com/) y herramientas no tanto para la gestión de versiones (como svn/git) sino para el soporte de la gestión de configuración (patrones) como clearcase. (áreas totalmente diferentes).

En este caso sigue siendo una situación simple y encontrarás que funciona con algunas limitaciones, algo de trabajo manual y algunas listas.

El escenario en el que estoy pensando para hacerlo más descriptivo de la solución ideal: múltiples desarrolladores trabajando en la misma base de código, múltiples entornos de prueba, múltiples entornos de aceptación, múltiples entornos de aceptación de producción posiblemente en todos los rincones del mundo.

Si quisieras hacer esto un poco más profesional:

a) Haz una lista de todos los Elementos de Configuración con los que te encuentres, esto podría ser el código de WordPress en sí, plugins externos, contenido, metadatos y decide cuáles de estos quieres poner bajo algún tipo de "gestión", cuáles importan.

b) Describe los flujos de trabajo que pueden ocurrir, por ejemplo, qué pasa con una corrección, qué pasa con algo nuevo en desarrollo, en qué caso cambias contenido en tu lado, cómo se llama eso, y quién lo hace, quién es el dueño, por ejemplo, una nueva entrada o un nuevo plugin.

c) Para el trabajo en paralelo primero describe qué EC quieres gestionar, decide si el flujo siempre va desde desarrollo a producción o si realmente necesitas hacerlo en ambos sentidos.

d) Para cada tipo de EC en (a) escribe una resolución. Por ejemplo, para TODO lo que es texto (o texto exportado como archivos php pero TAMBIÉN texto plano en archivos XML) la fusión es posible. Esto realmente no es un problema pero necesitas una buena herramienta de fusión. por ejemplo, con ClearCase obtendrías en una fusión de 3 vías las siguientes situaciones: 1) Fusiones triviales: las hará automáticamente 2) No triviales automáticas: las hará automáticamente PERO necesitas verificarlo 3) No triviales no automáticas: esto es un conflicto, por ejemplo, en 1 línea se han hecho varios cambios. Las no triviales son la parte mínima que necesitas revisar manualmente, una buena herramienta de fusión te guiará en esto, por ejemplo, la de clearcase (que también hace fusión de palabras y donde puedes enlazar otros fusionadores comerciales o no comerciales para tipos de archivo específicos). Además, si has identificado en (a) archivos que deberían ser solo copiados, entonces su comportamiento sería no fusionarse sino simplemente copiarse en un sentido sobrescribiendo la otra versión sin fusión (por ejemplo, plugins que no has modificado). Muchos de estos tipos son posibles con diferentes comportamientos. Pero escribe las relaciones entre los EC.

Luego, para las fusiones no basadas en texto, necesitas tomar una decisión sobre cómo manejarlas, por ejemplo, imágenes que han sido cambiadas en 2 lugares. Podrías decidir aquí que producción siempre tiene preferencia (al menos eso es lo que yo pensaría), lo que lo hace simple.

Entonces... para resolver este problema necesitas una herramienta de gestión de versiones que soporte diferentes flujos. Cada flujo representaría una parte. (esto puede ser inmensamente complejo dependiendo de tus necesidades pero en este caso creo que es muy simple).

Si ahora puedes lograr tener estos flujos bajo tus instalaciones de WordPress y sincronizarlos también con el contenido de la base de datos, etc... entonces puedes realizar las fusiones en la herramienta de CM/gestión de versiones y luego exportarlo de vuelta al otro entorno.

El asunto es... necesitas escribir esto primero. Esto no es un truco técnico. Es un patrón estándar alrededor de la Gestión de Configuración, así que nada extraño aquí, pero necesitas escribirlo. Podrías encontrar, por ejemplo, que un plugin instalado hace cambios en la base de datos con algunos datos que son diferentes en otro entorno, así que necesitas un procedimiento extra alrededor de esto.

Técnicamente casi siempre todo es posible, revisa http://www.cmcrossroads.com/forums para escenarios que son docenas o cientos de veces más complejos aunque siempre usando el mismo enfoque y el mismo conjunto de patrones de CM.

En resumen: pon una capa de gestión de versiones debajo, automatiza las fusiones y maneja los conflictos, luego importa en el entorno objetivo. Piensa en una estrategia de flujos que encaje aquí y escríbela. Realiza un poquito de gestión de CM. Esa sería la solución profesional, de lo contrario instala algún truco de copia de base de datos, scripts, etc...

14 nov 2010 23:55:50
0

Acabo de publicar un artículo sobre cómo sincronizo nuestros datos de producción con el entorno de staging. Puedes leer mi publicación en el blog sobre esto en: http://blog.wp.weightpoint.se/2012/01/04/synchronizing-wordpress-multisite-database-from-production-to-staging-enviorment/

Si también deseas sincronizar el código y otros elementos, te recomendaría crear un repositorio git o mercurial con el archivo .ignore correspondiente.

Si deseas realizar actualizaciones diferenciales desde staging a producción, entonces supongo que crear scripts de migración es la forma más segura y adecuada.

6 ene 2012 01:21:21