Postgresql: ¿copia de seguridad de la base de datos y restauración en otro propietario?

83

Hice una copia de seguridad en la base de datos en un servidor diferente y ese tiene un rol diferente al que necesito, con este comando:

pg_dump -Fc db_name -f db_name.dump

Luego copié la copia de seguridad en otro servidor donde necesito restaurar la base de datos, pero no existe tal propietario que se utilizó para esa base de datos. Digamos que la base de datos tiene propietario owner1, pero en un servidor diferente solo tengo owner2y necesito restaurar esa base de datos y cambiar de propietario.

Lo que hice en otro servidor al restaurar:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

Pero cuando se ejecuta la restauración, obtengo estos errores:

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

¿Cómo puedo especificarlo para que cambie de propietario? ¿O es imposible?

Andrius
fuente
1
Además de --no-ownerlo sugerido en la respuesta aceptada, es posible que también necesite --no-privileges. Ver esta respuesta
mivk

Respuestas:

130

Debe usar la --no-owneropción, esto deja de pg_restoreintentar establecer la propiedad de los objetos en el propietario original. En cambio, los objetos serán propiedad del usuario especificado por--role

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore doc

Gary
fuente
14
pg_dump --no-ownertambién debería hacerlo
Nick Barnes
10
Mi preferencia es posponer este tipo de decisiones hasta la restauración. Si lo hace en la etapa de volcado, significa que no puede cambiar de opinión sin exportar. Hacerlo en la restauración significa que las opciones quedan abiertas en caso de que decida que realmente debería haber creado esa función que falta, etc.
Gary
1
Entonces, si quiero cambiar de propietario, ¿debo hacer una copia de seguridad sin propietario? Porque pensé que podría cambiar de dueño al restaurar. Pero incluso estableciendo --roleun propietario diferente, todavía estaba tratando de usar el propietario original (pero luego no lo usé --no-owner.
Andrius
2
@Andrius: No necesitas cambiar tu copia de seguridad, la respuesta de Gary debería resolver tu problema
Nick Barnes
5
Al revisar todas las publicaciones sobre este tema, también parecen pasar por alto el hecho de que este enfoque requiere que el nuevo propietario de la función sea un superusuario, al menos durante la restauración. Entonces todo funciona
chrismarx