说明
本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 PostgreSQL(CDWPG)。
背景
Greenplum底层是postgresql,客户端自然也是psql。由于psql本身不支持通过参数来指定密码进行登录,所以需要通过别的方式来实现,这里介绍三种可以实现免交互/免密执行SQL的方法。
实现方案
- Demo SQL文件
[gpadmincloud@mdw-snova-90g4jkrm ~]$ cat demo.sql
TRUNCATE test_timestamp;
INSERT INTO test_timestamp VALUES('test',now());
SELECT * FROM test_timestamp;
方案一:把PGPASSWORD写入环境变量实现免密
export PGPASSWORD='postgres密码'
代码语言:javascript复制[gpadmincloud@mdw-snova-90g4jkrm ~]$ export PGPASSWORD='dy1'
[gpadmincloud@mdw-snova-90g4jkrm ~]$ psql -d dy_test -U dy1 -h 10.0.38.133 -f demo.sql
TRUNCATE TABLE
INSERT 0 1
name | time
------ ----------------------------
test | 2021-03-17 18:55:48.139335
(1 row)
方案二:在家目录下建一个.pgpass实现免密
格式信息:主机名或者IP:端口:数据库名:用户名:密码
代码语言:javascript复制[gpadmincloud@mdw-snova-90g4jkrm ~]$ cat .pgpass
10.0.38.133:5432:dy_test:dy1:dy1
[gpadmincloud@mdw-snova-90g4jkrm ~]$ psql -d dy_test -U dy1 -h 10.0.38.133 -f demo.sql
TRUNCATE TABLE
INSERT 0 1
name | time
------ ----------------------------
test | 2021-03-17 18:59:03.471346
(1 row)
方案三:把PGPASSWORD写在一条命令中执行实现免交互
一条命令执行,将密码信息写在前面,用空格分隔:
PGPASSWORD=密码 psql -d 数据库名 -U 数据库名 -h 主机名
代码语言:javascript复制[gpadmincloud@mdw-snova-90g4jkrm ~]$ PGPASSWORD=dy1 psql -d dy_test -U dy1 -h 10.0.38.133 -f demo.sql
TRUNCATE TABLE
INSERT 0 1
name | time
------ ----------------------------
test | 2021-03-17 19:00:29.765707
(1 row)
小结
可以看到,有很多方法都可以实现免交互/免密来执行psql。当然,没有最好的方法,只有最适合的方法。
考虑安全性,可以选择方案一和方案二;考虑灵活性,则可以选择方案三。