Septiembre 17th, 2013

Importar/Exportar tablas de bbdd PostgreSQL

Para realizar esto, hay dos métodos, crear un dump, o crear un archivo sql ejecutable. Es preferible esta segunda opción, puesto que la primera puede dar problemas por la versión de PostgreSQL que tengamos instalada. Veamos a continuación los dos métodos:

Mediante un dump:

#Creamos el archivo dump
pg_dump -Fc -t nombre_tabla nombre_bbdd_origen -f /direccion_destino.dump
#Restauramos el archivo dump
pg_restore -t nombre_tabla -d nombre_bbdd_destino /direccion_destino.dump

Mediante un .sql:

#Creamos el archivo .sql
pg_dump nombre_bbdd_origen -t nombre_tabla > /direccion_destino.sql
#Ahora dentro del cliente pgsql (yo uso este, pero puedes usar otro método)
\i /direccion_destino.sql



Si suprimimos el parámetros -t nombre_tabla, podremos volcar la bbdd completa.

Marzo 30th, 2012

Finalizar querys molestas

Uno de los mejores placeres llegados en PostgreSQL 8.4 es la función pg_terminate_backend.
En el pasado, cuando queríamos matar consultas fuera del control de postgres, llamabamos a pg_cancel_backend. El problema de esto, es que muchas veces postgres reejecutaba la query cuando la llamabamos, y no lograbamos acabar con ella.

Desde PostgreSQL 8.4 hay una nueva función llamada pg_terminate_backend. Esta función no reemplaza a pg_cancel_backend, pero basicamente hace lo que tu quieres cuando entras en el administrador de tareas de windows y haces un kill a determinado proceso. Tampoco corres el riesgo de cargarte el proceso root de postgres y tirar abajo todas las queris cuando te cargas el PID (que era la opción definitiva que teníamos antes para matar una query).

Ejemplos:

pg_cancel_backend vendría a ser un golpe en la muñeca

SELECT pg_cancel_backend(procpid);

pg_terminate_backend sería como darle con un palo en la cabeza.

SELECT pg_terminate_backend(procpid);

Enero 29th, 2011

FATAL: Ident authentication failed for user XXXXX

He instalado postgres en un servidor CentOS, luego he creado el usuario, contraseña y bbbdd. Pero si me intento conectar por PHP, shell o navicat usando la siguiente sintaxis:

psql -d mibbdd -U usuario -W 

Me devuelve el siguinte error:

psql: FATAL: Ident authentication failed for user "username"

¿Como corregir este error?
Abrimos el fichero de configuración de postgres: /var/lib/pgsql/data/pg_hba.conf :

# vi /var/lib/pgsql/data/pg_hba.conf

El fichero controla

  1. Desde que host se permite conectar.
  2. Que clientes están autentificados.
  3. Que usuario the postgres pueden usar.
  4. A qué BBDD pueden acceder

Por defecto, PostgreSQL usa autentificación basada en IDENT. Todo lo que debes hacer es permitir al usuario y contraseña que utilizas para tu conexión. IDENT nunca permitirá que entres a través de las opciones -U y -W. Concatena el permiso al fichero para que puedan entrar todos los usuarios del localhost.

local	all	all	trust
host	all	127.0.0.1/32	trust

Guarda y cierra el fichero, luego restaura el servicio postgreSQL:

# service postgresql restart

Ahora, deberías ser capaz de entrar usando el comando:

# psql -d myDb -U username -W

Junio 3rd, 2009

Unir tablas sin + SQL

La mayoría de los proyectos en los que he trabajado, siempre han tenido bases de datos mysql o oracle en su defecto, pero ultimamente estoy trabajando con PostgreSQL. Esta tiene ventajas como Triggers, herencias y demás que son motivos de por si solas para un nuevo artículo. Lo que voy a comentar en este, es que en oracle tenía la posibilidad de hacer una unión externa con el simbolo (+) en los elementos seleccionados.  Así consigo seleccionar los elementos que no tienen un reciproco en otra tabla. Mi duda era como hacer esto tanto en mysql como en postgreSQL aquí la respuesta

SELECT d.departamento, e.empleado
FROM   dept d
LEFT   JOIN emp e ON e.departamento = d.departamento

Lo que se hace, es invertir las para que la de la “izquierda” (LEFT join) se convierta en la más importante. También, la claúsula WHERE se encuentra eliminada y ahora el criterio de unión está en la claúsula “ON” del LEFT JOIN.