postgres - 没有角色的 pg_dump 和 pg_restore

And*_*y K 18 postgresql restore postgresql-9.3 pg-dump pg-restore

我正在尝试在没有接收数据库上的适当角色的情况下恢复转储。

如前所述这里也是在这里,你需要有--no-owner作为一个选项,无论是在pg_dumppg_restore或两者兼而有之。

我使用以下命令行来创建我的转储:

"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --no-owner -Ft --dbname=postgresql://avo******:AV0******?@127.0.0.1:5432/BI_DB > K:\BI\backup\sort\bck_%timestamp%.tar
Run Code Online (Sandbox Code Playgroud)

恢复线如下:

"C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host localhost --port 5432 --username "postgres" --dbname "BI_TEST2" --no-password  --no-owner --role=postgres --exit-on-error --verbose "D:\D\avo\backup\bck_04042017_1410.tar"
Run Code Online (Sandbox Code Playgroud)

如您所见,两者都有--no-owner选择,但最终出现以下错误:

在此处输入图片说明

最让我烦恼的是下面的日志:

pg_restore: [programme d'archivage (db)] Erreur pendant le traitement de la TOC (« PROCESSING TOC ») :
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 2633 ; 0 0 ACL adm avo******
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR:  role « avo****** » does not exist
Run Code Online (Sandbox Code Playgroud)

为什么即使--no-owner指定了它也需要一个角色?

我错过了什么?

我在 Postgres 9.3 上运行

小智 16

pg_restore设置 ACL时发生错误:您可以使用--no-acl来阻止GRANT命令。

使用 中的-Ft选项pg_dump,您只能跳过 中的角色和 ACL pg_restore--list如果您需要更多详细信息,您还可以编辑目录。


小智 7

使用 PostgreSQL 12.4:

$ pg_dump --help
...
-O, --no-owner               skip restoration of object ownership in
                             plain-text format
...
-x, --no-privileges          do not dump privileges (grant/revoke)
Run Code Online (Sandbox Code Playgroud)

下面是一个例子:

$ pg_dump -O -x mydb_development | gzip > mydb-2020-09-22.bak.gz
Run Code Online (Sandbox Code Playgroud)


小智 5

以下命令导出数据,而不将其与角色或权限数据混合,以便您可以将其导入到您指定的任何角色。另外,您可以让 pg_dump 将数据压缩到 tar 文件中。

pg_dump --format=t --blobs --verbose --no-privileges --no-owner \
--password --username mydbuser --database mydbname  \
--file "mydbname_dump_$(date +%Y%m%d).tar"
Run Code Online (Sandbox Code Playgroud)

或者一个更短的来做同样的事情

pg_dump -F t -bvxOW -U myuser -d mydbname  -f "mydbname_dump_$(date +%Y%m%d).tar"
Run Code Online (Sandbox Code Playgroud)

要恢复,您将使用几乎相同的标志,并提及您希望所有权属于哪个角色。

pg_restore -vxOW --role=myuser2 -U myadminuser -d mydbname "mydbname_dump_$(date +%Y%m%d).tar"
Run Code Online (Sandbox Code Playgroud)

以下是所有这些标志的含义以及其他选项的含义,例如压缩级别或输出格式。您可以通过执行pg_dump --help以下操作找到更多信息pg_restore --help

General options:
  -f, --file=FILENAME          output file or directory name
  -F, --format=c|d|t|p         output file format (custom, directory, tar,
                               plain text (default))
  -v, --verbose                verbose mode
  -Z, --compress=0-9           compression level for compressed formats

Options controlling the output content:
  -b, --blobs                  include large objects in dump
  -O, --no-owner               skip restoration of object ownership in
                               plain-text format
  -x, --no-privileges          do not dump privileges (grant/revoke)

Connection options:
  -d, --dbname=DBNAME      database to dump
  -h, --host=HOSTNAME      database server host or socket directory
  -p, --port=PORT          database server port number
  -U, --username=NAME      connect as specified database user
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)
  --role=ROLENAME          do SET ROLE before dump
Run Code Online (Sandbox Code Playgroud)