官方文档参考

一、环境

CentOS7.6
Postgresql12.2

二、操作系统环境配置

参考前面yum 安装方式文章 :PostgreSQL安装(yum方式)

三、编译依赖包

可选软件包 详细见文档

  1. 为了编译PL/Perl服务器端编程语言,需要完整Perl的安装,包括libperl库和头文件。
  2. 为了编译PL/Python服务器端语言,需要一个包含头文件和distuils模块的Python安装。
  3. 为了编译PL/Tcl服务器端语言,需要Tcl的安装。
  4. 为了使用NSL,即具有使用不同于英语的一种语言显示消息的能力,需要一种Gettext API的实现。
  5. 需要Kerberos, OpenSSL, OpenLDAP, and/or PAM,如果你想要使用这些服务支持认证或加密。
  6. 为了编译PostgreSQL的文档,有一组独立的要求。参考文档
  1. yum install systemtap systemtap-sdt-devel -y
  2. yum install perl-ExtUtils-Embed -y
  3. yum install readline readline-devel -y
  4. yum install zlib zlib-devel -y
  5. yum install openssl openssl-devel -y
  6. yum install pam pam-devel -y
  7. yum install libxml2 libxml2-devel -y
  8. yum install libxslt libxslt-devel -y
  9. yum install tcl tcl-devel -y
  10. yum install openldap openldap-develyum install gcc-c++ -y
  11. yum install python python-devel -y
  12. yum install python3 python3-devel -y
  13. yum install gcc-c++ -y

四、源代码下载

本文安装所使用的版本是12.2
官方下载页面:http://www.postgresql.org/ftp/source/
可以使用下面命令直接wget

wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz

五、编译安装步骤

5.1 官方简要步骤,可用于测试环境

tar xvf postgresql-12.2.tar.gz
cd postgresql-12.2
./configure  PREFIX=/usr/local/pgsql-12   #配置,生成makefile文件并指定安装目录
make && make install   #make && make install
su - root           #切换到root用户
useradd postgres #添加一个用户,添加完用户以后需要通过passwd postgres来修改该用户的密码
mkdir /usr/local/pgsql-12/data #新建一个目录,以后数据库的所有数据和操作都在该目录下
chown postgres.postgres /usr/local/pgsql-12/data #更改目录的所有者为 postgres
su - postgres   #切换用户为postgres
/usr/local/pgsql-12/bin/initdb -D /usr/local/pgsql-12/data #初始化工作区
/usr/local/pgsql-12/bin/pg_ctl -D /usr/local/pgsql-12/data logfile start
/usr/local/pgsql-12/bin/createdb test #新建一个名为test 的数据库
/usr/local/pgsql-12/bin/psql test  #打开客户端,连接到数据库服务器端

5.1 详细定制安装步骤

5.1.1 配置

官方文档

./configure --prefix=/usr/local/pgsql-12 --with-pgport=5432 --with-perl --with-python PYTHON='/usr/bin/python3' --with-tcl --with-openssl --with-pam  --without-ldap --with-libxml  --with-libxslt  --enable-thread-safety  --with-wal-blocksize=16  --enable-dtrace --enable-debug
  • 配置参数说明:
    下面参数依赖前面安装的依赖包,如果没有安装对应的依赖包会报错,感兴趣的同学可以不安装依赖包,然后找出每个选项对应的依赖包是什么。 | 配置选项 | 说明 | | —- | —- | | —prefix | 安装目录(取代默认时的/usr/local/pgsql) | | —with-pgport | 为服务器和客户端设置默认端口号。默认是5432 | | —with-perl | 编译PL/Perl服务端语言 | | —with-python | 编译PL/Python服务端语言 | | —with-tcl | 编译PL/Tcl服务端语言 | | —with-openssl | 编译支持SLL(加密)连接。这需要安装OpenSSL包 | | —with-pam | 编译支持PAM(Pluggable Authentication Modules,可插拔认证模块) | | —without-ldap | 编译支持认证和连接参数检查 | | —with-libxml | 编译libxml(支持SQL/XML),支持这个选项需要Libxml 2.6.23及最新版 | | —with-libxslt | 编译xml2模块,使用libxslt | | —enable-thread-safety | 让客户端库是线程安全的 | | —with-wal-blocksize | WAL:预写式日志(Write-Ahead Logging)设置WAL的block size,以KB为单位。这是在WAL日志中的每个独立文件的大小。为了控制WAL日志传送的粒度去调整其大小,这可能是非常有用的。默认为8KB。这个值必须是2的1到64次方(MB)。注意,改变这个值需要重新初始化数据initdb。 | | —with-blocksize | 设置block size,以KB为单位。这是表的存储和IO单元。默认为8K,适用于大多数情况;但是在特殊场合中,其他的值可能是非常有用的。这个值必须是2的1到32次方(KB)。注意,改变这个值需要初始化数据库initdb。 | | —enable-dtrace | 编译PostgreSQL支持动态跟踪工具DTrace | | —enable-debug | 把所有程序和库以带有调试符号的方式编译 | | —enable-nls[=LANGUAGES] | 打开本地语言支持(NLS),即以非英文显示程序的信息的能力。LANGUAGES是一个空格分隔的语言代码列表,标识你想支持的语言。比如—enable-nls=’de fr’。(你提供的列表和实际支持的列表之间的交集将会自动计算出来。)如果你没有声明一个列表,那么就安装所有可用的翻译。 |

还可以在—enable-debug前,添加两个选项:—enable-depend —enable-cassert

5.1.2 编译

Configure成功之后,执行编译:

make world

make world安装包含了文档,以及contrib下面的所有扩展

  • contrib下面的扩展简介 | 扩展名称 | 扩展说明 | | —- | —- | | adminpack | 一些管理函数 | | auth_delay | 认证失败后延迟报异常,可以防止暴力破解 | | auto_explain | 将超过指定执行时间的SQL的执行计划输出到日志中 | | btree_gin | gin索引方法的btree操作符扩展(在某些情况下“多列gin组合索引”比“多个btree单列索引的bitmap anding更高效) | | btree_gist | gist索引方法的btree操作符扩展(在组合索引中的某些列类型仅支持gist索引访问方法,另一些列的类型支持btree以及gist时btree_gist更为有效,同时btree_gist还新增了<>用于排他约束,<->用于近邻算法) | | chkpass | 自动加密的字段类型(使用UNIX标准函数crypt()进行封装,所以仅支持前8位安全)’abcdefghijkl’::chkpass—‘abcdefgh’ | | citext | 不区分大小写的数据类型 | | cube | 多维立方体类型,支持多维立方体对象的相同,相交,包含等运算 | | dblink | PostgreSQL跨库操作插件 | | dict_int | 全文检索的一个字典模版,用于控制数字被拆分的最大长度,以控制数字在全文检索中的分词个数(maxlen=6:12345678 —> 123456截断成6个,rejectlong=true则忽略这个分词) | | dict_xsyn | 全文检索的一个字典模块,设置分词的同义词,支持同义词匹配 | | dummy_seclabel | 用于安全标签SQL的测试 | | earthdistance | 可以使用cube或point类型计算地球表面两点之间的距离 | | file_fdw | 文件外部表模块 | | fuzzystrmatch | 单字节字符串之间的相似性判断 | | hstore | 用于存储K-V数据类型,同时这个插件还提供了比较V类型相关的函数和操作符。例如提供数组,json,hstore之间的转换,K-V的存在判断,删除K-V值 | | intagg | int类型的数组聚合函数(内建的array_agg函数已包含这个功能) | | intarray | int类型的数组功能扩展库,提供了一些常用的函数和操作符(数组元素个数,元素排序,元素下标,取元素子集,相交,包含,增加元素,删除元素,合并等) | | isn | 提供国际通用的产品标识码数据类型,例如ISBN,ISMN… | | lo | 大对象的一个可选模块,lo类型以及自动unlink大对象的触发器,方便大对象在消亡后的自动unlink,防止大对象存储泄漏(类似内存泄漏) | | ltree | 异构数据类型以及操作函数和操作符。例如China.Shanghai<@’China’ | | oid2name | id转换成name的命令行工具,不属于extension。或通过系统表查询得到. | | pageinspect | 用于读取数据库PAGE裸信息的插件,可以读main,fsm,vm FORK的页数据,一般用于debug(使用时请参照对应数据库版本的头文件解读信息) | | passwordcheck | 创建用户或者修改用户密码时,检查密码的安全性,如果太弱的话,将返回错误。 | | pg_archivecleanup | 清除归档文件的命令,不属于extension | | pgbench | 数据库性能测试的命令,不属于extension | | pg_buffercache | 输出当前的shared buffer的状态数据(细化到page number) | | pgcrypto | PostgreSQL的服务端数据加密的扩展库 | | pg_freespacemap | 输出对象指定page或所有page的free space map信息 | | pgrowlocks | (从行头信息中的informask获取行锁信息),注意输出的不是snapshot | | pg_standby | 8.4以及以前的版本方便于创建warm standby的命令行 | | pg_stat_statements | 跟踪数据库的SQL,收集SQL的统计信息 | | pgstattuple | 行级统计信息(dead tuples,live tuples,table_len,free_space,free_percent),索引的统计信息 | | pg_test_fsync | 测试磁盘的fsync速率。适用于选择最快的wal_sync_method | | pg_test_timing | 测试系统定时器的开销,开销越大,explain analyze时间结果越不准,需要调整系统时钟源 | | pg_trgm | 将字符串拆分成3个一组的多个单元,用于测试两个字符串之间的近似度,比分词更加暴力。 | | pg_upgrade | 跨大版本的升级工具(例如9.0—>9.1) | | pg_upgrade_support | pg_upgrade用到的服务端函数集 | | pg_xlogdump | 从xlog中dump出一些易读的底层信息 | | postgres_fdw | postgresq跨库的外部表插件 | | seg | 线段类型和浮点数的区间类型,以及相关的操作符,索引访问方法等 | | sepgsql | 基于SELinux安全策略的访问控制模块 | | spi | 一些服务端的触发器函数(例如跟踪记录的存活时间,被哪个用户修改了,记录的修改时间等) | | sslinfo | 输出ssl认证的客户端的一些认证信息 | | start-scripts | 数据库启动脚本模版 | | tablefunc | 一般可用于行列变换,异构数据处理等 | | tcn | 提供异步消息输出的触发器 | | test_parser | 全文检索中的一个自定义parser的测试插件 | | tsearch2 | 全文检索相关的插件,在全文检索未引入PG内核前的PG版本可以使用这个插件来实现全文检索功能,大于8.3以后就不需要这个了 | | unaccept | 全文检索相关的插件 | | uuid-ossp | 生成UUID的插件 | | vacuumlo | 大对象垃圾回收的命令 | | worker_spi | 9.3新增的服务端worker编程范例 | | xml2 | xml相关插件 |

5.1.4 安装

带world参数可以安装PG的附属信息,如文档,帮助等

make install-world

六、安装后配置

6.1 添加操作系统用户

useradd postgres

6.2 环境变量配置

su - postgres
cat >>~/.pgsql_profile <<EOF
export PGHOME=/usr/local/pgsql-12
export PGDATA=/data/pgsql/12/data
export PATH=$PGHOME/bin:$PATH
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=en_US.utf8
export DATE=`date +"%Y-%m-%d %H:%M:%S"`
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
alias rm='rm  -i'
alias ll='ls -lh'
export PGPORT=5432
export PGUSER=postgres 
EOF
cat >>~/.bash_profile <<EOF
[ -f ~/.pgsql_profile ] && source ~/.pgsql_profile
EOF

6.3 自启动配置

CentOS7 将/etc/rc.d/rc.local的级别降低了 ,默认是启动不了一些服务的。通过ls -l 可以看到该文件没有执行权限。查看该文件内容,在英文注释部分已经有提示了。

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

可以按照提示给该文件添加执行权限,延续老的方式进行开机启动。

  • 本文将按照新的方式,将postgresql 添加到系统服务里面开机启动,下面是启动脚本和添加方式。
# 配置启动脚本
cat >> /usr/lib/systemd/system/postgresql-12.service<<EOF
# It's nngkt recommended to modify this file in-place, because it will be
# overwritten during package upgrades.  If you want to customize, the
# best way is to create a file "/etc/systemd/system/postgresql-12.service",
# containing
#       .include /usr/lib/systemd/system/postgresql-12.service
#       ...make your changes here...
# For more info about custom unit files, see
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F

# Note: changing PGDATA will typically require adjusting SELinux
# configuration as well.

# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-setup.
[Unit]
Description=PostgreSQL 12 database server
Documentation=https://www.postgresql.org/docs/12/static/
After=syslog.target
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.

# Location of database directory
Environment=PGDATA=/data/pgsql/12/data/

# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog

# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

ExecStart=/usr/local/pgsql-12/bin/pg_ctl start -D ${PGDATA} -s 
ExecStop=/usr/local/pgsql-12/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql-12/bin/pg_ctl reload -D ${PGDATA} -s
KillMode=mixed
KillSignal=SIGINT


# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0

[Install]
WantedBy=multi-user.target
EOF
# 设置权限
chmod 754 /usr/lib/systemd/system/postgresql.service
# 设置开机启动
systemctl enable postgresql-12.service
# 启动、关闭、重启、查看状态
systemctl start|stop|restart|status postgresql-12.service
# 查看已设置自启动服务
systemctl   list-units --type=service

6.4 数据库初始化

#创建目录并授权
mkdir -p /data/pgsql/12/data
chown -R postgres:postgres /data/pgsql
#初始化数据目录(添加 -k 选项,启用checksum)
su - postgres
/usr/local/pgsql-12/bin/initdb -D /data/pgsql/12/data -k

关于 checksum的相关 说明:
Postgresql checksum
PostgreSQL full_page_write机制

6.5 数据库启动关闭

su - postgres
# 启动
/usr/local/pgsql-12/bin/pg_ctl -D $PGDATA start
# 关闭
/usr/local/pgsql-12/bin/pg_ctl -D $PGDATA stop
# 重新加载配置文件
/usr/local/pgsql-12/bin/pg_ctl reload

6.6 创建数据库和用户

su - postgres
psql
create user test with password 'test';
create database test owner test;

6.7 数据库连接

6.7.1 在postgres用户下直接psql 登录

默认在pg_hba.conf里面本机登录权限设置为trust ,是不需要输入密码的,如果是md5的验证方式则需要密码。详细可参考配置文件详解

如果在用户家目录下有 .pgpass 则不需要输入密码,直接psql -U用户名 就可以登录数据库。
.pgpass需要 0600的权限:

cat >>~/.pgpass <<EOF
#hostname:port:database:username:password
localhost:5432:postgres:postgres:postgres
EOF
chmod 0600 ~/.pgpass

6.7.2 使用psql 远程登录

请使用 pgsql —help 查看使用帮助
链接例子:

psql -h 192.168.1.10 -p 5432 -Upostgres -D postgres

6.7.3 使用编程语言链接

postgresql 相关的一些软件或者驱动 可参考[官方资料库] (https://www.postgresql.org/download/products/2-drivers-and-interfaces/)

6.7.3.1 JAVA

[java jdbc驱动] (https://jdbc.postgresql.org)
连接字符串:

`jdbc:postgresql://192.168.1.10:5432/test?currentSchema=test`

6.7.3.2 python

使用说明

  • 安装依赖包bash pip install psycopg2-binary

  • 简要操作案例```python

    导入依赖包

    !/usr/bin/python3

import psycopg2

创建连接对象

conn=psycopg2.connect(database=”postgres”,user=”postgres”,password=”123456”,host=”localhost”,port=”5432”) cur=conn.cursor() #创建指针对象

创建表

cur.execute(“CREATE TABLE tb_user (id integer,name varchar,sex varchar);”)

插入数据

cur.execute(“INSERT INTO tb_user(id,name,sex)VALUES(%s,%s,%s)”,(1,’Air’,’M’)) cur.execute(“INSERT INTO tb_user(id,name,sex)VALUES(%s,%s,%s)”,(2,’Tal’,’F’)) cur.execute(“INSERT INTO tb_user(id,name,sex)VALUES(%s,%s,%s)”,(3,’Dal’,’M’))

获取结果

cur.execute(‘SELECT * FROM tb_user’) results=cur.fetchall() print (results)

关闭连接

conn.commit() cur.close() conn.close() ```

附录1:源码目录说明

PostgreSQL安装(编译方式) - 图1

附录2:数据库目录说明

(未完成)