Skip to Content

Arreglo de rutas url en la base de datos de drupal en GNU Linux cuando se cambia a un sitio en produccion

Cuando queremos llevar nuestro sitio desarrollado en forma local a un sitio de produccion en algun servidor privado o comercial, primero subimos todos los archivos del sitio por algun medio seguro preferentemente, pero tambien implica subir la base de datos, en otras palabras subir el volcado de la base (ya sea mysql o postgres), que es texto plano con instrucciones sql que sirven para crear y llenar de contenido la base en el servidor.

Hasta aca no hay problemas, mucha de la información guardada por drupal haciendo refrencia a archivos, imagenes, nodos, etc estan guardados en la base de forma relativa para que cuando se cambie de ubicacion el sitio no afecte al contenido, pero cuando se usan herramientas WYSIWYG: editores como tinymce ckeditor guardan rutas de forma absoluta o no totalmente relativa en la base de datos, por ejemplo:

Sitio de produccion, en algun lugar de la base la url de un reporte estara guardada como:
'http://localhost/sitio-de-prueba/sites/default/files/reporte.pdf'

Lo que aca vemos es que el sitio de desarrollo esta en un subdirectorio en localhost, que cuanto se sube al servidor de produccion no esta presente porque estará ubicado en la raiz del directorio virtual:
'http://mi-dominio.com/sites/deafault/files/reporte.pdf', ahora el verdadero problema es cuando esta ruta 'localhost/sitio-de-prueba' esta distribuida en muchos registros de la base de datos, facilmente podemos saberlo al ejecutar este comando con el volcado de la base de datos:
 

#cat basedatos.sql | grep 'sitio-de-prueba'


Dependiendo cuanta información se haya guardado usando estos editores para web habra muchos lugares donde poder reemplazar.

usamos el comando de c-shell sed. sed es un editor no interactivo que puede ser usado desde la linea de comando, muy util cuando los archivos son de muchos megas que pueden hacer colapsar a la mayoria de los editores de texto:
 

#sed 's|localhost/sitio-de-prueba/|mi-dominio/|g' basedatos.sql

esta sentencia consta de 4 parametros separados por el delimitador | evitando usar el / para no tener que utilizar caracteres de escape \ en las cadenas que usen /, el codigo quedaria complicado de la siguiente forma:
 

#sed 's/\/localhost\/sitio-de-prueba\//mi-dominio\//g' basedatos.sql

s: permiter reemplazar una cadena
'localhost/sitio-de-prueba/' es la cadena buscada
'mi-dominio/' la cadena que se reemplazara
g: es para reemplazar todas las cadenas que encuentre en cada linea.

Muy util cuando el volcado de base de datos pesa muchos megas