如何更改PostgreSQL用户的密码?
当前回答
大多数答案基本正确,但你需要注意一些小问题。我遇到的问题是我从未设置过“postgres”的密码,因此我无法登录到允许我更改密码的SQL命令行。以下是我成功使用的步骤(注意,大多数或所有命令都需要sudo或root用户):
编辑要连接的DB集群的数据目录中的pg_hba.conf文件。通过检查systemd命令行可以找到数据目录的文件夹,这很容易通过systemctl状态获得postgresql@VERSION-DB_CLUSTER.用psql版本替换VERSION,用数据库集群的名称替换DB_CLUSTER。如果它是自动创建的。,postgresql@13-main.或者,我的Bash shell在输入postgresql@后提供了自动完成,因此您可以尝试这样做,或者在所有服务列表(systemctl-a)中查找postgresql服务。获得状态输出后,查找CGroup之后的第二个命令行,该命令行应该相当长,并从/usr/lib/postgresql/13/bin/postgres或类似命令行开始(取决于版本、发行版和安装方法)。您正在查找-D之后的目录,例如/var/lib/postgresql/13/main。添加以下行:host all 127.0.0.1/32 trust。这允许所有数据库上的所有用户无条件地通过本地计算机上的IPv4连接到数据库,而无需要求密码。这是一个临时修复,稍后不要忘记再次删除这一行。为了确保安全,我注释了主机all all 127.0.0.1/32 md5(md5可能被scra-sha-256替换),这对相同的登录数据有效,只需要输入密码。重新启动数据库服务:systemctl Restartpostgresql@...再次,使用之前找到的服务。检查服务是否以systemctl状态正确启动postgresql@....与psql连接,非常重要的是,强制psql不要请求密码。根据我的经验,即使服务器不在乎,它也会要求您输入密码,如果您的密码错误,它仍然会拒绝您的登录。这可以通过-w标志完成。完整的命令行如下所示:sudo-u postgres psql-w-h 127.0.0.1-p 5432。这里,postgres是您的用户,您可能已经更改了它。5432是特定于群集的服务器的端口,如果您运行多个群集(例如,我有5434),则端口可能更高。使用\password特殊命令更改密码。记住删除密码忽略解决方法并重新启动服务器以应用配置。
其他回答
大多数答案基本正确,但你需要注意一些小问题。我遇到的问题是我从未设置过“postgres”的密码,因此我无法登录到允许我更改密码的SQL命令行。以下是我成功使用的步骤(注意,大多数或所有命令都需要sudo或root用户):
编辑要连接的DB集群的数据目录中的pg_hba.conf文件。通过检查systemd命令行可以找到数据目录的文件夹,这很容易通过systemctl状态获得postgresql@VERSION-DB_CLUSTER.用psql版本替换VERSION,用数据库集群的名称替换DB_CLUSTER。如果它是自动创建的。,postgresql@13-main.或者,我的Bash shell在输入postgresql@后提供了自动完成,因此您可以尝试这样做,或者在所有服务列表(systemctl-a)中查找postgresql服务。获得状态输出后,查找CGroup之后的第二个命令行,该命令行应该相当长,并从/usr/lib/postgresql/13/bin/postgres或类似命令行开始(取决于版本、发行版和安装方法)。您正在查找-D之后的目录,例如/var/lib/postgresql/13/main。添加以下行:host all 127.0.0.1/32 trust。这允许所有数据库上的所有用户无条件地通过本地计算机上的IPv4连接到数据库,而无需要求密码。这是一个临时修复,稍后不要忘记再次删除这一行。为了确保安全,我注释了主机all all 127.0.0.1/32 md5(md5可能被scra-sha-256替换),这对相同的登录数据有效,只需要输入密码。重新启动数据库服务:systemctl Restartpostgresql@...再次,使用之前找到的服务。检查服务是否以systemctl状态正确启动postgresql@....与psql连接,非常重要的是,强制psql不要请求密码。根据我的经验,即使服务器不在乎,它也会要求您输入密码,如果您的密码错误,它仍然会拒绝您的登录。这可以通过-w标志完成。完整的命令行如下所示:sudo-u postgres psql-w-h 127.0.0.1-p 5432。这里,postgres是您的用户,您可能已经更改了它。5432是特定于群集的服务器的端口,如果您运行多个群集(例如,我有5434),则端口可能更高。使用\password特殊命令更改密码。记住删除密码忽略解决方法并重新启动服务器以应用配置。
您可以并且应该对用户的密码进行加密:
ALTER USER username WITH ENCRYPTED PASSWORD 'password';
要更改PostgreSQL用户的密码,请执行以下步骤:
登录psql控制台:sudo-u postgres psql然后在psql控制台中,更改密码并退出:postgres=#\密码postgres输入新密码:<新密码>postgres=#\q
或者使用查询:
ALTER USER postgres PASSWORD '<new-password>';
或在一行中
sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<new-password>';"
注:
如果这不起作用,请通过编辑/etc/postgresql/9.1/main/pg_hba.conf重新配置身份验证(路径将不同)并更改:
local all all peer # change this to md5
to
local all all md5 # like this
然后重新启动服务器:
sudo service postgresql restart
检查文件pg_hba.conf。
如果身份验证方法为“对等”,则客户端的操作系统用户名/密码必须与数据库用户名和密码匹配。在这种情况下,将Linux用户“postgres”和DB用户“post格雷斯”的密码设置为相同。
有关详细信息,请参阅文档:19.1。pg_hba.conf文件
以及Bash和expect的完全自动化方式(在本例中,我们在OS和PostgreSQL运行时级别为新的PostgreSQL管理员提供新设置的PostgreQL密码):
# The $postgres_usr_pw and the other Bash variables MUST be defined
# for reference the manual way of doing things automated with expect bellow
#echo "copy-paste: $postgres_usr_pw"
#sudo -u postgres psql -c "\password"
# The OS password could / should be different
sudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd
expect <<- EOF_EXPECT
set timeout -1
spawn sudo -u postgres psql -c "\\\password"
expect "Enter new password: "
send -- "$postgres_usr_pw\r"
expect "Enter it again: "
send -- "$postgres_usr_pw\r"
expect eof
EOF_EXPECT
cd /tmp/
# At this point the 'postgres' executable uses the new password
sudo -u postgres PGPASSWORD=$postgres_usr_pw psql \
--port $postgres_db_port --host $postgres_db_host -c "
DO \$\$DECLARE r record;
BEGIN
IF NOT EXISTS (
SELECT
FROM pg_catalog.pg_roles
WHERE rolname = '"$postgres_db_useradmin"') THEN
CREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
END IF;
END\$\$;
ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
CREATEDB REPLICATION BYPASSRLS
PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
"
推荐文章
- 按IN值列表排序
- 如何在Postgres 9.4中对JSONB类型的列执行更新操作
- PostgreSQL列名区分大小写吗?
- postgresql COUNT(DISTINCT…)非常慢
- Postgres:检查数组字段是否包含值?
- 如何在postgresql中创建数据库用户?
- 使用PSQL命令查找主机名和端口
- Postgresql列表和排序表的大小
- 选择其他表中没有的行
- 在PostgreSQL中使用UTC当前时间作为默认值
- 优化PostgreSQL进行快速测试
- django test app error -在创建测试数据库时出现错误:创建数据库的权限被拒绝
- Postgres唯一约束与索引
- 使用电子邮件地址为主键?
- 选择postgres中字段的数据类型