我正在运行一些非常基本的测试,以确认备份/恢复过程正在本地环境中运行。
我遇到的问题是 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 背景。
角色和权限是按集群而不是按数据库存储和管理的,这就是 pg_dump 不转储它们的原因。如果您愿意转储整个集群,则应该使用
pg_dumpall
。
或者,您可以使用
pg_dumpall -r
仅转储角色,然后使用 pg_dump
您的数据库,并应用这两个脚本。
不幸的是,数据库的权限不包含在
pg_dump
中。为此,您必须使用pg_dumpall
,但这会转储所有数据库。
我知道这很烦人。这是一个长期存在的错误,目前还没有人修复。
答案很晚,但希望对某人有所帮助。从 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 语句。