Migración de base de datos wordpress

10 minutos de lectura

Revisé los foros de WordPress sobre esto y no encontré nada, así que pensé que podría intentarlo aquí.

Si tiene una configuración de WordPress de ensayo/desarrollo utilizada para probar nuevos complementos y demás, ¿cómo hace para migrar los datos de la base de datos de ensayo a la base de datos de producción? ¿Existe una forma de “mejores prácticas de WordPress” para hacer esto, o estoy limitado a tener que migrar tablas manualmente de una base de datos a otra?

Tengo un script que mysqldumpea una copia de mi base de datos de producción de WordPress, la restaura sobre mi instalación de prueba de WordPress y luego corrige todas las configuraciones y direcciones URL de “producción” en la base de datos de prueba.

Tanto mi base de datos de producción como la de prueba viven en el mismo servidor, pero puede cambiar la configuración de mysqldump para volcar desde un servidor mysql remoto y restaurar a un servidor local con bastante facilidad.

Aquí están mis guiones:

overwrite_test.coach_db_con_coache_db.sh

#!/bin/bash 
dbUser="co*******"
dbPassword="*****"
dbSource="coach_production"
dbDest="coach_test"
tmpDumpFile="/tmp/$dbSource.sql"

mysqldump --add-drop-table --extended-insert --user=$dbUser --password=$dbPassword --routines --result-file=$tmpDumpFile $dbSource
mysql --user=$dbUser --password=$dbPassword $dbDest < $tmpDumpFile
mysql --user=$dbUser --password=$dbPassword $dbDest < /AdminScripts/change_coach_to_test.coach.sql

change_coach_to_test.coach.sql

-- Change all db references from @oldDomain to @newDomain

SET @oldDomain = 'coach.co.za';
SET @newDomain = 'test.coach.co.za';
SET @testUsersPassword = 'password';

UPDATE `wp_1_options` SET `option_value` = REPLACE(`option_value`,@oldDomain,@newDomain) WHERE `option_name` IN ('siteurl','home','fileupload_url');
UPDATE `wp_1_posts` SET `post_content` = REPLACE(`post_content`,@oldDomain,@newDomain);
UPDATE `wp_1_posts` SET `guid` = REPLACE(`guid`,@oldDomain,@newDomain);
UPDATE `wp_blogs` SET `domain` = @newDomain WHERE `domain` = @oldDomain;
UPDATE `wp_users` SET `user_pass` = MD5( @testUsersPassword );

-- Only valid for main wpmu site
UPDATE `wp_site` SET `domain` = @newDomain WHERE `domain` = @oldDomain;

Tal vez solo estés buscando algo equivocado. ¿Un complemento de copia de seguridad no manejaría esto con facilidad? Sé que existen para todos los grandes paquetes de CMS…

Los dos métodos serían utilizar la función de exportación/importación en herramientas o copiar la base de datos. Me envío por correo electrónico una copia de mi base de datos de producción semanalmente usando el complemento de copia de seguridad de la base de datos de WordPress.

La función de importación puede ser problemática para mover un blog de wordpress, ya que debe configurar su archivo php.ini a menudo porque el valor predeterminado de los archivos que puede cargar en una implementación de php alojada tiende a ser demasiado pequeño de forma predeterminada.

avatar de usuario
bicho raro

Quería extraer la base de datos de mi sitio web de producción de wordpress en una copia de desarrollo fuera de línea en mi máquina de escritorio para poder modificar el sitio y probarlo con un conjunto completo del contenido y el historial del blog existente.

Esto resultó ser problemático, ya que simplemente hacer una copia de seguridad fuera de línea de la base de datos e importarla a la base de datos de desarrollo local no funcionó.

Superar estos problemas al mover datos de la base de datos de producción a la de desarrollo probablemente también se pueda usar para ir en el otro sentido, así que creo que también puede usar estas pautas para lo que quiere hacer: simplemente comience con los datos de desarrollo y mueva para prod.

Los problemas aquí fueron:

  1. las designaciones de enlaces permanentes para las publicaciones del blog están todas almacenadas en la base de datos como lo estarían para la versión en línea, pero mi copia fuera de línea no está en la dirección del dominio, sino en el directorio localhost. Entonces, cuando abro el sitio localmente, aunque el formato css y las imágenes están en su lugar (los enlaces de imágenes son relativos), las publicaciones de blog reales no aparecen.
  2. muchos de los enlaces en todo el sitio enlazan con Internet, por lo que si intenta navegar a archivos, comentarios, categorías o publicaciones principales, lo envían de regreso a Internet en lugar de permanecer en la base de datos en el máquina local.

Para asegurarme de que estaba haciendo esto bien, eliminé la instalación de wordpress que tenía en mi máquina local y reinicié desde cero.

Una vez que tuve una instalación limpia y nueva de wordpress y una nueva base de datos local predeterminada recién creada, abrí la base de datos en phpMyAdmin y eché un vistazo a wp_posts

mesa. Allí dentro, cada registro (en otras palabras, cada publicación) tiene una columna titulada “guid”, que muestra la ubicación de esa publicación. Por ejemplo, el primero en un nuevo, por defecto

install contiene este valor “guid”:

http://localhost/wordpress/?p=1

Si miras en la tabla wp_posts de tu versión en línea, verás en esta ubicación la URL de tu sitio en línea.

No puede simplemente importar las tablas al por mayor en su instalación local, porque estará importando todas estas referencias externas. Hará que su versión local sea imposible de navegar localmente.

Entonces, creé una copia de respaldo de la base de datos de mi sitio en línea y la guardé localmente como un archivo .sql. Luego abrí ese archivo en un editor de texto (usé notepad ++, una gran pieza de software gratuito, pero podría usar cualquier editor de texto). Cosas que necesitaba tener en cuenta:

  • Por alguna razón, las tablas en mi sitio en línea no son solo, por ejemplo, “wp_posts” – son “wp_something_posts”… hay algunas letras adicionales en los nombres de las tablas.
  • Cualquier referencia a http://… que contenga mi URL en línea en lugar de localhost/wordpress

Para mantenerlo simple, hagamos solo las publicaciones. En la copia de seguridad del .sql que ha hecho de su base de datos en línea, busque el comienzo de la tabla wp_posts. Se verá algo como esto:

--

-- Table structure for table `wp_posts`

--



DROP TABLE IF EXISTS `wp_posts`;

CREATE TABLE `wp_posts` (

…y así. Resalte todo lo que esté arriba hasta justo debajo del comentario que marca el comienzo de la base de datos en la parte superior del archivo (dirá — Base de datos: ‘el nombre de su base de datos’) y elimínelo. Luego vaya al final de su tabla wp_posts y elimine todo lo que esté después y luego termine hasta el final del archivo. Ahora su archivo solo contiene sus publicaciones y nada más.

Guárdelo como un documento separado. Llámalo publicaciones.sql o algo así.

Ahora, en este publicaciones.sql archivo, debe realizar dos acciones de buscar/reemplazar.

  1. Encuentre todas las instancias del nombre de la tabla wp_something_posts y reemplácelas con wp_posts. Solo necesita hacer esto si su copia de seguridad de su base de datos en línea no coincide con su instalación local limpia en lo que respecta a los nombres de las tablas. Desea que el nombre de la tabla en este archivo coincida con lo que tiene su base de datos de wordpress instalada localmente como este nombre de tabla. Si no hace que estos nombres coincidan, simplemente terminará importando las publicaciones en una nueva tabla con un nombre diferente, que no le servirá de nada.
  2. Encuentre todas las instancias de http://… (reemplace los puntos suspensivos con su URL) y reemplácelos con
    http://hostlocal/wordpress (o cualquiera que sea la URL local de su versión de desarrollo del sitio)

Ahora guarde este archivo nuevamente, para asegurarse de que haya configurado estos cambios.

Ahora que lo ha hecho, use phpMyAdmin para ingresar a la base de datos de wordpress en su máquina local, seleccione la pestaña “importar” y navegue el selector hasta la publicaciones.sql que acaba de crear y luego impórtelo. Esto extraerá todos los datos de ese archivo a su tabla wp_posts local.

Cuando termine, navegue por su sitio local de wordpress. Verás todas tus publicaciones allí ahora. ¡Hurra!

Es posible que deba hacer algo similar para algunas otras tablas si desea incorporar sus comentarios, etiquetas, categorías y páginas estáticas que ha creado, etc.

Me doy cuenta de que este es un proceso complicado. Probablemente exista una herramienta en alguna parte que facilite esta actividad, y si alguien conoce alguna, me encantaría conocerla. Si alguien conoce una mejor manera de hacer esto manualmente que la que he descrito, ¡me encantaría saber eso también!

Hasta entonces, esta es la forma en que descubrí cómo hacerlo. Esperemos que te ayude a ir en la dirección correcta.

avatar de usuario
pete saia

Necesita manejar los objetos serializados. Aquí hay un utilidad HTML5 del lado del cliente para manejarlo Debido a que es todo javascript, es bastante rápido.

La alternativa sería conectar un script bash a su implementación. Entonces, una vez que se implementa el sitio, se realiza una copia de seguridad de la base de datos y se deserializa con el nuevo dominio.

avatar de usuario
markratledge

Esto resume los problemas con la arquitectura central de wordpress… pero escribí un complemento que resuelve los problemas con los nombres de dominio y las direcciones URL absolutas que se almacenan en la base de datos:

http://wordpress.org/extend/plugins/root-relative-urls/

Esto resolverá los problemas descritos por @oddbill. Aunque no se preocupe demasiado si la URL está en la columna GUID, ya que ese campo nunca se usa para la generación de enlaces.

@markratledge proporciona un par de enlaces a algunos documentos extensos que básicamente dicen esto:

//exportar

mysqldump -u[username] -p[password] [database] > backup.sql

//importar

mysql -u[username] -p[password] [database] < backup.sql

Querrá excluir las tablas comments/comments_meta si pasa a producción desde la preparación para no perder todos sus comentarios y trackbacks (el enfoque de (@DavidLaing los eliminará). Y esto supone que solo realiza cambios de contenido en su ambiente de puesta en escena. Si desea realizar cambios en la producción y su entorno de prueba, deberá escribir scripts que sincronicen los datos en lugar de sobrescribirlos al por mayor… buena suerte en esa tarea, ¿puedo sugerir agregar columnas de creación y marca de tiempo modificada antes de invertir? demasiado tiempo con el esquema actual.

Y, por último, el enfoque de @RussellStuever es adecuado en la mayoría de las circunstancias, solo asegúrese de saber cuándo está navegando en su sitio asignado de host en comparación con su sitio de producción. Y realmente esté seguro de ello, porque algunos navegadores almacenan en caché las búsquedas de dns durante días hasta que las cierra físicamente y comienza un nuevo proceso. En ese momento, cambiar de host puede llevar algo de tiempo y cambiar con frecuencia puede ser frustrante. Y si necesita probar con un iPhone, primero deberá publicar el sitio en vivo o usar un buen enrutador que pueda reasignar las solicitudes de Internet salientes a los servidores locales porque no puede modificar los archivos de host en la mayoría de los dispositivos móviles.

Mi plugin te permite desarrollar y probar desde http://servidorlocal/ o http://staging.server.local/ o http://www.produccion.com sin ninguna de las trampas habituales. Y luego, para migrar datos, es tan simple como exportar e importar los datos, sin necesidad de realizar ajustes en la configuración de la base de datos ni en el paso de búsqueda y reemplazo.

Y no confíe en la herramienta de importación/exportación, no captura todo en las instalaciones típicas de wordpress, y aún requiere un paso de búsqueda y reemplazo innecesario.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad