Postgresql

如何轉儲所有者沒有密碼的 PostgreSQL 數據庫?

  • August 29, 2013

首先,我的設置的一些背景:

伺服器已禁用 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

因此,我嘗試輸入johnsudo 使用者的密碼,並收到此錯誤:

“致命:使用者“聖誕老人”的密碼驗證失敗”


我也試過(也沒有用):

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 使用者。

引用自:https://dba.stackexchange.com/questions/48923