PostgreSQL DBA快速入门(一): 准备和部署
MySQL和PostgreSQL - 两大开源对象关系型数据库管理系统,每一个都有大量的粉丝。这么多年来,在PostgreSQL社区中MySQL一直被消遣:默认松散的SQL风格、对复杂连接操作支持的缺失、没有位图索引等等。相反,MySQL也有其强悍的地方:通过复制实现扩展的能力超强。
您可能会问 - 为什么要在同一环境中使用这两个数据库?在Galera集群(高一致性MySQL架构)中使用PostgreSQL有价值吗?在这篇文章中,我们尝试从MySQL DBA的角度来理解这些问题。接下来我们也会讨论部署PostgreSQL的不同方法。
为什么是PostgreSQL?
1.复杂查询性能高
PostgreSQL的一大优势是能够有效的处理复杂查询。PostgreSQL能够使用不同的连接算法(像hash join),这在创建最优执行计划时是非常灵活的。相比而言,MySQL仅支持嵌套循环连接,这种连接方式并不是放之四海而皆准。
PostgreSQL可能比MySQL更快的另外一个理由是对于子查询的处理。MySQL在执行子查询时,查询优化器并不够完美。在过去,大部分的执行被当作依赖子查询,如果要对这类查询加速,就要求进行手工查询重写。在MySQL 5.6中,已经做了一些提升,可以进行子查询物化。在MySQL 5.7中,针对该类情景又做了部分提升,但是相比PostgreSQL而言仍然是相去甚远。
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进行访问。命令行操作如下:
root@ip-172-30-4-22 ~ # su - postgres
postgres@ip-172-30-4-22:~$ psql
psql (9.3.13)
Type "help" for help.
postgres=#
接下来,您便可以马上对数据库进行管理,最重要的一点是:正确的配置访问权限和创建数据库用户。
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的简单例子:
# 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安装简易。无论我们采用何种方式安装它,都需要进行一些初始化配置。下一节课,我们对该内容进行讨论。
来源:oschina
链接:https://my.oschina.net/u/592434/blog/1919118