建立数据库会话

用户可以使用兼容PostgreSQL的客户端程序连接到Greenplum数据库,例如 psql。 用户和管理员总是通过master连接到Greenplum数据库,Segment不能接受客户端连接。

为了建立一个到Greenplum数据库Master的连接,您需要了解以下连接信息,并相应地配置客户端程序。

表1.连接参数

连接参数

描述

环境变量

应用名称

连接到数据库的应用名称,保存在application_name连接参数中。默认值是 psql。

$PGAPPNAME

数据库名称

您要连接的数据库名称。对于新初始化的系统,首次连接数据库请使用postgres。

$PGDATABASE

主机名

Greenplum数据库的Master的主机名。默认主机是本地主机。

$PGHOST

端口

Greenplum数据库的Master实例所运行的端口号。默认为5432。

$PGPORT

用户名

所连接的数据库用户(角色)名称。这不需要与您的OS用户名相同。如果不确定数据库用户名是什么,请咨询Greenplum管理员。请注意,每个Greenplum数据库系统都有一个在初始化时自动创建的超级用户帐户。此帐户的名称与初始化Greenplum系统的用户的操作系统名称相同(通常是 gpadmin)。

$PGUSER

使用psql连接提供了用于连接到Greenplum数据库的命令示例。


支持的客户端应用程序

用户可以使用多种客户端应用连接到Greenplum数据库:

  • Greenplum的安装随附了许多Greenplum数据库客户端应用程序。psql 客户端应用程序提供了一个到Greenplum数据库的交互式命令行接口。
  • 使用标准的数据库应用程序接口(例如ODBC和JDBC),用户可以创建自己的客户端应用程序,接口到Greenplum数据库。
  • 大部分使用ODBC和JDBC等标准数据库接口的客户端工具,都可以被配置来连接到 Greenplum数据库。


Greenplum数据库客户端应用程序

Greenplum数据库随附有一些客户端工具应用,它们位于用户的Greenplum数据库Master主机安装的 $GPHOME/bin目录中。以下是最常用的客户端工具应用:

表1.常用的客户端应用

名称

用法

createdb

创建一个新数据库

createlang

定义一种新的过程语言

createuser

定义一个新的数据库角色

dropdb

移除一个数据库

droplang

移除一种过程语言

dropuser

移除一个角色

psql

PostgreSQL交互式终端

reindexdb

对一个数据库重建索引

vacuumdb

对一个数据库进行垃圾收集和分析

注意: createlang 和 droplang不推荐使用,并且可能在将来的版本中删除。它们在Pivotal Greenplum数据库中不再使用,如果您尝试使用它们安装Greenplum过程语言,它们会显示错误。请使用CREATE EXTENSION or DROP EXTENSION来代替它们。

在使用这些客户端应用时,用户必须通过Greenplum的Master实例连接到一个数据库。 您需要知道目标数据库的名称、Master的主机名和端口号,还有用于连接的数据库用户名。 这些信息可以在命令行上分别用选项-d、-h、 -p和-U来提供。如果找到不属于任何一个选项的参数, 它将被首先解释为数据库名。

所有这些选项都有默认值,如果该选项没有被指定就会使用其默认值。默认主机是本地主机。默认 端口号是5432。默认用户名是用户的操作系统用户名,同时也是默认的数据库名。注意,操作系统的用户名和Greenplum数据库用户名并不需要一样。

如果默认值和实际情况不同,用户可以设置环境变量PGDATABASE、 PGHOST、PGPORT和PGUSER为合适的值, 或者使用一个psql~/.pgpass文件来包含常用的口令。

有关Greenplum数据库环境变量的信息,请参阅《 Greenplum数据库参考指南》。有关psql的信息,请参见《 Greenplum数据库实用程序指南》。


用psql连接

根据使用的默认值或您设置的环境变量,以下示例显示了如何通过psql方式访问数据库 :

$ psql -d gpdatabase -h master_host -p 5432 -U gpadmin
$ psql gpdatabase
$ psql postgres

如果尚未创建用户定义的数据库,则可以通过连接到数据库postgres来访问系统。例如:

$ psql postgres

在连接到一个数据库后,psql提供了一个提示符,提示符由psql 当前连接的数据库名后面加上=> (如果用户是数据库超级用户则会是=#) 构成。例如:

gpdatabase=>

在提示符处,您可以键入SQL命令。为发送到服务器并执行,SQL命令必须以 ;(分号)。例如:

=> SELECT * FROM mytable;

有关使用 psql 客户端应用程序以及SQL命令和语法的信息,请参阅《Greenplum参考指南》。


使用PgBouncer连接池

PgBouncer工具可以管理PostgreSQL和Greenplum数据库连接的连接池。

以下主题描述了如何在Greenplum数据库中设置和使用PgBouncer。有关在PostgreSQL上使用PgBouncer的信息,请参考 PgBouncer网站。

  • 概述
  • 迁移PgBouncer
  • 配置PgBouncer
  • 启动PgBouncer
  • 管理PgBouncer

父主题: 访问数据库

概述

数据库连接池是数据库连接的缓存。一旦建立了连接池,连接池就消除了创建新数据库连接的开销,因此客户端的连接速度大大加快,服务器的负载也降低了。

来自PostgreSQL社区的PgBouncer连接池,随附在您的Greenplum数据库安装中。PgBouncer是用于Greenplum和PostgreSQL的轻量级连接池管理器。PgBouncer为每个数据库和用户的组合维护了一个连接池。PgBouncer要么为客户端创建新的数据库连接,要么为相同的用户和数据库重用现有的连接。当客户端断开连接时,PgBouncer将连接返回到池以供重新使用。

PgBouncer有三种池模式来共享连接

  • 会话池 –客户端连接时,只要它保持连接状态,便会为其分配一个连接。当客户端断开连接时,连接将放回池中。
  • 事务池 –在事务期间将连接分配给客户端。当PgBouncer通知事务已完成时,连接将放回池中。此模式只能与不使用依赖于会话的功能的应用程序一起使用。
  • 语句池 –语句池就像事务池一样,但是不允许多语句事务。此模式的目标是为了在客户端上强制执行自动提交模式,且针对PostgreSQL上的PL/Proxy。

可以为PgBouncer设置一种默认的池模式,并且该模式可以被各数据库和用户覆盖。

PgBouncer支持PostgreSQL和Greenplum数据库共享的标准连接接口。Greenplum数据库客户端应用程序(例如psql)连接到运行PgBouncer的主机和端口,而不是Greenplum数据库master的主机和端口。

PgBouncer有一个类psql的管理控制台界面。授权用户可以通过它连接到一个虚拟数据库来监控和管理PgBouncer。您可以通过管理控制台来管理PgBouncer后台进程, 也可以用控制台在运行时更新和重新载入PgBouncer配置,而无需停止和重启PgBouncer进程。

PgBouncer原生支持TLS。

迁移PgBouncer

迁移到新的Greenplum数据库版本时,必须将PgBouncer实例迁移到新版本的Greenplum数据库安装中。

  • 如果要迁移到5.8.x或更早版本的Greenplum数据库,可以在不丢弃连接的情况下迁移PgBouncer。采用带-R的选项和配置文件的命令启动新的PgBouncer 进程:
$ pgbouncer -R -d pgbouncer.ini

-R (重启)选项使新进程通过Unix套接字连接到旧进程的控制台,并发出以下命令:

SUSPEND;
SHOW FDS;
SHUTDOWN;

新进程检测到旧进程已消失时,它将继续使用旧连接进行工作。这是可能的,因为SHOW FDS命令将实际的文件描述符发送到新进程。如果由于任何原因而过渡失败,请杀掉新进程,然后旧进程将恢复。

  • 如果要迁移到Greenplum数据库5.9.0或更高版本,则必须在旧版本安装中关闭PgBouncer实例,然后在新安装中重新配置并启动PgBouncer。
  • 如果您在旧安装中使用stunnel保护的PgBouncer连接,则必须使用PgBouncer 1.8.1和更高版本的内置TLS功能,在新安装中配置SSL/ TLS。
  • 如果在旧安装中使用了LDAP身份验证,则必须使用PgBouncer 1.8.1和更高版本的内置PAM集成功能,在新安装中配置LDAP。您还必须移除或替换auth_file中所有 以ldap://开头的密码串。

配置PgBouncer

您可以通过配置文件配置PgBouncer和它对Greenplum数据库的访问。此配置文件,通常称为pgbouncer.ini, 提供了Greenplum数据库的位置信息。pgbouncer.ini文件也指定PgBouncer的进程、连接池、 授权用户和授权配置。

pgbouncer.ini配置文件示例内容如下:

[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb
 
[pgbouncer]
pool_mode = session
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = md5
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = gpadmin

 有关PgBouncer配置文件格式及其支持的配置属性列表,请参阅pgbouncer.ini参考页。

当客户端连接到PgBouncer时,连接池从pgbouncer.ini配置文件中查找所请求的数据库(可能是实际数据库的别名)对应的主机名、端口号和数据库名。配置文件还定义了对数据库有效的授权模式。

PgBouncer需要一个授权文件,它是一个包含Greenplum数据库用户和密码列表的文本文件。 文件内容与pgbouncer.ini中配置的auth_type 授权类型密切相关。密码可以是明文或MD5编码的字符串。您还可以配置PgBouncer来查询目标数据库,以获取不在授权文件中的用户的密码信息。

PgBouncer身份验证文件格式

PgBouncer要求有其自己的用户授权文件。您可以在pgbouncer.ini配置文件的auth_file属性中定义文件名。auth_file是一个文本文件,其格式如下:

"username1" "password" ...
"username2" "md5abcdef012342345" ...

uth_file为每个用户占用一行。每行必须至少有两个字段,并且两个字段都用双引号引起来(”)。第一个字段标识Greenplum数据库用户名。第二个字段是明文或MD5编码的密码。PgBouncer忽略该行的其余部分。

(auth_file文件格式与Greenplum数据库所用的授权信息文件pg_auth相似。PgBouncer可以直接使用Greenplum数据库授权文件。)

使用MD5编码的密码,其密码格式为:

"md5" + MD5_encoded(<password><username>)

您可以从pg_shadow视图中获取所有Greenplum数据库用户的MD5编码的密码。

为PgBouncer配置基于HBA的身份验证

PgBouncer支持基于HBA的授权。要为PgBouncer配置基于HBA的授权,请在pgbouncer.ini配置文件中设置auth_type=hba,并在pgbouncer.ini文件中配置参数auth_hba_file,它是HBA格式的文件名。

名称为hba_bouncer.conf的PgBouncer HBA文件的内容如下:

local       all     bouncer             trust
host        all     bouncer      127.0.0.1/32       trust

相关pgbouncer.ini配置文件中的对应配置部分:

[databases]
p0 = port=15432 host=127.0.0.1 dbname=p0 user=bouncer pool_size=2
p1 = port=15432 host=127.0.0.1 dbname=p1 user=bouncer
...
 
[pgbouncer]
...
auth_type = hba
auth_file = userlist.txt
auth_hba_file = hba_bouncer.conf
...

有关PgBouncer支持的HBA授权文件格式的信息,请参阅PgBouncer文档中的HBA文件格式讨论。

启动PgBouncer

您可以在Greenplum数据库master主机或其他服务器上运行PgBouncer。如果在单独的服务器上安装PgBouncer,则可以使用PgBouncer管理控制台,通过更新PgBouncer配置文件并重新载入配置,可以轻松地将客户端连接切换到备用master。

请按照以下步骤设置PgBouncer。

  1. 创建一个PgBouncer配置文件。例如,将以下文本添加到文件pgbouncer.ini中:
[databases]
postgres = host=127.0.0.1 port=5432 dbname=postgres
pgb_mydb = host=127.0.0.1 port=5432 dbname=mydb
 
[pgbouncer]
pool_mode = session
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = md5
auth_file = users.txt
logfile = pgbouncer.log
pidfile = pgbouncer.pid
admin_users = gpadmin

该文件列出了数据库及其连接的详细信息。该文件还配置了PgBouncer实例。有关PgBouncer配置文件的格式和内容的信息,请参考pgbouncer.ini参考页面。

  1. 创建一个授权文件。文件名应该和pgbouncer.ini文件中定义的auth_file 参数名字一样,users.txt。每行包含一个用户名和密码。密码的格式应该匹配PgBouncer 配置文件中定义的auth_type。如果auth_type参数是plain,密码字符串是明文密码,例如:
"gpadmin" "gpadmin1234"

如果auth_type是md5,授权字段必须是MD5编码。MD5编码的密码格式为:

"md5" + MD5_encoded(<password><username>)
  1. 开始启动 gbouncer:
$ $GPHOME/bin/pgbouncer -d pgbouncer.ini

-d选项将PgBouncer作为后台(守护程序)进程运行。有关pgbouncer的命令语法和选项,请参阅pgbouncer参考页。

  1. 更新您的客户端应用程序连接到 pgbouncer,以代替直接连接到Greenplum数据库服务器。例如, 连接到上面配置的Greenplum数据库mydb,运行psql 如下:
$ psql -p 6543 -U someuser pgb_mydb

-p选项的值代表您配置的PgBouncer实例的listen_port。

管理PgBouncer

PgBouncer提供一个类psql的管理控制台,可以通过指定PgBouncer端口号和名为pgbouncer的虚拟数据库,来登录到PgBouncer管理控制台。控制台接受类SQL的命令,这些命令可用于监控、重新配置和管理PgBouncer。

有关PgBouncer管理控制台命令的完整文档,请参阅PgBouncer管理控制台命令参考。

请按照以下步骤,开始使用PgBouncer管理控制台。

  1. 用 psql 登录到 pgbouncer 虚拟数据库:
$ psql -p 6543 -U username pgbouncer

username必须是pgbouncer.ini配置文件中admin_users参数中所列出的值。如果pgbouncer进程运行在用户登录的当前Unix用户的UID下,您还可以用该用户名登录。

  1. 要查看可用的PgBouncer管理控制台命令,请运行 SHOW help 命令:
pgbouncer=# SHOW help;
NOTICE:  Console usage
DETAIL:
    SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
    SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
    SHOW DNS_HOSTS|DNS_ZONES
    SHOW STATS|STATS_TOTALS|STATS_AVERAGES
    SET key = arg
    RELOAD
    PAUSE [<db>]
    RESUME [<db>]
    DISABLE <db>
    ENABLE <db>
    KILL <db>
    SUSPEND
    SHUTDOWN
  1. 如果您对PgBouncer配置文件pgbouncer.ini做了修改, 可以用RELOAD命令重载它:
pgbouncer=# RELOAD;

将PgBouncer客户端映射到Greenplum数据库服务器连接

要将PgBouncer客户端映射到Greenplum数据库服务器连接,请使用PgBouncer管理控制台命令SHOW CLIENTS和SHOW SERVERS:

  1. 用 ptr 和 link 将本地客户端连接映射到服务器连接。
  2. 使用客户端连接的 addr 和 port,标识来自客户端的TCP连接。
  3. 用 local_addr 和 local_port 标识到服务器的TCP连接。

数据库应用程序接口

您可能想要开发自己的客户端应用程序,来与Greenplum数据库交互。PostgreSQL为最常用的数据库应用编程接口(API)提供了若干数据库驱动,这些驱动也能与Greenplum 数据库一起使用。这些驱动可单独下载。每个驱动(PostgreSQL随附的libpq除外)都是一个独立的PostgreSQL开发项目且必须下载、安装和配置,来连接到Greenplum数据库。可用的驱动如下:

表1. Greenplum数据库接口

API

PostgreSQL驱动

下载链接

ODBC

Greenplum DataDirect ODBC驱动程序

https://network.pivotal.io/products/pivotal-gpdb

JDBC

Greenplum DataDirect JDBC驱动程序

https://network.pivotal.io/products/pivotal-gpdb

Perl DBI

pgperl

https://metacpan.org/release/DBD-Pg

Python DBI

pygresql

http://www.pygresql.org/

libpq C库

libpq

https://www.postgresql.org/docs/9.4/libpq.html

使用API访问Greenplum数据库的一般步骤是:

  1. 从合适来源下载您的编程语言平台和相应的API。例如,您可以从Oracle获得Java开发工具包(JDK)和JDBC API。
  2. 根据API规范编写您的客户端应用程序。对应用程序进行编程时,请注意Greenplum数据库中的SQL支持,不要包括任何不受支持的SQL语法。 更多信息,请参见《Greenplum数据库参考指南》。

下载适当的驱动并配置与Greenplum数据库Master的连接。


排除连接故障

有许多因素可能会阻止客户端应用程序成功连接到Greenplum数据库。本主题说明了连接问题的一些常见原因以及如何纠正它们。

表1.常见的连接问题

问题

解决方案

No pg_hba.conf entry for host or user

要允许Greenplum数据库能够接受远程客户端连接,您必须配置Greenplum数据库Master实例,这样来自于客户端主机和数据库用户的连接才会被允许连接到Greenplum数据库。这可以通过在pg_hba.conf配置文件(位于Master实例的数据目录中)中增加合适的条目就能做到。更多详细信息,请参阅“ 允许连接到Greenplum数据库”。

Greenplum Database is not running

如果Greenplum数据库Master实例关闭,则用户将无法连接。您可以通过在Greenplum的Master主机上运行gpstate工具来 验证Greenplum数据库系统是否正常运行。

Network problems

 

Interconnect timeouts

如果用户从一个远程客户端连接到Greenplum Master主机,则网络问题可能会阻止连接(例如,DNS主机名解析问题、主机系统已关闭等)。为确保不是引起网络问题的原因,请从远程客户端主机连接到Greenplum主主机。例如: ping  hostname 。

 

如果系统无法解析Greenplum数据库中涉及主机的主机名和IP地址,则查询和连接将失败。对于某些操作,到Greenplum数据库Master的连接会使用localhost而其他连接使用实际的主机名,因此您必须能够解析两者。如果遇到此错误,请首先确保可以通过网络从Master主机连接到Greenplum数据库阵列中的每一台主机。在Master和所有Segment的/etc/hosts文件中,确认有Greenplum数据库阵列所涉及所有主机的正确的主机名和IP地址。IP 127.0.0.1 必须解析为localhost。

Too many clients already

默认情况下,Greenplum数据库被配置为在Master和每个Segment上分别允许最多250和 750个并发用户连接。超出该限制的连接尝试将被拒绝。此限制由Greenplum数据库Master的postgresql.conf配置文件中的max_connections参数控制。如果您为Master更改了此设置,则还必须在Segment上进行适当的更改。