Database

導出和導入不同名稱的 PostgreSQL 數據庫?

  • October 26, 2021

有沒有辦法導出一個 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不要忘記在生產系統上嘗試之前安裝一個臨時猴子,以防我遺漏了一些重要的細節。

引用自:https://serverfault.com/questions/228170