如何轉儲所有者沒有密碼的 PostgreSQL 數據庫?
首先,我的設置的一些背景:
伺服器已禁用 root 訪問。因此,我以(比如說)
john
也屬於該sudo
組的身份登錄,因此能夠執行超級使用者命令。我創建了一個新的無密碼使用者**#1**
santa
(使用命令sudo adduser --shell /bin/bash --gecos 'Santa Claus' --disabled-password santa
)。然後我將登錄會話的所有者更改為
santa
使用命令:sudo su - santa
並創建了一個新的 PostgreSQL 數據庫:(createdb myapp_db
創建數據庫時沒有詢問我的密碼)。現在,給定條件,我如何使用命令對數據庫
myapp_db
(其所有者是)進行 SQL 轉儲?santa``pg_dump
這應該有效,但它不是:
john@host:~$ pg_dump myapp_db -U santa -h localhost --no-owner -W > myapp_db_backup.sql Password:
當我執行上述命令時,它會要求我輸入“密碼”,如您所見。我應該在這裡輸入什麼密碼?創建數據庫時我沒有輸入任何密碼,數據庫所有者也沒有密碼
santa
。因此,我嘗試輸入
john
sudo 使用者的密碼,並收到此錯誤:“致命:使用者“聖誕老人”的密碼驗證失敗”
我也試過(也沒有用):
john@host:~$ su - santa santa@host:~$ pg_dump myapp_db -U santa -h localhost --no-owner -W > myapp_db_backup.sql Password:
這一次,我為使用者創建了一個密碼
santa
並輸入了它。仍然得到錯誤:“致命:使用者“聖誕老人”的密碼驗證失敗”
我在這裡想念什麼?
(如果我遺漏了任何必要的細節,請告訴我。)
更多資訊
(根據評論中的要求。)
john@host:~$ sudo su postgres postgres@host:~$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------------+----------+----------+-------------+-------------+----------------------- app_db | santa | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
輸出
\du santa
:john@host:~$ sudo -u postgres psql postgres=# \du santa List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- santa | Superuser, Create role, Create DB, Replication | {}
請參閱手冊頁的這一部分
pg_dump
:-W, --password Force pg_dump to prompt for a password before connecting to a database. This option is never essential, since pg_dump will automatically prompt for a password if the server demands password authentication.
根本不要使用
-W
。在你的情況下,這只是令人困惑。此外,您需要知道伺服器是否要求輸入密碼這一事實並非由該密碼的存在所驅動。
它由
pg_hba.conf
您需要研究並可能根據需要修改的伺服器端文件驅動(修改後不要忘記重新載入伺服器)。編輯:查看您的 pg_hba.conf。相關線路是:
# 類型數據庫使用者地址方法 本地所有 postgres 同行 本地所有所有對等 託管所有 127.0.0.1/32 md5 託管所有::1/128 md5
第一行涉及
postgres
使用者。這與您的 pg_dump 命令無關,因為您正在使用santa
使用者-U santa
第二行涉及通過 Unix 域套接字的任何其他連接(TYPE 列是
local
)。從客戶端,這意味著當您不使用-h localhost
. 它說如果作業系統使用者與 db 使用者同名,他不需要密碼。第 3 行表示如果
-h localhost
使用(IPv4 TCP 連接),將始終向客戶端詢問密碼。第 4 行與 IPv6 相同。基於此,
santa
作業系統使用者執行的此命令不應詢問或需要密碼:pg_dump --no-owner myapp_db > myapp_db_backup.sql
-U santa
是可選的,因為預設情況下 db 使用者名被視為 OS 使用者。