记得2年前写过一篇关于PostgreSQL的文章。当时对它很感兴趣,在工作中想接手PG的业务,但是因为种种原因搁置了。今天整理了一些PostgreSQL的基础内容。参考书是唐成老师的《PostgreSQL修炼之道》。有了Oracle和MySQL的基础,似乎比从头开始容易多了。总体感觉PG功能确实很多很齐全,功能和Oracle不相上下,技术风格和MySQL很像。在做一些总结的时候,他们不停地在两个数据库之间来回切换。关于主备环境的搭建,我采用了基于流复制的方式。这是PG9.0之后提供的一种将日志传输到WAL的方法。它基于物理复制。逻辑解码从9.4开始,细粒度逻辑复制在PG10会有很大提升。1.安装部署数据库软件的安装部署还是要多说几句。使用9.5版本的源码安装。源码包很小,只有几十兆。1)解压tar-zxvfpostgresql-9.5.0.tar.gz2)切换到解压目录,尝试编译准备cdpostgresql-9.5.0./configure-prefix/usr/local/pgsql这个过程可能有问题,比如如以下错误。配置:错误:未找到zliblibrary如果您已经安装了zlibal,请参阅config.log了解有关失败的详细信息。编译器可能没有在正确的目录中查找。使用--without-zlib来禁用zlib支持。类似的错误包括readline。实际情况下,zlib包和readline包都存在。这里要注意一点:redhat系列下的软件包叫readline-devel,ubuntu下的软件包叫readline-dev。它又细分为libreadline5-dev和libreadline6-dev,所以我们需要安装readline-devel和zlib-devel的包。完成它,不要只是怀疑它,并启用--without-zlib选项。接下来的步骤很简单。3)开始编译安装这两个过程的时间会稍微长一些,大概几分钟,比MySQL源码编译要快很多。makemakeinstall4)创建用户和组useraddpostgresmkdir-p/data/pgsql9.5chown-Rpostgres:postgres/data/pgsql9.5su-postgres5)初始化部署/usr/local/pgsql/bin/initdb-D/data/pgsql9.5至此,数据库软件的部署就完成了。这里只做功能,还没有涉及到性能层面的调整和优化。2、配置主库使用环境为两台服务器192.168.179.128主库192.168.253.134备库1)创建复制角色CREATEROLEreplicaloginreplicationencryptedpassword'replica';2)在配置访问权限文件gp_hba.conf中增加一条记录,这样备库就可以访问了,修改后需要重启hostreplicationreplica192.168.253.134/24trust因为是跨网段,我添加了一条额外的网关记录hostreplicationreplica192.168.179.1/24trust3)修改参数配置文件postgresql.conf如下几个参数设置,端口仍然保留默认5432listen_addresses='*"port=5432wal_level=hot_standbymax_wal_senders=2wal_keep_segments=32wal_sender_timeout=60smax_connections=100这些步骤完成后记得重启PG让配置生效4)重启PG$/usr/local/pgsql/bin/pg_ctl-D/data/pgsql9.5-llogfilerestart3.配置备库需要同样步骤部署数据库软件,参考***部分即可,此时备库上没有初始化数据,我们模拟客户端访问,and可能会出现以下错误。$psql-Ureplica-h192.168.179.128-p5432--passwordPasswordforuserreplica:psql:FATAL:nopg_hba.confentryforhost"192.168.179.1",user"replica",database"replica"1)不用担心用pg_basebackup恢复数据,我们可以使用pg_basebackup或者命令行做备份和恢复$pg_basebackup-Fp--progress-D/data/pgsql9.5-h192.168.179.128-p5432-Ureplica--passwordPassword:22484/22484kB(100%),1/1tablespaceNOTICE:WALarchivingisnotenabled;youmustensurethatallrequiredWALsegmentsarecopiedthroughothermeanstocompletethebackup2)Configurationrecoveryconfigurationrecovery.conf这一步是关键,类似于Oracle中的archiveparameters或者MySQL中的changemastersettings。recovery.conf文件可以从模板中获取:cp/usr/local/pgsql/share/recovery.conf.sample/data/pgsql9.5/recovery.confrecovery.conf文件内容变化参考如下:standby_mode=onprimary_conninfo='host=192.168.179.128port=5432user=replicapassword=replica'recovery_target_timeline='latest'trigger_file='/data/pgsql9.5/trigger_activestb'3)修改配置参数文件postgresql.conf的内容postgresql.conf文件修改如下,配置与主库有较大区别,需要注意。listen_addresses='*'port=5432wal_level=minimalmax_wal_senders=0wal_keep_segments=0max_connections=1000synchronous_commit=offsynchronous_standby_names=''hot_standby=onmax_standby_streaming_delay=30wal_receiver_status_interval=1shot_standby_feedback=on4)启动PG备库$/usr/local/pgsql/bin/pg_ctl-D/data/pgsql9.5-llogfilestart5)查看复制状态,可以在主库端查看复制状态。请参考pg_stat_replication视图。在查看过程中,这个视图视野很大,看起来有点乱。我们可以使用类似于MySQL\G的方法来查看,即\x的扩展模式。postgres=#\xExpandeddisplayison.postgres=#select*frompg_stat_replication;-[RECORD1]----+------------------------------pid|20539usesysid|16384usename|replicaapplication_name|walreceiverclient_addr|192.168.179.1client_hostname|client_port|49374backend_start|2018-03-2505:19:15.215181+08backend_xmin|1756state|streamingsent_location|0/302F600write_location|0/302F600flush_location|0/302F600replay_location|0/302F600sync_priority|0sync_state|异步
