Database
導出和導入不同名稱的 PostgreSQL 數據庫?
有沒有辦法導出一個 PostgreSQL 數據庫,然後用另一個名字導入它?
我將 PostgreSQL 與 Rails 一起使用,我經常從生產環境中導出數據,其中數據庫稱為 blah_production,然後在開發或暫存時使用名稱 blah_development 和 blah_staging 將其導入。在 MySQL 上,這是微不足道的,因為導出在任何地方都沒有數據庫(可能除了註釋),但在 PostgreSQL 上似乎是不可能的。這是不可能的嗎?
我目前正在以這種方式轉儲數據庫:
pg_dump blah > blah.dump
我沒有使用 -c 或 -C 選項。該轉儲包含以下語句:
COMMENT ON DATABASE blah IS 'blah'; ALTER TABLE public.checks OWNER TO blah; ALTER TABLE public.users OWNER TO blah;
當我嘗試導入時
psql blah_devel < blah.dump
我明白了
WARNING: database "blah" does not exist ERROR: role "blah" does not exist
也許問題不在於數據庫,而在於角色?
如果我以這種方式傾倒它:
pg_dump --format=c blah > blah.dump
並嘗試以這種方式導入它:
pg_restore -d blah_devel < tmp/blah.psql
我收到這些錯誤:
pg_restore: WARNING: database "blah" does not exist pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist Command was: ALTER TABLE public.checks OWNER TO blah; pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist Command was: ALTER TABLE public.users OWNER TO blah; pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah pg_restore: [archiver (db)] could not execute query: ERROR: role "blah" does not exist Command was: ALTER TABLE public.users_id_seq OWNER TO blah; pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres pg_restore: [archiver (db)] could not execute query: ERROR: role "postgres" does not exist Command was: REVOKE ALL ON SCHEMA public FROM postgres; pg_restore: [archiver (db)] could not execute query: ERROR: role "postgres" does not exist Command was: GRANT ALL ON SCHEMA public TO postgres; WARNING: errors ignored on restore: 11
有任何想法嗎?
我見過一些人使用 sed 腳本來修改轉儲。我想避免這種解決方案,但如果沒有其他選擇,我會接受。有沒有人寫了一個腳本來改變轉儲的數據庫名稱,以確保沒有數據被改變?
解決方案是像這樣傾倒它:
pg_dump --no-owner --no-acl blah > blah.psql
並像這樣導入它:
psql blah_devel < blah.psql > /dev/null
我仍然收到此警告:
WARNING: database "blah" does not exist
但其餘的似乎工作。
如果您正在創建文本轉儲,您可以不帶
CREATE DATABASE
位導出數據庫(即不指定-c
和 -C
選項pg_dump
);這將阻止 Postgres 嘗試刪除、創建和連接到數據庫。如果您使用其中一種存檔格式,則可以指定
-d
選項pg_restore
來命名要還原到的數據庫。檢查手冊頁以獲取更多詳細資訊,
pg_dump
並且pg_restore
不要忘記在生產系統上嘗試之前安裝一個臨時猴子,以防我遺漏了一些重要的細節。