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
。
因此,我尝试输入john
sudo 用户的密码,但出现此错误:
“致命:用户“圣诞老人”的密码验证失败”
我也试过(也没有用):
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)
请参阅pg_dump
联机帮助页的这一部分:
Run Code Online (Sandbox Code Playgroud)-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 域套接字的任何其他连接(类型列是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 用户名作为操作系统用户。
归档时间: |
|
查看次数: |
18698 次 |
最近记录: |