【问题标题】:Postgres restore missing privilegesPostgres 恢复缺失的权限
【发布时间】:2019-10-16 06:59:47
【问题描述】:

我正在运行一些非常基本的测试,以确认备份/恢复过程在本地环境中运行。

我遇到的问题是它看起来不像 pg_dump/pg_restore/psql 正在将数据库恢复到相同的状态。

下面是我从头到尾所做的示例。

CREATE DATABASE testdb WITH ENCODING='UTF8' CONNECTION LIMIT=-1;
CREATE TABLE a
(
    a INT
);

INSERT INTO a(a)
SELECT 1 UNION ALL
SELECT 2;

SELECT * FROM a;

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;

然后运行 ​​pg_dump

pg_dump -Fc -v --host=localhost --username=postgres --dbname=testdb -f C:\test\testdb.dump

为此示例创建并行还原

CREATE DATABASE testdb_restore WITH ENCODING='UTF8' CONNECTION LIMIT=-1;
pg_restore -v --host=localhost --username=postgres --dbname=testdb_restore C:\test\testdb.dump

现在,当我在 pgadmin 中右键单击 testdb 并单击“创建脚本”时,我得到以下信息

-- Database: testdb

-- DROP DATABASE testdb;

CREATE DATABASE testdb
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'English_Australia.1252'
    LC_CTYPE = 'English_Australia.1252'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1;

GRANT ALL ON DATABASE testdb TO postgres;

GRANT TEMPORARY, CONNECT ON DATABASE testdb TO PUBLIC;

GRANT ALL ON DATABASE testdb TO testuser;

当我在 testdb_restore 上单击执行相同的操作时,我得到以下信息

-- Database: testdb_restore

-- DROP DATABASE testdb_restore;

CREATE DATABASE testdb_restore
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    LC_COLLATE = 'English_Australia.1252'
    LC_CTYPE = 'English_Australia.1252'
    TABLESPACE = pg_default
    CONNECTION LIMIT = -1;

如您所见,我缺少原始数据库的额外权限。

我确信这是一件非常简单的事情,但我目前迷失在这件事情上。我也尝试过使用方法,还添加了pg_dump创建数据库选项,没有区别。

请注意:我对 postgres 非常陌生,并且来自 SQL Server 背景。

【问题讨论】:

  • 完全不相关,但INSERT INTO a(a) SELECT 1 UNION ALL SELECT 2;可以简化为INSERT INTO a(a) values (1),(2);

标签: postgresql pgadmin pg-dump pg-restore


【解决方案1】:

角色和权限是按集群而不是按数据库存储和管理的,这就是 pg_dump 不转储它们的原因。如果您愿意转储整个集群,您应该使用pg_dumpall

或者,您可以使用 pg_dumpall -r 仅转储角色,然后使用 pg_dump 您的数据库,并应用这两个脚本。

【讨论】:

    【解决方案2】:

    很遗憾,数据库的权限包含在pg_dump 中。您必须为此使用pg_dumpall,但这会转储所有数据库。

    我知道这很烦人。这是一个长期存在的错误,还没有人修复。

    【讨论】:

    • pg_restore --create ...都不行?
    • 我最近没有测试过,但我认为即使是-C
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2020-10-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2019-06-09
    • 2019-10-24
    相关资源
    最近更新 更多