Import postgres database without roles

43,705

Solution 1

The default behavior of the import is that it replaces all roles it does not know with the role you are doing the import with. So depending on what you need the database for, you might just be fine with importing it and with ignoring the error messages.

Quoting from http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

Before restoring an SQL dump, all the users who own objects or were granted permissions on objects in the dumped database must already exist. If they do not, the restore will fail to recreate the objects with the original ownership and/or permissions. (Sometimes this is what you want, but usually it is not.)

Solution 2

The answer that you might be looking for is adding the --no-owner to the pg_restore command. Unlike the accepted answer at the moment, the command should create every object with the current user even if the role in the dump don't exist in the database.

So no element will get skipped by pg_restore but if some elements imported are owned by different users, all of the records will be now owned by only one user as far as I can tell.

Solution 3

With pg_restore you can use the --role=rolename option to force a role name to be used to perform the restore. But the dump must be non plain text format.
For example you can dump with:

pg_dump -F c -Z 9 -f my_file.backup my_database_name

and than you can restore it with:

pg_restore -d my_database_name --role=my_role_name my_file.backup

for more info: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

Solution 4

Yes, you can dump all the "Global" objects from your source DB with pg_dumpall's -g option:

pg_dumpall -g  > globals.sql

Then run globals.sql against your target DB before importing.

Solution 5

I used the following:

pg_dump --no-privileges --no-owner $OLD_DB_URL | psql $NEW_DB_URL

From

https://www.postgresql.org/docs/12/app-pgdump.html

-O

--no-owner

Do not output commands to set ownership of objects to match the original database. By default, pg_dump issues ALTER OWNER or SET SESSION AUTHORIZATION statements to set ownership of created database objects. These statements will fail when the script is run unless it is started by a superuser (or the same user that owns all of the objects in the script). To make a script that can be restored by any user, but will give that user ownership of all the objects, specify -O.

This option is only meaningful for the plain-text format. For the archive formats, you can specify the option when you call pg_restore.

-x

--no-privileges

--no-acl

Prevent dumping of access privileges (grant/revoke commands).

Share:
43,705
Braden
Author by

Braden

0x4532071F6b7E7212d766Ae1b80F0eC5684eAAbA1

Updated on July 09, 2022

Comments

  • Braden
    Braden almost 2 years

    I have a database that was exported with pg_dump, but now when I'm trying to import it again with:

    psql -d databasename < mydump.sql
    

    It fails trying to grant roles to people that don't exist. (error says 'Role "xxx" does not exist')

    Is there a way to import and set all the roles automatically to my user?

  • shanemgrey
    shanemgrey about 8 years
    Since on my first read of this answer, I missed the part that said "you might just be fine" To clarify this answer, the command probably worked when ran. The errors that were displayed did not stop the import of the data. The roles that were in use in the source were not in the destination, and any data associated with them would now be associated with the user running the command.
  • user1388835
    user1388835 almost 4 years
    How to achieve it using psql? That was the question