Posted on: May 24, 2022 09:40 AM
Posted by: Renato
Categories: postgresql database sql Dicas dba
Views: 618
Erro ao tentar realizar backup de base de dados em postgresql
erro ao ler objeto grande 118287: ERROR: permission denied for large object 118287
Pesquisei sobre o erro e encontrei as seguintes informações
Desde a versão 9.0, cada large object no PostgreSQL possui seu OID, assim como tabelas, índices etc., não devendo ser tratado como simples registro da tabela pg_largeobject
e portanto não sendo automaticamente legível pelo usuário dono desta tabela. Você pode listar os large objects e seus respectivos donos via psql
com o comando \lo_list
:
nunks=# \lo_list
Large objects
ID | Owner | Description
-------+-------+-------------
16820 | nunks | Smiley :D
(1 row)
Para conceder a um usuário os direitos de leitura do large object especificado na pergunta, utilize:
GRANT SELECT ON LARGE OBJECT 118287 TO nome_do_usuario;
Como seu caso implica na leitura de todo o banco, sugiro efetuar o backup com um usuário que tenha permissão para a leitura de todos os objetos. Um SUPERUSER
sendo a solução mais simples de se manter, caso você só tenha problemas quando da execução de backups.
Outra alternativa é modificar o comportamento do DATABASE em questão utilizando a opção lo_compat_privileges
. Assim todos os large objects
do banco serão legíveis e alteráveis por todos os usuários. Entretanto, isso significa reduzir a segurança de seus dados, algo que deve ser pesado no momento da decisão por tal alternativa. Para modificar o comportamento do banco, utilize um ALTER DATABASE
com um superusuário:
ALTER DATABASE nome_do_banco SET lo_compat_privileges TO true;
A solução mais indicada para casos de uso com grande variedade de usuários criadores de large objects, conforme esta resposta no DBA SE, talvez seja definir um ROLE em que todos eles estejam incluídos e, quando da criação de um large object, definir explicitamente o ROLE utilizado pela transação para que ele seja o dono efetivo dos objetos que cria. Dessa forma, todos os usuários pertencentes a esse ROLE poderão manipular tais large objects. Para definir qual ROLE será utilizado, logo antes de criar o large object utilize o comando:
SET ROLE nome_do_role;
Fonte:
https://pt.stackoverflow.com/questions/312962/erro-ao-tentar-realizar-backup-de-base-de-dados-em-postgresql/313196#313196
Donate to Site
Renato
Developer