Postgres 恢复丢失的权限

问题描述 投票:0回答:3

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

我遇到的问题是 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 背景。

postgresql pgadmin pg-dump pg-restore
3个回答
5
投票

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

pg_dumpall

或者,您可以使用

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


2
投票

不幸的是,数据库的权限包含在

pg_dump
中。为此,您必须使用
pg_dumpall
,但这会转储所有数据库。

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


0
投票

答案很晚,但希望对某人有所帮助。从 PostgreSQL 版本 11 开始,当您使用

pg_dump
标志执行
--create
时, 它还转储数据库的
GRANT/REVOKE
权限。

pg_dumpall --globals-only
仅导出在集群级别声明的角色和表空间相关属性,如@ADEpt所述。

参见 使 pg_dump 转储数据库的属性,而不仅仅是其内容 (Haribabu Kommi)

以前,数据库本身的属性,例如数据库级 GRANT/REVOKE 权限和 ALTER DATABASE SET 变量设置,仅由

pg_dumpall
转储。现在,除了数据库中的对象之外,
pg_dump --create
pg_restore --create
还将恢复这些数据库属性。
pg_dumpall -g
现在仅转储角色和表空间相关的属性。 pg_dumpall 的完整输出(不带 -g)保持不变。

因此,通过将

--create
标志添加到
pg_dump
,备份脚本将包含数据库的所有相关
GRANT ALL
或特定授予 SQL 语句。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.