我要做的就是备份我现有的数据库集群,以便从 Postgresql 9.4.8 升级到 9.5。我在 Ubuntu 16.04 上。
我知道这个帖子:Postgres 密码验证失败。事实上,上次我遇到这个问题时,它就已经被收藏了。我并不声称自己有任何有意义的 postgres 知识。我并不总是明白什么是 psql 命令,什么是 bash 命令,而且我看过的博客和其他东西并不总是能让我明白这一点。PG 只是我的 Django 项目的后端。我当然不明白我怎么会再次遇到这个问题。
我的 Ubuntu 用户是 malikarumi。我有两个 postgres 用户,maikarumi 和 postgres。Postgres 是超级用户。我前段时间也尝试过让 malikarumi 成为超级用户,但显然失败了,我不知道为什么。
这是我今天的第一次尝试:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup
pg_dumpall: query failed: ERROR: permission denied for relation pg_authid
pg_dumpall: query was: SELECT oid, rolname, rolsuper, rolinherit,rolcreaterole, rolcreatedb, rolcanlogin, rolconnlimit, rolpassword, rolvaliduntil, rolreplication, pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, rolname = current_user AS is_current_user FROM pg_authid ORDER BY 2
接下来是:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
Password:
请注意,那里没有任何内容,没有任何帮助,也没有任何迹象表明哪里出了问题或者该如何处理。
Password:
Password:
pg_dump: [archiver (db)] connection to database "esselldb" failed: FATAL: password authentication failed for user "postgres"
pg_dumpall: pg_dump failed on database "esselldb", exiting
然后我再次尝试使用空白密码和分号
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres;
Password:
pg_dumpall: could not connect to database "template1": fe_sendauth: no password supplied
注意密码适用于 psql
malikarumi@Tetuoan2:~$ psql -U postgres
Password for user postgres: Note the password works with psql
psql (9.4.8)
Type "help" for help.
但无论有没有分号,该命令都不会
postgres=# pg_dumpall > 9-4-backup
postgres-# pg_dumpall > 9-4-backup;
ERROR: syntax error at or near "pg_dumpall"
LINE 1: pg_dumpall > 9-4-backup
这有效
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ sudo cat pg_hba.conf
[sudo] password for malikarumi:
显然,这是 unix 用户,而不是数据库用户。但它是且始终是同一个密码。
我改变了这个
# Database administrative login by Unix domain socket
local all postgres md5
正如之前的帖子所建议的那样,(再次 - 它怎么能变回来呢?!)
但我无法重新启动 postgres
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ pg_ctl stop
pg_ctl: command not found
malikarumi@Tetuoan2:/etc/postgresql/9.4/main$ cd ~
malikarumi@Tetuoan2:~$ pg_ctl stop
pg_ctl: command not found
它也不能从 psql 中工作
postgres=# pg_ctl stop
postgres-# pg_ctl stop;
ERROR: syntax error at or near "pg_ctl"
LINE 1: pg_ctl stop
^
postgres=#
但至少 psql 仍然允许我进入...
所以我重启了整个机器并再次尝试。你知道发生了什么
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
pg_dumpall: could not connect to database "template1": FATAL: Peer authentication failed for user "postgres"
所以我确实成功更改了它,但我仍然无法让它工作。注意:它没有要求我输入密码!
然后我尝试了这个
malikarumi@Tetuoan2:~$ su postgres
Password: the right one
su: Authentication failure
malikarumi@Tetuoan2:~$ su postgres
Password: a blank one
su: Authentication failure
现在你已经了解了最新情况。顺便说一句,我多次查看过 Postgres 官方文档,发现它们内容繁杂,难以理解。如果你还知道适合像我这样的非数据库人员的良好基础教程,那将会很有帮助。谢谢。
答案1
根据上下文,所有提到的失败都是有可能发生,除了一个:
malikarumi@Tetuoan2:~$ pg_dumpall > 9-4-backup -U postgres
Password:
这里您报告了失败,但是在下面的其他情况下:
malikarumi@Tetuoan2:~$ psql -U postgres
Password for user postgres: Note the password works with psql
您报告成功。
但这说不通。同样的密码pg_dumpall
在你提到的确切上下文中也一定同样有效,即:
- 身份验证模式设置为
md5
(pg_hba.conf
在您在帖子的其余部分中更改它之前)。 - 通过选项,目标数据库用户是postgres
-U postgres
。 - 该命令由您自己的 unix 用户调用 shell
malikarumi
。
在您成功将身份验证方案更改为peer
(问题的最后一部分)之后,问题在于您尝试su
使用sudo
,而后者是 Ubuntu 上推荐的方法。
在 shell 提示符下使用此命令:
malikarumi@Tetuoan2:~$ sudo -u postgres pg_dumpall >9-4-backup
它将要求输入密码,并显示类似以下内容:
[sudo] password for malikarumi:
请注意,它期望你的密码,与您以该名称打开会话时使用的相同malikarumi
,而不是 postgres 的密码或数据库密码。
sudo -u postgres somepostgrescommand
只是sudo someadmincommand
如果您是此 Ubuntu 工作站的管理员则可以执行的操作的一种变体。