moviendo Postgresql

Toca cambiar el servidor donde tengo el postgresql y como se trata de unas base de datos pequeñitas y tal no hay ni replicación ni nada complicado. He aquí como lo he hecho en ubuntu server aunque me he cargado las configuraciones de la distribución y sigo el manual de la web de postgres

Antes que nada: http://www.postgresql.org/docs/ :)

Primero "arreglo" (o estropeo) el environment del usuario postgres
  1. apt-get install postgresql
  2. por lo que veo te instala el postgres tal que los datos estan en /var/lib/postgresql/version/main y los programas en /usr/lib/postgresql/blabla/bin y las configuraciones en /etc/postgresql. De hecho esto esta muy bien, pero yo me aclaro mas siguiendo el manualillo por lo que:
  3. mkdir -p /home/postgres/data ; chown -R postgres.postgres /home/postgres ;; chmod -R 0700 /home/postgres
  4. edito /etc/passwd para que la home del usuario postgres sea /home/postgres
  5. copio el /etc/skel a /home/postgres, chown again
  6. edito el .profile de /home/postgres para incluir en el path del usuario los programas de postgres que están (para mi versión) /usr/lib/postgresql/9.1/bin
  7. su - postgres y compruebo que tenga los programas en el path y los pueda ejecutar 
Ahora inicializo el espacio de la base de datos en /home/postgres/data

  1. initdb -D /home/postgres/data
  2. edito /home/postgres/data/postgresql.conf para modificar la directiva listen_address = '*' y aceptar conexiones tcp
  3. Entro a postgres via psql
  4. Modifico el password del super user (postgres) para conocerlo: ALTER ROLE postgres encrypt password 'password' y salgo con \q
  5. Creo el usuario de una futura base de datos: createuser -E -l -P usuario de manera que no sea ni superusuario ni pueda crear roles ni añadir mas bases de datos
  6. Creo una base de datos para ese usuario: createdb db1 -O usuario
  7. Ahora solo queda recuperar un dump del servidor viejo con psql db1 < db1.dump
  8. Repetimos los pasos 6 y 7 para todas las bases de datos (del usuario del punto 5, claro)
  9. No se si es necesario pero al final hago un vacuumdb -a -e -f -v
Ahora ya tenemos el postgres con las bases de datos y usuarios creados y restaurados. Nos encargamos de la autentificacion de los clientes. Para ello hay que modificar el /home/postgres/data/pg_hba.conf

Añado o modifico tal que queda así:
local    all             all                                    md5
# IPv4 local connections:
#host    all             all             127.0.0.1/32            trust
host     all             all             127.0.0.1/32           md5
host     db1          usuario              10.0.0.0/16            md5
host     postgres        all             10.0.0.0/24            md5
de esta manera tengo:
  1. Incluso las conexiones desde consola pide password
  2. Acepta conexiones a db1 para el usuario usuario de la red 10.0.0.0/16
  3. Pongo que la base de datos postgres sea accesible para el programa pgAdmin.
Pos ala, pongo los programas para que accedan a este servidor y funcionan sin problems!

Ahora solo queda modificar el /etc/init.d/postgres para controlar el inicio/detención del servidor:

  1. cp /etc/init.d/postgresql /etc/init.d/postgresql.orig
  2. start) su - -c 'pg_ctl start -D /home/postgres/data' postgres
  3. stop) su - -c 'pg_ctl stop -m f -D /home/postgres/data' postgres
ale. (el -m f es para desconectar los clientes activos, sino, el servidor no para hasta que todos los clientes se han desconectado).

Al reiniciar el servidor, veo que no me arranca, joder. Al intentar arrancar manualmente me dice que no puede crear el pidfile en /var/run/postgresql/. Veo que el directorio no esta creado, pos nada, se crea y se le hace un chown postgres.postgres al directorio y a funcionaaaaaaaarrr pero al reiniciar estamos igual (por algun motivo el /var/run/postgresql no se crea. Solución:
  1. en /home/postgres/data/postgresql.conf editar las directivas external_pid_file y unix_socket_directory para que apunten a /home/postgres/data
  2. O, podriamos editar el /etc/init.d/postgresql para que el start cree el directorio /var/run/postgresql y le haga el chown postgres.postgres
Opto por la opción 1, reinicio y oh! sorpresa, postgres esta funcionado pero al intentar acceder por consola, el programa psql busca el socket de unix en /var/run.... (en cambio via pgadmin que usa ipv4 no hay problem...) cagon la leche. Optamos pues por la opción 2. Deshacemos los cambios de postgresql.conf sobre el pid_file y el unix_socket_directory y modificamos /etc/init.d/postgresql:

RUNDIR="/var/run/postgresql"
start)
  if [ ! -e $RUNDIR ]
  then
     mkdir $RUNDIR
     chown postgres.postgres $RUNDIR
  fi
  su - -c 'pg_ctl start -D /home/postgres/data' postgres
  ;;
ahora si....

Comentarios