今天来聊聊使用psql客户端免交互执行Greenplum SQL

说明

本文描述问题及解决方法同样适用于 腾讯云 云数据仓库 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密码’

[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:端口:数据库名:用户名:密码

[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 主机名

[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。当然,没有最好的方法,只有最适合的方法。

考虑安全性,可以选择方案一和方案二;考虑灵活性,则可以选择方案三。

正文完