Postgresql
pg_dumpall 的 PostgreSQL 只讀使用者
我正在執行一個由多個相關應用程序使用的 PostgreSQL 實例,每個應用程序都有自己的數據庫。對於備份,我想在實例中創建完整數據的快照,並且我打算使用
pg_dumpall
它來執行此操作。備份是從另一台主機完成的,出於安全原因,應使用單獨的 PostgreSQL 使用者。
backup
因此,我試圖創建一個 PostgreSQL 使用者
- 可以讀取實例中的所有數據,包括現有數據庫/表和其他使用者將來可能添加的數據庫/表中的數據
- 不能修改任何東西
到目前為止,我已經管理了以下內容:
-- Revoke default privileges REVOKE ALL ON SCHEMA public FROM PUBLIC; -- Allow user to connect and use database GRANT CONNECT ON DATABASE db TO backup; GRANT USAGE ON SCHEMA public TO backup; -- Grant read privileges for existing tables GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO backup; -- Grant read privileges when new tables are created ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO backup;
這有效,但僅適用於單個固定數據庫。有沒有辦法對所有現有的數據庫和將來可能創建的數據庫執行此操作?
我目前使用的是 PostgreSQL 9.4,除了
public
.
來自普通使用者的備份是一場噩夢。如果您在 Linux 上使用 PostgreSQL,我建議您依靠
sudo
(和/etc/sudoers
文件)來完成此操作,以便給定的特定使用者可以sudo -u postgres pg_dumpall <params>
使用特定參數,這就是他們作為使用者所能做的所有事情postgres
(因此沒有寫入權限到數據庫)。
隨著 Postgres 14 的發布,這變得更加容易,它引入了
pg_read_all_data
角色.您可以通過執行以下命令創建一個有權讀取所有內容的新使用者:
CREATE ROLE backup WITH ROLE pg_read_all_data LOGIN PASSWORD '<password>';
請注意,即使使用
pg_read_all_data
,使用者似乎也被禁止閱讀pg_authid
目錄,對我來說,pg_dumpall
仍然導致錯誤。額外的贈款pg_authid
也沒有奏效。但是,只要您可以忍受從轉儲中省略 Postgres 使用者密碼,您可以將
--no-role-passwords
選項傳遞給pg_dump
它,它會正常工作。