Postgresql

如何創建 PostgreSQL 數據庫的空白版本

  • November 22, 2013

我一直在使用pgAdmin創建數據庫並對其進行測試。

我現在需要在不同的伺服器上安裝這個數據庫。我一直在pg_dump這樣做,而且我已經能夠糊里糊塗地度過難關了。

但我想知道是否有辦法以我設置的任何順序“重置”所有“目前”值?

如果您對如何創建“空”或“空白”數據庫有任何其他一般性建議,可以告訴我嗎?

如何創建“空”或“空白”數據庫

我將使用pg_dump--schema-only選項為空數據庫創建轉儲:

pg_dump mydb -s > /mypath/myfile.sql

使用 Linux,您還可以將輸出通過管道傳輸到psql同一(或任何其他)數據庫集群並立即在同一(或任何其他)數據庫集群中創建一個新的空數據庫。同一集群的範例:

createdb mytemplate; pg_dump mydb -s | psql mytemplate

如果您應該在不同的數據庫集群中創建數據庫,請記住角色或表空間是集群範圍的對象,不包含在單個數據庫的轉儲中。因此,任何自定義角色(或其他集群範圍的對象)都必須存在於新集群中,然後才能恢復到它。

這比截斷現有表要快得多*。*

一種以任何順序“重置”所有“目前”值的方法

有一個專門的命令

ALTER SEQUENCE RESTART;

除非另有定義,否則這會將序列重置為1。要另外定義,請使用:

ALTER SEQUENCE RESTART WITH 123;

或者使用序列保存所需的起始值:

ALTER SEQUENCE my_seq START WITH 123;

並使用簡單的形式來RESTART.

要重新啟動數據庫中的所有序列,請從目錄表中pg_class檢索它們:

DO
$do$
BEGIN

EXECUTE (
  SELECT string_agg('ALTER SEQUENCE ' || oid::regclass || ' RESTART;', E'\n')
  FROM   pg_class
  WHERE  relkind = 'S'  -- 'S' for sequences
  );

END
$do$

需要足夠的權限。超級使用者自動通過此測試。

**小心點!**您通常不希望失去數據庫中所有序列的目前值。在任何情況下,您都可能想SELECT在執行之前檢查一下它做了什麼。

所以,我會創建一個空副本,然後執行上面的DO命令。然後pg_dump再次恢復到不同的伺服器。

您可以使用TRUNCATE命令清空表。使用 CASCADE 修飾符強制相關記錄在外鍵關係上級聯。

TRUNCATE TABLE my_table CASCADE;

然後您可以使用ALTER SEQUENCE命令重新啟動您的序列。

ALTER SEQUENCE my_sequence RESTART WITH 1;

然後,您可以使用新清理的數據庫設置模板數據庫,從那時起,當您創建數據庫時,您可以將其用作模板。

CREATE DATABASE my_database TEMPLATE my_template_database;

引用自:https://dba.stackexchange.com/questions/53743