Postgres恢复丢失的特权

时间:2019-10-16 06:59:47

标签: postgresql pgadmin pg-dump pg-restore

我正在通过一些非常基本的测试来确认备份/还原过程在本地环境中正常工作。

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

2 个答案:

答案 0 :(得分:1)

角色和权限是按群集而不是按数据库存储和管理的,这就是为什么pg_dump不转储它们的原因。如果很高兴对整个群集进行转储,则应使用pg_dumpall

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

答案 1 :(得分:0)

不幸的是,pg_dump中没有 包含数据库的特权。为此,您必须使用pg_dumpall,但这会转储所有数据库。

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