phpmyadmin

migrar contenido de drupal a drupal con mysql y phpmyadmin

Atención: lo siguiente es una administración de Drupal de guerrilla. No os recomiendo llevarla a cabo a menos que realmente sepáis que lo necesitáis y sabéis lo que estáis haciendo. Igualmente, un backup antes de poneros en harina es altamente aconsejable. Si pierdes datos o la base de datos entera no me hago responsable de las consecuencias, lo que vas a leer a continuación es sólo apto para no cardíacos, y por tanto si sigues alguna de mis indicaciones lo haces por tu cuenta y riesgo :-).

Caso expuesto: migrar contenido de un drupal a otro, siendo el segundo un Drupal en marcha (más de 6.000 nodos y unos 1.000 usuarios) y el primero con unos 600 nodos y otros 500 usuarios aprox.

Primer paso, backup:

  • mysqldump --opt -uUSER -pPASS BBDDaMigrar  > BBDDaMigrar-BACKUP.sql
  • mysqldump --opt -uUSER -pPASS BBDDaMigrar  > BBDDaRecibirMigracion-BACKUP.sql

 

Segundo paso, migrar los nodos (del Drupal a migrar, se entiende):

  • CREATE TABLE node2 LIKE  node; #creamos una tabla sobre la que jugar
  • INSERT node2 SELECT * FROM node;

 

Repetimos con node_revisions:

  • CREATE TABLE node_revisions2 LIKE node_revisions;
  • INSERT node_revisions2 SELECT * FROM node_revisions;
  •  

Y con los tipos de contenido que tengamos a medida:


    • CREATE TABLE content_type_empresa2 LIKE content_type_empresa;
    • INSERT content_type_empresa2 SELECT * FROM content_type_empresa;

 

La tabla node_type no contiene nid ni datos de este tipo que tengamos que adaptar, solo una descripción por nombre del tipo de contenidos. Por lo tanto, no hace falta migrarla, simplemente nos aseguramos de que existe el tipo de contenido en la base de datos o el Drupal que va a recibir los nodos (page, blog, ... los estándar y cualquier tipo nuevo que hayamos creado nosotros o el admin del sitio).

Ahora volcamos estas tablas en el Drupal que vaya a recibir los datos:

primero, backup de las tablas:

  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen node_revisions2 > node_revisions2.sql
  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen node2 > node2.sql
  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen node_revisions2 > node_revisions2.sql

 

segundo, volcamos el backup en el Drupal receptor.

  • mysql -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDDestino < node_revisions2.sql
  • mysql -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDDestino < node2.sql

Ahora tenemos los nodos en la base de datos final. Sin embargo los datos nuevos tienen ids que coincidirán con los que ya existan en Drupal (en el receptor, se entiende). Solución? Contar los nodos que ya existen y sumar ese número al nid de los nodos que hemos traido a la base de datos. Por ejemplo, en mi caso teníamos unos 6000 y pico nodos. El nid nuevo será 7.000 + nid.

No nos preocupamos por nada más ya que Drupal se encargará de asignar a los nuevos nodos los ids correctos, teniendo en cuenta los nuevos nodos que han aparecido en la base de datos.

Vamos allá:

  • UPDATE  `node2` SET  `nid` = `nid` + '7000';
  • UPDATE  `node_revisions2` SET  `vid` = `vid` + '7000';
    UPDATE  `node2` SET  `uid` = `uid` + '500'  ;

    • UPDATE  `node_revisions2` SET  `nid` = `nid` + '7000'  ;

      

idem con content_..._empresa, o los tipos de contenido que tengamos "a medida":

  • UPDATE  `content_type_empresa` SET  `nid` = `nid` + '7000';
  • UPDATE  `content_type_empresa` SET  `vid` = `vid` + '7000';
  • UPDATE  `content_type_empresa` SET  `uid` = `uid` + '500'  ;

 

cuidado con esto último. El nodo pertenece a un usuario de la BBDD anterior, con lo que también hay que, tanto en node, noderevisions y content, modificar el nuevo usuario.

Bien, en este punto ya estamos listos para volcar estas tablas en su sitio definitivo...o más bien para concatenar las tablas que ya tenemos con estas nuevas.

Primero, una vez más, backup de lo que tengamos:

 

  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen node_revisions > node_revisions.sql
  • mysqldump -uUSUARIOMYSQL -pPASSMYSQL nombreBBDDOrigen node > node.sql

 

Segundo, pasamos concatenamos los nuevos nodos, que es justamente el proceso inverso con el que empezamos todo este "lio":

 

    • INSERT node SELECT * FROM node2;
    • INSERT node_revisions SELECT * FROM node_revisions2;
    • INSERT content_type_X SELECT * FROM content_type_X2;

 

 

Y, si no ha habido ninguna incidencia, tenemos una bonita base de datos con el número de nodos total justamente igual a la suma de los nodos de ambas webs en Drupal, ni más ni menos, y con id's que son:

para la base de datos "receptora", los nid son los mismo,

para la base de datos que "aluniza" en esta base de datos, el nid que tuviera antes más la constante que hayamos elegido como precaución (en nuestro caso 7.000).

En otro post tocaremos el tema de las taxonomías, y cómo podemos migrarlas sin que se produzcan colisiones a la vez que los posts no pierdan sus respectivas clasificaciones.