我写了一个脚本到数据库中的REINDEX索引。这是其中之一:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi


问题是我无法在独立模式下运行此脚本。 psql每次运行时都会提示输入密码。还有两个限制:


我无法在没有密码的数据库上创建用户。
因为REINDEX锁定表,所以我应该在每个sleep <num>之间使用REINDEX

是否有任何自动解决方案?

#1 楼

关于密码提示,您有四个选择:


设置PGPASSWORD环境变量。有关详细信息,请参见手册:http://www.postgresql.org/docs/current/static/libpq-envars.html

使用.pgpass文件存储密码。有关详细信息,请参见手册:http://www.postgresql.org/docs/current/static/libpq-pgpass.html

对该特定用户使用“信任身份验证”:http:// www .postgresql.org / docs / current / static / auth-methods.html#AUTH-TRUST

使用包含所有内容的连接URI:http://www.postgresql.org/docs/current/ static / libpq-connect.html#AEN42532



评论


从PostgreSQL 9.1开始,本地连接也有对等身份验证方法。当前仅适用于Linux,BSD,OS X或Solaris(不适用于Windows)。

–欧文·布兰德斯特
2012年3月11日下午2:00

关于.pgpass选项的注释,您仍然必须在psql命令中指定用户名,数据库和主机名(如果您通常会这样做)

–拉斐尔
17年2月10日在18:41

关于3,您需要编辑方法。其说明在这里:gist.github.com/p1nox/4953113

–FuzzyAmi
19年4月17日在9:33

轻松使用export PGPASSWORD =“ your_pw”转到版本1

–gies0r
19年8月13日在20:34

@ gies0r出于安全考虑,我永远不会导出密码

– Stefan Haberl
1月30日7:43

#2 楼

一个带有PGPASSWORD的简单示例将类似于:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME


希望对您有所帮助。

评论


嗨,Ian_H,谢谢您的评论,我都同意您的观点。接受的答案非常全面,确实解决了我的问题。我之所以回答这个旧帖子,是因为它对我来说仍然不那么直截了当,因为我相信其他人可能会有同样的感觉。

– pdm
17-10-19在20:23

这绝对是接受的答案的一个很好的补充-有益的提醒是,我们不需要永久设置ENV变量。

–kevlarr
19年5月3日在14:39

请注意,这仍然会将您的密码暴露给命令外壳历史记录。

– Stefan Haberl
1月30日7:44

#3 楼

根据您的帐户权限,未指定数据库的示例可能会失败,因为将根据您连接到的数据库检查用户权限。最好也明确指定数据库。

 # this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  
 


#4 楼

在这个线程中非常有用的答案。我只是为ubuntu 18.04添加了此代码:

sudo PGPASSWORD=yourpasswordHere -u postgres psql


这将带您进入postgres,而无需输入密码提示,而无需设置任何环境变量。这不是永久设置。

评论


不要这样做:密码将在ps -ef的输出中可见。

–科林·哈特(Colin't Hart)
19-10-14在13:09

#5 楼

在Windows中,您可以将其设置为系统范围:
SETx PGPASSWORD YourPassword /M 

出于安全考虑,如果您不希望它在系统范围内,则可以在一行中登录:
set PGPASSWORD=YourPassword&& psql -d database -U user