2010-12-06 18 views
20

Necesito copiar una base de datos de Postgres de un servidor a otro, pero las credenciales que tengo no tienen permiso para bloquear la base de datos por lo que falla un pg_dump. Tengo derechos de lectura/actualización/inserción completos para el DB en cuestión.Copie una base de datos postgres sin permisos LOCK

¿Cómo puedo hacer una copia de esta base de datos? No estoy preocupado por las contradicciones (se trata de una pequeña base de datos en un servidor dev, por lo que los riesgos mínimos de inconsistencias durante el extracto)

[editar] error completo:

$ pg_dump --username=bob mydatabase > /tmp/dump.sql 
pg_dump: SQL command failed 
pg_dump: Error message from server: ERROR: permission denied for relation sl_node 
pg_dump: The command was: LOCK TABLE _replication.sl_node IN ACCESS SHARE MODE 

Respuesta

13

ERROR: permission denied for relation sl_node

Este es su problema real.

Asegúrate de que el usuario bob tiene privilegio SELECT para _replication.sl_node. ¿Es por casualidad una mesa del sistema Slony o algo así?

+0

Han pasado algunos años desde que hice esta pregunta, pero de memoria sí, había algunas cosas de Slony que estaban causando problemas. – DrStalker

+0

DrStalker Tengo el mismo problema. Solo respaldo una base de datos diferente. pero de alguna manera pg_dump tratando de hacer una copia de seguridad de una tabla slony. ¿Alguna idea de por qué? –

6

Usted necesita SELECT permisos (lectura) en todos los objetos de la base de datos para hacer un volcado, no LOCK permisos (cualquiera que sea). ¿Cuál es el mensaje de error completo al iniciar pg_dump para hacer un volcado?

+0

ErrorMessage completa añadió a la pregunta, gracias – DrStalker

+0

veo. Parece que no tienes permisos SELECT para esta tabla. Del manual: "LOCK TABLE ... IN ACCESS SHARE MODE requiere privilegios SELECT en la tabla de destino". http://www.postgresql.org/docs/current/static/sql-lock.html Debes obtener los permisos y volver a intentarlo. –

3

pg_dump no bloquea la base de datos completa, sin embargo, obtiene un bloqueo explícito en todas las tablas que se va a volcar. Este bloqueo se toma en el "modo de acceso compartido", que es el mismo nivel de bloqueo requerido por una instrucción SELECT: su intención es protegerse contra una de las tablas que se descartan entre decidir qué tablas vaciar y luego obtener los datos.

¿Parece que su problema podría ser que está intentando volcar una tabla para la que no tiene permiso? PostgreSQL no tiene derechos de lectura/actualización/inserción a nivel de base de datos, por lo que tal vez solo está perdiendo el privilegio de selección de una sola tabla en alguna parte ...

Como Frank H. sugirió, publique el mensaje de error completo y Trataremos de ayudar a descifrarlo.

+0

Mensaje de error completo agregado a la pregunta, gracias – DrStalker

2

¿Ejecutaste 'pg_dump' con la U-U correcta (usuario que posee ese db)? En caso afirmativo, simplemente como dijo otro cartel, verifique los permisos.

HTH

6

Esto funcionó para mí

sudo -u postgres pg_dump -Fc -c db_name > file_name.pgdump 

A continuación, cree una base de datos y ejecutar pg_restore que:

sudo -u postgres /usr/local/pgsql/bin/pg_restore -U postgres -d db_name -v file_name.pgdump 
3

https://forums.aws.amazon.com/thread.jspa?threadID=151526

este enlace me ha ayudado mucho. Se refiere a otra,

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS

primera vez que se cambia el ownship a rds_superuser, a continuación, pega este fragmento de código,

CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$    
BEGIN EXECUTE $1; RETURN $1; END; $f$; 
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO rds_superuser') 
FROM (
SELECT nspname, relname 
FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) 
WHERE nspname in ('tiger','topology') AND 
     relkind IN ('r','S','v') ORDER BY relkind = 'S') 
s;   

a partir de entonces, soy capaz de volcar toda mi base de datos.

+0

esto funcionó para mí cuando actualicé de postgres 9.5 a 9.6 y empecé a tener este problema con RDS – psychok7

+0

; el primer paso para mí fue, por cierto, 'alterar el propietario de la topología del esquema a rds_superuser;' – psychok7

0

Esto funcionó para mí -d dbname -n schemaname

pg_dump -v -Fc -h <host> -U <username> -p -d <db_name> -n <schema_name> > file_name.pgdump 

esquema predeterminado es public

Cuestiones relacionadas