我運行pg_dump -s database
備份我的架構和存儲過程。這工作,但它似乎表明我的每次改變(一個ALTER爲每次我改變的東西時,存儲過程的每個新的聲明,我已經改變了一段時間,等)獲取我的架構的乾淨的備份和PostgreSQL
我想只是當前的模式,以便我可以在出現問題時恢復原有的模式。這可能嗎?
我運行pg_dump -s database
備份我的架構和存儲過程。這工作,但它似乎表明我的每次改變(一個ALTER爲每次我改變的東西時,存儲過程的每個新的聲明,我已經改變了一段時間,等)獲取我的架構的乾淨的備份和PostgreSQL
我想只是當前的模式,以便我可以在出現問題時恢復原有的模式。這可能嗎?
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
創建語句創建表,在該順序:(1)創建表,而不約束/索引,(2)導入的表數據,和最後(3)用alter table
/create index
創建約束/索引。之所以按順序執行,是因爲導入沒有索引的表數據並在之後創建索引的速度更快。但是,這並不意味着postgresql會記住對錶的更改的完整歷史記錄。如果添加另一列並在事後致電pg_dump
,您將在結果create table
中看到該列。現在,如果使用-s
標誌,則可能不需要此分解,但pg_dump
不會更改它輸出用於創建表的語句的方式。它簡單地從上面跳過步驟(2)並且執行步驟(1)&(3)。
最後,就是可能會引起混淆的另一個問題。通過提供具有不同類型的參數或不同數量的參數的多個定義,可以重載postgresql中的函數。所以,如果你
CREATE OR REPLACE FUNCTION foo(x int) ...
再後來就你這樣做
CREATE OR REPLACE FUNCTION foo(x text, y boolean) ...
然後因爲這兩個功能不同的功能處理第二份聲明將不刪除第一個創建的函數。所以pg_dump
會輸出它們兩個。同樣,這並不意味着postgresql會記住你的舊刪除函數。