PostgreSQL DBA快速入门(一) - 准备和部署

PostgreSQL DBA快速入门(一): 准备和部署

MySQL和PostgreSQL - 两大开源对象关系型数据库管理系统,每个都有大量的粉丝。这么多年来,在PostgreSQL社区中MySQL一直被消遣:默认松散的SQL风格、对复杂链接操做支持的缺失、没有位图索引等等。相反,MySQL也有其强悍的地方:经过复制实现扩展的能力超强。前端

您可能会问 - 为何要在同一环境中使用这两个数据库?在Galera集群(高一致性MySQL架构)中使用PostgreSQL有价值吗?在这篇文章中,咱们尝试从MySQL DBA的角度来理解这些问题。接下来咱们也会讨论部署PostgreSQL的不一样方法。算法

为何是PostgreSQL?

1.复杂查询性能高

PostgreSQL的一大优点是可以有效的处理复杂查询。PostgreSQL可以使用不一样的链接算法(像hash join),这在建立最优执行计划时是很是灵活的。相比而言,MySQL仅支持嵌套循环链接,这种链接方式并非放之四海而皆准。sql

PostgreSQL可能比MySQL更快的另一个理由是对于子查询的处理。MySQL在执行子查询时,查询优化器并不够完美。在过去,大部分的执行被看成依赖子查询,若是要对这类查询加速,就要求进行手工查询重写。在MySQL 5.6中,已经作了一些提高,能够进行子查询物化。在MySQL 5.7中,针对该类情景又作了部分提高,可是相比PostgreSQL而言仍然是相去甚远。shell

2.PL/pgSQL等存储过程语言

在MySQL中建立存储过程是很是艰难的。比起其余RDBMS系统,MySQL中的编程语言既功能有限又不够灵活。在PostgreSQL中建立存储过程比在MySQL中容易的多 - 咱们能够建立一系列的存储过程,并将复杂的操做逻辑放在数据库端。相比而言,在MySQL中,受限于存储过程语言,一般不得不把一些复杂的逻辑分离到前端应用处理。PostgreSQL的另外优点是,您不只可使用PL/pgSQL语言,也可使用C、PL/Tcl、PL/Perl和PL/Python,这些都包含在核心发布包中,还有一些另外的存储过程语言能够自行添加。数据库

3.对JSON和GIS的支持

一件使人兴奋的事,若是您使用JSON和GIS数据类型,那么好吧,PostgreSQL支持的很是好。相比之下,MySQL在5.7版本中经过MyISAM表提供GIS支持,最近才引入InnoDB引擎。JSON数据类型的支持也是在MySQL 5.7才实现。在本篇文章写做时,Galera还不支持5.7,因此您不得不选择单机版的MySQL或者PostgreSQL来实现该类需求。另一方面,GIS和JSON都是InnoDB引擎新增的功能,还不够成熟,须要一段时间的锤炼。相对来讲,PostgreSQL能够提供一种跟稳定有效的选择。编程

PostgreSQL部署

1.经过仓库部署

PostgreSQL目前在各个主流的Linux分发版中都有,您能够很容易的经过yum或者apt-get命令进行安装。架构

一旦安装完成,当前仅能经过切换到postgres用户后用localhost进行访问。命令行操做以下:dom

root@ip-172-30-4-22 ~ # su - postgres
postgres@ip-172-30-4-22:~$ psql
psql (9.3.13)
Type "help" for help.
 
postgres=#

接下来,您即可以立刻对数据库进行管理,最重要的一点是:正确的配置访问权限和建立数据库用户。socket

PostgreSQL的访问方法在文件pg_hba.conf中定义。在不一样的操做系统中,该文件可能处于不一样的位置,例如:Ubuntu 14.04在/etc/postgresql/9.3/main/pg_hba.conf,CentOS7在/var/lib/pgsql/data/pg_hba.conf下。下面看一个pg_hba.conf的简单例子:tcp

# Database administrative login by Unix domain socket
local   all             postgres                                peer
 
# TYPE  DATABASE        USER            ADDRESS                 METHOD
 
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

正如您上面所见,定义了四条规则。第一条规则定义了用户postgres可以以本地操做系统用户访问全部数据库(peer方法)。类似的规则,你也能够在PostgreSQL数据库中建立一个myuser用户,并在操做系统也建立一个myuser用户,而后经过该用户登录,固然要这样执行须要相应的操做系统权限。另外两条本地TCP规则,都是用了md5方法,着意味着登录时须要输入密码。

接下来,咱们来为PostgreSQL数据库建立一个除postgres之外的用户。咱们能够很轻松的实现:

postgres@ip-172-30-4-22:~$ createuser -P --interactive
Enter name of role to add: s9suser
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
 
postgres@ip-172-30-4-22:~$ createuser -P --interactive
Enter name of role to add: s9sadmin
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) y

上面的例子中,咱们建立了两个用户:s9suser - 普通用户,s9sadmin - 超级用户。两个用户建立时都带有密码。使用上面的工具建立用户有多种选项,具体能够参见手册或者--help输出文档。

用户建立完成后,接下来就是建立数据库了。这里也能够经过shell来建立:(全部的数据库操做均可以经过SQL实现,固然这里为了展现一些shell级别的简便命令,并无使用SQL)

postgres@ip-172-30-4-22:~$ createdb s9sdb

最后,咱们开始访问数据库:

postgres@ip-172-30-4-22:~$ psql -U s9suser -W -h 127.0.0.1 s9sdb
Password for user s9suser:
psql (9.3.13)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
 
s9sdb=>

此刻,咱们能够从本地shell界面登录到数据库中。可是此时远程主机仍然不能访问PostgreSQL,要开放该权限,须要执行如下操做。

首先,须要让PostgreSQL监听到对应的接口地址。咱们能够修改postgresql.conf文件中的内容:(postgresql.conf文件和pg_hba.conf在同一路径下)

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)

从上面的结果能够看到,PostgreSQL默认监听localhost,咱们须要对这里做出修改,让他可以接受外部链接。修改完监听IP后,须要重启PostgreSQL服务。修改完后,能够经过如下语句确认监听:

root@ip-172-30-4-22 ~ # netstat -lnp | grep 5432
tcp        0      0 172.30.4.22:5432        0.0.0.0:*               LISTEN      20026/postgres
unix  2      [ ACC ]     STREAM     LISTENING     2000624  20026/postgres      /var/run/postgresql/.s.PGSQL.5432

接下来再尝试从不一样主机链接到咱们的PostgreSQL服务:

[root@ip-172-30-4-212 ~]# psql -h 172.30.4.22 -U s9sadmin s9sdb
psql: FATAL:  no pg_hba.conf entry for host "172.30.4.212", user "s9sadmin", database "s9sdb", SSL on
FATAL:  no pg_hba.conf entry for host "172.30.4.212", user "s9sadmin", database "s9sdb", SSL off

咱们获得了一个错误:缺乏pg_hba.conf配置。因此咱们在pg_hba.conf文件中增长如下语句:

host    all             all             172.30.4.212/32         md5

上面的错误也显而易见,若是有不少不一样的客户端须要登录,那么须要在pg_hba.conf文件中都作相关的配置,活着直接将IP定义为未0.0.0.0/0用来接收全部的链接。

pg_hba.conf文件中作的改变须要重载PostgreSQL服务才能生效。这里请注意,重载PostgreSQL服务(service postgresql reload)不会中断当前连接,因此重载是使配置生效的一种非中断方式。最后让咱们来一块儿看看是否能够从其余主机连接到PostgreSQL服务:

[root@ip-172-30-4-212 ~]# psql -h 172.30.4.22 -U s9sadmin s9sdb
Password for user s9sadmin:
psql (9.2.15, server 9.3.13)
WARNING: psql version 9.2, server version 9.3.
         Some psql features might not work.
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
 
s9sdb=#

当现实上面的s9sdb=#时,证实咱们成功了!

2.其余部署方式

很显然,经过仓库部署不是安装PostgreSQL的惟一途径。咱们能够经过从EDB、BigSQL、第二象限等企业下载封装好的PG可执行安装包进行安装,因为安装过程都一步步封装好,基本不会出错,这种安装的好处是在安装过程当中能够进行部分配置的定义。

另外还能够经过源码进行编译安装,该安装的好处是能够修改像数据块大小等更底层的配置。

总结

正如咱们所见,PostgreSQL安装简易。不管咱们采用何种方式安装它,都须要进行一些初始化配置。下一节课,咱们对该内容进行讨论。

相关文章
相关标签/搜索