如何转储所有者没有密码的 PostgreSQL 数据库?

its*_*_me 4 postgresql ubuntu postgresql-9.1

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

服务器已禁用根访问。因此,我以(比如说)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(其所有者是santa)进行SQL 转储pg_dump

这应该有效,但不是:

john@host:~$ pg_dump myapp_db -U santa -h localhost --no-owner -W > myapp_db_backup.sql
Password: 
Run Code Online (Sandbox Code Playgroud)

当我运行上述命令时,如您所见,它要求我输入“密码”。我应该在这里输入什么密码?创建数据库时我没有输入任何密码,数据库所有者也没有密码santa

因此,我尝试输入johnsudo 用户的密码,但出现此错误:

“致命:用户“圣诞老人”的密码验证失败”


我也试过(也没有用):

john@host:~$ su - santa
santa@host:~$ pg_dump myapp_db -U santa -h localhost --no-owner -W > myapp_db_backup.sql
Password:
Run Code Online (Sandbox Code Playgroud)

这一次,我为用户创建了一个密码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)
Run Code Online (Sandbox Code Playgroud)

的输出\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 | {}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ité 5

请参阅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. 
Run Code Online (Sandbox Code Playgroud)

根本不要用-W。在你的情况下,这只是令人困惑。

此外,您需要知道服务器是否要求输入密码的事实并非由该密码的存在所驱动。

它是由pg_hba.conf你需要研究的服务器端文件驱动的,可能会根据你的需要进行修改(修改后不要忘记重新加载服务器)。

编辑:查看您的 pg_hba.conf。相关线路是:

# 类型数据库用户地址方法
本地所有 postgres 同行
本地所有所有对等点
托管所有所有 127.0.0.1/32 md5
主持所有所有:: 1/128 md5

第一行涉及postgres用户。它与您的 pg_dump 命令无关,因为您使用的是santa用户-U santa

第二行涉及通过 Unix 域套接字的任何其他连接(类型列是local)。从客户端,这意味着当您不使用-h localhost. 它说,如果操作系统用户与 db 用户同名,则他不需要密码。

第 3 行表示如果-h localhost使用(IPv4 TCP 连接),将始终向客户端询问密码。第 4 行与 IPv6 相同。

基于此,santa操作系统用户运行的此命令不应询问或需要密码:

 pg_dump --no-owner myapp_db > myapp_db_backup.sql
Run Code Online (Sandbox Code Playgroud)

-U santa 是可选的,因为默认情况下将 db 用户名作为操作系统用户。