暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL安装(编译方式)

三杯酒coO 2020-02-20
1606

官方文档参考



一、环境


CentOS7.6
Postgresql12.2



二、操作系统环境配置


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



三、编译依赖包


可选软件包 详细见文档:


  1. 为了编译PL/Perl服务器端编程语言,需要完整Perl的安装,包括libperl库和头文件。

  1. 为了编译PL/Python服务器端语言,需要一个包含头文件和distuils模块的Python安装。

  1. 为了编译PL/Tcl服务器端语言,需要Tcl的安装。

  1. 为了使用NSL,即具有使用不同于英语的一种语言显示消息的能力,需要一种Gettext API的实现。

  1. 需要Kerberos, OpenSSL, OpenLDAP, and/or PAM,如果你想要使用这些服务支持认证或加密。

  1. 为了编译PostgreSQL的文档,有一组独立的要求。参考文档


    yum install systemtap systemtap-sdt-devel
    yum install perl-ExtUtils-Embed
    yum install readline readline-devel
    yum install zlib zlib-devel
    yum install openssl openssl-devel
    yum install pam pam-devel
    yum install libxml2 libxml2-devel
    yum install libxslt libxslt-devel
    yum install tcl tcl-devel
    yum install openldap openldap-develyum install gcc-c++
    yum install python python-devel
    yum install python3 python3-devel
    yum install gcc-c++



    四、源代码下载


    本文安装所使用的版本是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 详细定制安装步骤

        解压并进入到安装介质目录

          tar xvf postgresql-12.2.tar.gz
          cd postgresql-12.2



          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-blocksizeWAL:预写式日志(Write-Ahead Logging)设置WAL的block size,以MB为单位。这是在WAL日志中的每个独立文件的大小。为了控制WAL日志传送的粒度去调整其大小,这可能是非常有用的。默认为16MB。这个值必须是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_gingin索引方法的btree操作符扩展(在某些情况下“多列gin组合索引”比“多个btree单列索引的bitmap anding更高效)
              btree_gistgist索引方法的btree操作符扩展(在组合索引中的某些列类型仅支持gist索引访问方法,另一些列的类型支持btree以及gist时btree_gist更为有效,同时btree_gist还新增了<>用于排他约束,<->用于近邻算法)
              chkpass自动加密的字段类型(使用UNIX标准函数crypt()进行封装,所以仅支持前8位安全)'abcdefghijkl'::chkpass--'abcdefgh'
              citext不区分大小写的数据类型
              cube多维立方体类型,支持多维立方体对象的相同,相交,包含等运算
              dblinkPostgreSQL跨库操作插件
              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值
              intaggint类型的数组聚合函数(内建的array_agg函数已包含这个功能)
              intarrayint类型的数组功能扩展库,提供了一些常用的函数和操作符(数组元素个数,元素排序,元素下标,取元素子集,相交,包含,增加元素,删除元素,合并等)
              isn提供国际通用的产品标识码数据类型,例如ISBN,ISMN...
              lo大对象的一个可选模块,lo类型以及自动unlink大对象的触发器,方便大对象在消亡后的自动unlink,防止大对象存储泄漏(类似内存泄漏)
              ltree异构数据类型以及操作函数和操作符。例如China.Shanghai<@'China'
              oid2nameid转换成name的命令行工具,不属于extension。或通过系统表查询得到.
              pageinspect用于读取数据库PAGE裸信息的插件,可以读main,fsm,vm FORK的页数据,一般用于debug(使用时请参照对应数据库版本的头文件解读信息)
              passwordcheck创建用户或者修改用户密码时,检查密码的安全性,如果太弱的话,将返回错误。
              pg_archivecleanup清除归档文件的命令,不属于extension
              pgbench数据库性能测试的命令,不属于extension
              pg_buffercache输出当前的shared buffer的状态数据(细化到page number)
              pgcryptoPostgreSQL的服务端数据加密的扩展库
              pg_freespacemap输出对象指定page或所有page的free space map信息
              pgrowlocks(从行头信息中的informask获取行锁信息),注意输出的不是snapshot
              pg_standby8.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_supportpg_upgrade用到的服务端函数集
              pg_xlogdump从xlog中dump出一些易读的底层信息
              postgres_fdwpostgresq跨库的外部表插件
              seg线段类型和浮点数的区间类型,以及相关的操作符,索引访问方法等
              sepgsql基于SELinux安全策略的访问控制模块
              spi一些服务端的触发器函数(例如跟踪记录的存活时间,被哪个用户修改了,记录的修改时间等)
              sslinfo输出ssl认证的客户端的一些认证信息
              start-scripts数据库启动脚本模版
              tablefunc一般可用于行列变换,异构数据处理等
              tcn提供异步消息输出的触发器
              test_parser全文检索中的一个自定义parser的测试插件
              tsearch2全文检索相关的插件,在全文检索未引入PG内核前的PG版本可以使用这个插件来实现全文检索功能,大于8.3以后就不需要这个了
              unaccept全文检索相关的插件
              uuid-ossp生成UUID的插件
              vacuumlo大对象垃圾回收的命令
              worker_spi9.3新增的服务端worker编程范例
              xml2xml相关插件



              5.1.4 安装


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


                make install-world



                六、安装后配置



                6.1 添加操作系统用户


                  #以root用户添加一个pg专用账户
                  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


                                    使用说明


                                    • 安装依赖包

                                      • pip install psycopg2-binary
                                      • 简要操作案例

                                        • #导入依赖包
                                          #!/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:源码目录说明

                                        脑图网上找的,侵删。



                                        文章转载自三杯酒coO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                        评论