无法使用不同的用户名从 pg_dump 恢复 psql 数据库
Unable to restore psql database from pg_dump with a different username
我需要使用 postgres 用户名 1 从计算机 1 转储一个 postgres 数据库,然后使用 postgres 用户名 2 在计算机 2 上恢复它。我一直 运行ning 进入看起来备份文件想要使用用户名 1 的错误:
当我 运行 在计算机 2 上执行此操作时:
psql dbname < backupname.pgsql
我收到这个错误:
ERROR: role "username1" does not exist
我试过:
// Dumping from computer1:
pg_dump dbname > backupname.sql
pg_dump dbname > backupname.pgsql
pg_dump -U username1 dbname -N topology -T spacial_ref_sys > backupname.pgsql
// Restoring on computer2:
psql dbname < backupname.pgsql
是否需要修改转储或恢复才能通过此操作?
问题出在倾销上。根据 this post 的见解,我能够使用以下方法解决此问题:
// On Computer1
pg_dump dbname -O -x > backupname.sql
// On Computer2
psql dbname < backupname.sql
与 pg_dump
一起使用的选项标志是:
-O <-- No owner
Do not output commands to set ownership of objects to match the original database
-x <-- No privileges
Prevent dumping of access privileges (grant/revoke commands)
有关选项标志的更多信息,请参阅 PostgreSQL docs for pg_dump。
如果您使用的是 pgAdmin,那么您可以删除 DumpOptions #2 with Owner 中的复选框,否则删除特权,例如
--no-privileges
并像
这样的转储查询中的 --no-password
那样删除所有权
/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --no-password --format custom --no-privileges --no-tablespaces --verbose --file "as" "databasename"
。
此外,如果您对 table 有限制,则在创建转储时也禁用触发器。
如果您无法创建数据库的另一个备份,则替代方法是将转储数据库的所有者和角色复制到新数据库。如果你不这样做,那么你会收到一条错误消息
'ACL 不存在'(不确定很久以前面对的情况)
您不需要通过丢弃 owner/privileges 来削弱您的转储。您可以在恢复时执行此操作。
将 pg_restore
与 --no-acl
(可能还有 --no-owner
)选项一起使用:
-x
--no-privileges
--no-acl
Prevent restoration of access privileges (grant/revoke commands).
--no-owner
Do not output commands to set ownership of objects to match the
original database. By default, pg_restore issues ALTER OWNER or SET
SESSION AUTHORIZATION statements to set ownership of created schema
elements. These statements will fail unless the initial connection
to the database is made by a superuser (or the same user that owns
all of the objects in the script). With -O, any user name can be
used for the initial connection, and this user will own all the
created objects.
所以像这样:
pg_restore --no-privileges --no-owner -U postgres --clean ... $Your_sql_backup
我需要使用 postgres 用户名 1 从计算机 1 转储一个 postgres 数据库,然后使用 postgres 用户名 2 在计算机 2 上恢复它。我一直 运行ning 进入看起来备份文件想要使用用户名 1 的错误:
当我 运行 在计算机 2 上执行此操作时:
psql dbname < backupname.pgsql
我收到这个错误:
ERROR: role "username1" does not exist
我试过:
// Dumping from computer1:
pg_dump dbname > backupname.sql
pg_dump dbname > backupname.pgsql
pg_dump -U username1 dbname -N topology -T spacial_ref_sys > backupname.pgsql
// Restoring on computer2:
psql dbname < backupname.pgsql
是否需要修改转储或恢复才能通过此操作?
问题出在倾销上。根据 this post 的见解,我能够使用以下方法解决此问题:
// On Computer1
pg_dump dbname -O -x > backupname.sql
// On Computer2
psql dbname < backupname.sql
与 pg_dump
一起使用的选项标志是:
-O <-- No owner
Do not output commands to set ownership of objects to match the original database
-x <-- No privileges
Prevent dumping of access privileges (grant/revoke commands)
有关选项标志的更多信息,请参阅 PostgreSQL docs for pg_dump。
如果您使用的是 pgAdmin,那么您可以删除 DumpOptions #2 with Owner 中的复选框,否则删除特权,例如
--no-privileges
并像
这样的转储查询中的 --no-password
那样删除所有权
/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --no-password --format custom --no-privileges --no-tablespaces --verbose --file "as" "databasename"
。
此外,如果您对 table 有限制,则在创建转储时也禁用触发器。
如果您无法创建数据库的另一个备份,则替代方法是将转储数据库的所有者和角色复制到新数据库。如果你不这样做,那么你会收到一条错误消息 'ACL 不存在'(不确定很久以前面对的情况)
您不需要通过丢弃 owner/privileges 来削弱您的转储。您可以在恢复时执行此操作。
将 pg_restore
与 --no-acl
(可能还有 --no-owner
)选项一起使用:
-x --no-privileges --no-acl Prevent restoration of access privileges (grant/revoke commands). --no-owner Do not output commands to set ownership of objects to match the original database. By default, pg_restore issues ALTER OWNER or SET SESSION AUTHORIZATION statements to set ownership of created schema elements. These statements will fail unless the initial connection to the database is made by a superuser (or the same user that owns all of the objects in the script). With -O, any user name can be used for the initial connection, and this user will own all the created objects.
所以像这样:
pg_restore --no-privileges --no-owner -U postgres --clean ... $Your_sql_backup