我通过运行pg_dump -s database
来备份我的架构和存储过程。这是有效的,但它似乎显示了我所做的每一个改变(每次我改变了一些内容的ALTER,每次我改变的存储过程的新声明等等)。
我只想要当前架构,以便在出现问题时我可以恢复。这可能吗?
答案 0 :(得分:1)
TL / DR :这不会发生。 pg_dump
生成的输出经过优化,可以加快导入速度。
你确定吗? postgresql根本不存储架构更改的历史记录,因此pg_dump
无法输出它。以下是可能导致混淆的一些原因。首先,pg_dump
通常会将create table
语句分解为多个语句。例如,请考虑此create table
语句:
CREATE TABLE t (
id integer primary key,
q integer not null references q
);
pg_dump
会将其转换为
CREATE TABLE t (
id integer NOT NULL,
q integer NOT NULL
);
ALTER TABLE ONLY t
ADD CONSTRAINT t_pkey PRIMARY KEY (id);
ALTER TABLE ONLY t
ADD CONSTRAINT t_q_fkey FOREIGN KEY (q) REFERENCES q(id);
这相当于原来的。通常pg_dump
按以下顺序为create table创建语句:(1)创建不带约束/索引的表,(2)导入表数据,最后(3)使用{{1创建约束/索引}} / alter table
。它按此顺序执行的原因是因为导入没有索引的表数据并在之后创建索引更快。但这并不意味着postgresql会记住表格更改的完整历史记录。如果您添加其他列并在之后调用create index
,则会在结果pg_dump
中看到该列。现在,如果使用create table
标志,则可能不需要此分解,但-s
不会更改输出语句以创建表的方式。它只是从上面跳过步骤(2)并执行步骤(1)& (3)。
最后,这是另一个可能引起混淆的问题。通过提供具有不同类型的参数或不同数量的参数的多个定义,可以重载postgresql中的函数。所以,如果你这样做
pg_dump
然后再做
CREATE OR REPLACE FUNCTION foo(x int) ...
然后第二个语句不会删除在第一个语句中创建的函数,因为这两个函数被视为不同的函数。所以CREATE OR REPLACE FUNCTION foo(x text, y boolean) ...
会输出它们。同样,这并不意味着postgresql会记住您的旧删除功能。