如何創建 PostgreSQL 數據庫的空白版本
我一直在使用
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;