Viernes, 07 Noviembre 2014 16:06

transferir una base de datos postgres solo copiando los archivos... Destacado

Escrito por
Valora este artículo
(0 votos)

Hace años ya que no toco bases de datos, pero la pasión por estos sistemas aún perdura... así es que cuando surgió una tarea de investigación sobre si era posible transferir una base de datos postgres de un servidor a otros a partir de los archivos de datos, aproveché la oportunidad de volver a investigar lo que aparentemente "no se puede hacer".

Este no es un tratado técnico, ya que no tengo información sobre cómo trabaja internamente el motor (lo que se suele llamar los "internals"), sino que simplemente cuento lo que logré, ya que eso era suficiente para nosotros; quizás a algunos les sirva esta información o pueda ser un punto de partida para continuar investigando; ya que no encontré en internet ninguna información que explicara como realizar este procedimiento... Buen provecho !

 

Mi situación es la siguiente: tenemos algunos servidores postgres (versión 8.4) y sería útil tener un procedimiento de contingencia en el caso que no se pueda levantar el motor de base de datos de producción, o cuando necesitamos una copia de datos de producción para motivos de testeo o desarrollo.

Entiendo que hay herramientas que permiten hacerlo en modo limpio, pero sería un salvavidas cuando fallan todas las opciones previstas por la herramienta (por ejemplo, si tuvieramos solo acceso al disco y no al motor de base de datos, si no tuviéramos los últimos archivos de backup por algún motivo, etc.

En pocas palabras, y quisiera que quedara claro, no estoy aconsejando de ninguna manera usar este método (que ni siquiera puedo garantizar que funcione en todos los sistemas), para eso están previstas técnicas y herramientas provistas gratuitamente... Es para aquellos casos especiales en los cuales no se pueden aplicar esas herramientas, o por el simple interés en investigar o "hackear" (aunque esa palabra hoy en día es usada en un modo que hace pensar en algo ilegal).

Una aclaración técnica: este método falla si se intenta intercambiar archivos entre motores que estén corriendo en distintos ambientes (por ejemplo de un linux a un windows), pero funciona bien si se transfieren archivos de base de datos entre motores que están en ambientes idénticos o comparables.

Básicamente el procedimiento consiste en crear una base de datos en el servidor de destino y copiar en el destino los archivos de datos del directorio de origen. En línux hay un paso extra que sería el de cambiar el propietario y los permisos de los archivos de datos.

Pero como todo, una cosa es el concepto y otra son los pasos intermedios necesarios para que el procedimiento resulte, así que acá les detallo los pasos que seguí para lograr el resultado:

  1. (en la base de datos origen), buscar el directorio de datos. Esto puede ser hecho, por ejemplo, realizando una consulta de sql con el comando SHOW ALL y buscando la variable "data directory". Para la explicación, vamos a referirnos a este directorio como <DIRECTORIO_DATOS_ORIGEN>
  2. (en la base de datos de destino) buscar el directorio de datos y tomar nota del mismo. Vamos a referirnos a este directorio como <DIRECTORIO_DATOS_DESTINO>
  3. Tomar nota del OID de la base de datos que se desea transferir. Esto puede verse en las propiedades de la base de datos o, si no es posible, leyendo con un editor de textos (vi, notepad) el archivo <DIRECTORIO_DATOS_ORIGEN>/global/pg_database (en linux) o <DIRECTORIO_DATOS_ORIGEN>\global\pg_database (en windows). Este archivo contiene una línea para cada base de datos instalada en el sistema, tomar nota del número que aparece a continuación del nombre de la base de datos que deseamos copia. Vamos a referirnos a este número como <NUMERO_OID>
  4. En el directorio <DIRECTORIO_DATOS_ORIGEN>/base (si es lunux) o en <DIRECTORIO_DATOS_ORIGEN>\base (si es windows) van a encontrar un directorio que tiene como nombre el <NUMERO_OID> de la base de datos que desean transferir.
  5. Copiar ese directorio en el servidor de destino
  6. En el servidor de destino, crear una nueva base de datos (que va a contener los objetos que quieren copiar. Tomar nota de su OID, con cualquiera de los métodos indicados en el punto 3.
  7. Identificar en el servidor de destino, el directorio que tiene el OID del punto 6 (tiene que estar en el directorio <DIRECTORIO DATOS_DESTINO>/base (si es linux) o <DIRECTORIO_DATOS_DESTINO>\base (si es windows)
  8. (En el servidor de destino) Detener el proceso (en linux) o el servicio (en windows) de postgres
  9. Borrar los archivos que están presentes en ese directorio, y copiar en él los archivos que están presentes en el directorio que copiaron en el punto 5
  10. (solo para linux) modificar los permisos de los archivos copiados. Para identificar qué permisos tienen que tener, tomar como base los archivos de otra base de datos (en mi caso fue un CHMOD 0600 y CHGROUP postgres)
  11. Relanzar el proceso (o servicio) de postgres
  12. Disfrutar con el resultado

Como comentaba, no es posible transferir archivos de windows a linux o viceversa, porque el formato de datos es dependiente del sistema operativo... y sospecho que tampoco es posible transferir bases de datos de un sistema 32 bit a uno de 64 bit, pero eso queda para que pruebe hacerlo otra persona.

 

Leer 3289 veces Modificado por última vez en Viernes, 10 Noviembre 2017 15:50
elDba

Soy el creador y autor de este sitio, donde comparto mis intuiciones, conocimientos y descubrimientos a lo largo de mi vida.

Principalmente orientado a mis experiencias laborales.

Soy siempre yo, tres en uno: elCoach, elScrumamaster y elDba... y por supuesto, aunque no tenga perfil en el sitio, soy también:

  • elTrainer
  • elDesarrollador
  • elConferencista
  • .... y próximamente elAutor

 

https://www.linkedin.com/in/pabloagil/
Volver arriba