zoukankan      html  css  js  c++  java
  • 在CentOS上编译安装PostgreSQL

    第一步:准备阶段

    获取必需软件包:

    CentOS中查看是否安装了某个软件的命令:rpm -qa | grep 软件名。
    which命令可查看某个软件的安装路径。
    使用 yum install 包名 来安装软件包。

    1.GNU make的版本3.80以上
    [root@localhost ~]# rpm -qa | grep make
    make-3.81-20.el6.x86_64

    [root@localhost ~]# make -v
    GNU Make 3.81

    [root@localhost ~]# which gcc
    /usr/bin/gcc

    2.ISO/ANSI编译器,推荐最新版本的GCC

    [root@localhost ~]# rpm -qa | grep gcc
    gcc-4.4.7-4.el6.x86_64
    libgcc-4.4.7-4.el6.x86_64
    gcc-c++-4.4.7-4.el6.x86_64
    [root@localhost ~]# gcc -v
    gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)

    3.源码包的解压工具tar,除此之外还有gzip或bzip2

    [root@localhost ~]# rpm -qa | grep tar
    libtar-1.2.11-17.el6_4.1.x86_64
    tar-1.23-11.el6.x86_64
    [root@localhost ~]# tar --version
    tar (GNU tar) 1.23
    4.默认使用GNU Readline库
    [root@localhost ~]# rpm -qa | grep readline
    readline-6.0-4.el6.x86_64

    5.默认使用zlib压缩库
    [root@localhost ~]# rpm -qa | grep zlib
    zlib-1.2.3-29.el6.x86_64

    6.可选软件包:

    可选软件包(详细见文档:http://www.postgresql.org/docs/9.3/interactive/install-requirements.html):
    (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的文档,有一组独立的要求。查看http://www.postgresql.org/docs/9.3/interactive/docguide-toolsets.html

    第二步:获取并解压缩PostgreSQL源码及目录简介

    1.下载源码:官网:http://www.postgresql.org/ftp/source/,这里下载的是最新版9.3.2.

    2.解压:

    tar -zxvf postgresql-9.3.2.tar.gz

    随后会生成一个新的文件夹postgresql-9.3.2。(如果要压缩则参数为:-zcvf)

    3.源码目录结构简介:

    进入解压目录:cd postgresql-9.3.2,查看其结构

    (1)configure:源码安装的配置脚本

    查看配置脚本支持的参数:./configure --help

    (2)configure.in:configure文件的雏形

    (3)COPYRIGHT:版权信息

    (4)Makefile:Makefile模版

    (5)GUNMakefile.in:Makefile的雏形

    (6)HISTORY:版本变更的历史记录

    (7)INSTALL:安装简要说明

    (8)README:简单说明

    (9)aclocal.m4:config用的文件的一部分

    (10)config/:config用的文件的目录,存放了一些系统的配置文件,如c-compiler.m4文件中提供了检测C编译器的宏

    (11)contrib/:已打包到PG源码中的第三方贡献的插件源码

    第三方插件简介:

    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.Zhejiang.Hang<@'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相关插件

    (12)doc/:文档目录

    (13)src/:源代码目录,存放了PG的核心代码

    src目录简介:

    DEVELOPERS:面向开发人员的注视
    Makefile:Makefile
    Makefile.global.in:make的设定值(从configure生成的)
    Makefile.shlib:共享库用的Makefile
    nls-global.mk:信息目录用的Makefile文件的规则
    backend/:数据库引擎代码,数据库各个功能进程代码,系统存储部分代码,事务处理代码,查询优化部分代码等。PG最重要的代码都位于此目录
    bin/:数据库外围工具代码,如initdb,psql,pg_dump等的代码
    include/:系统依赖的头文件统一按照c文件的目录结构组织在include目录下
    interfaces/:数据库系统提供的对外接口,如libpq。但是如ODBC、JDBC等不在这个目录,它们作为独立的项目存在
    makefiles/:存放了针对不同操作系统编译所使用的makefile文件
    pl/:pg提供的存储过程,包括tcl、perl、python三种脚本语言支持的存储过程和PL/pgSQL支持的存储过程
    port/:平台移植相关的代码,对src\bin下的工具提供的基本函数的支持,编译后的样式是一个lib库
    template/:针对不同操作系统提供的一些脚本样例
    test/:各种测试脚本,PG提供的回归测试用例和自动化测试框架
    timezone/:时区相关代码(从http://www.iana.org/time-zones同步的时区库)
    tools/:辅助开发工具
    tutorial/:PG提供的部分示例,如如何写PG认识的SQL,如何写PG风格一致的C代码等

    backend目录结构简介:

    access/:数据访问层(很重要的目录),存放了和索引相关以及事务处理相关的代码:各种存储访问方法(在各个子目录下) common(共同函数)、gin (Generalized Inverted Index通用逆向索引)、gist (Generalized Search Tree通用索引)、 hash (哈希索引)、heap (heap的访问方法)、index (通用索引函数)、 nbtree (Btree函数)、transam (事务处理)。本层之下,是数据缓冲区,再下层,是真正的数据存储层。
    bootstrap/:初始化数据库时要使用的代码,和src\bin\initdb下的initdb工具紧密相关。
    catalog/:PG提供的针对系统表的操作代码,包含用于操作系统表的专用函数。
    parser/:编译器,对SQL语句进行解析的代码(注意gram.y文件)。即将SQL查询转化为内部查询树。
    optimizer/:查询优化器,根据查询树创建最优的查询路径和查询计划。
    executor/ 执行器(访问的执行),执行来自Optimizer的查询计划。与commands目录中的代码联合完成查询处理功能。
    commands/:执行非计划查询的SQL目录,如create table命令等。SQL命令被解析后执行具体命令时对应的操作代码(SELECT/INSERT/UPDATE/DELETE以外的SQL文的处理)
    tcop/:postgres服务进程(数据库引擎的进程)的主要部分,它调用Parser、Optimizer、Executor和Commands中的函数来执行客户端提交的查询。
    foreign/:FDW(Foreign Data Wrapper)处理
    lib/:共同函数,字符串处理和链表处理辅助函数。
    libpq/:处理与客户端间的通信,几乎所有的模块都依赖它。如:同身份认证或口令识别相关代码,以进行安全的网络通讯。如ssl,md5等等。
    main/:主程序模块,它负责将控制权转到Postmaster进程或Postgres进程。PG的main函数所在。PG启动入口。
    nodes/:定义系统内部所用到的节点、链表等结构,以及处理这些结构的函数。
    po/:实现国际化(i18n)功能的一部分。把一些数据库的提示信息国际化。
    port/:平台兼容性处理相关函数。屏蔽一些不同操作系统在一些实现上的差别。如windows上的socket、darwin系统上对system函数的支持、sunos4系统对于float类型的支持等。
    postmaster/:监听用户请求的守护进程,并控制Postgres进程的启动和终止。PG的主要进程。如主服务进程postmaster,归档进程pgarch等。
    regex/:正则表达式库及相关函数,用于支持正则表达式处理。
    replication/:streaming replication
    rewrite/:查询重写,根据规则系统对查询进行重写。
    snowball/:支持全文检索的代码
    storage/:很重要的一个目录,有关物理存储系统相关代码。管理各种类型的存储系统(如磁盘、闪存等),即共享内存、磁盘上的存储、缓存等全部一次/二次记录管理:buffer/(缓存管理)、 file/(文件)、freespace/(Fee Space Map管理) ipc/(进程间通信)、large_object /(大对象的访问函数)、 lmgr/(锁管理)、page/(页面访问相关函数)、 smgr/(存储管理器)。
    tsearch/:全文检索相关代码

    utils/:各种支持函数,如错误报告、各种初始化操作等等。各种模块(目录):adt/(嵌入的数据类型)、cache/(缓存管理)、 error/(错误处理)、fmgr/(函数管理)、hash/(hash函数)、init/(数据库初始化、postgres的初期处理)、 mb/(多字节文字处理)、misc/(其他)、mmgr/(内存的管理函数)、 resowner/(查询处理中的数据(buffer pin及表锁)的管理)、sort/(排序处理)、time/(事务的 MVCC 管理)

    backend等的代码的头文件包含在include里面。其组织虽然与backend的目录结构类似,但是并非完全相同,基本上来说下一级的子目录不再设下一级目录。例如backend的目录下面有utils这个目录,而util下面还有adt这个子目录,但是include里面省略了这个目录,变成了扁平的结构。

    第三步:源码安装PostgreSQL

    详细说明参考INSTALL文件或者http://www.postgresql.org/docs/9.3/interactive/install-procedure.html。

    步骤如下:

    1.配置(Configuration)

    进入源码目录:
    [root@localhost backend]# cd ~/software/postgresql-9.3.
    [root@localhost postgresql-9.3.2]# ./configure

    这种默认的配置将编译服务器和使用工具,以及所有客户端应用程序和接口,只需要一个C编译器。所有文件默认将安装到/usr/local/pgsql中。
    confiure命令的可选参数,参考:http://www.postgresql.org/docs/9.3/interactive/install-procedure.html

    这里,我的配置是可选参数设置如下:

    ./configure --prefix=/opt/pgsql9.3.2 --with-pgport=5432 --with-perl --with-python --with-tcl --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety --with-wal-blocksize=16 --with-blocksize=16 --enable-dtrace --enable-debug

    配置选项说明:

    --prefix=/opt/pgsql9.3.2:安装所有文件在/opt/pgsql9.3.2中(取代默认时的/usr/local/pgsql)。
    --with-pgport=5432:为服务器和客户端设置默认端口号。默认是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=16:WAL:预写式日志(Write-Ahead Logging)
    设置WAL的block size,以MB为单位。这是在WAL日志中的每个独立文件的大小。为了控制WAL日志传送的粒度去调整其大小,这可能是非常有用的。默认为16MB。这个值必须是2的1到64次方(MB)。注意,改变这个值需要一个initdb。
    --with-blocksize=16:设置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)

    配置过程可能会遇到依赖的动态库缺失, 安装这些缺失的库即可。

    记录下我这里的缺失lib的安装:

    dtrace工具的安装:

    PostgreSQL支持动态跟踪, 可以通过dtrace或者systemtap工具统计相关探针的信息。

    在CentOS中安装systemtap:
    在安装systemtap前,要保证kernel对应的kernel-devel包的版本保持一致:

    检查:
    [root@localhost ~]# rpm -qa|grep kernel
    [root@localhost ~]# uname -a

    不一致的话,则安装对应的kernel-devel版本或者升级kernel:
    [root@localhost ~]# yum install kernel-devel
    或:[root@localhost ~]# yum update kernel
    重启服务器。

    安装systemtap
    [root@localhost ~]# yum install systemtap systemtap-sdt-devel

    其中:
    安装systemtap时,安装了systemtap-devel、systemtap-client和systemtap-runtime这3个包。
    systemtap-sdt-devel是编译PostgreSQL时,选项--enable-dtrace需要的包。

    使用命令:
    [root@localhost ~]# rpm -qf /usr/bin/stap
    systemtap-devel-2.3-4.el6_5.x86_64
    systemtap-client-2.3-4.el6_5.x86_64
    rpm -qf:查询文件隶属的软件包

    检查stap是否正常
    [root@localhost ~]# stap
    A script must be specified.
    Try '--help' for more information.

    此时stap是正常的。接着测试下:
    [root@localhost ~]# stap -ve 'probe begin { log("hello world") exit() }'
    Pass 1: parsed user script and 96 library script(s) using 198456virt/26648res/3080shr/24072data kb, in 260usr/40sys/296real ms.
    Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 198852virt/27396res/3320shr/24468data kb, in 10usr/0sys/10real ms.
    Pass 3: using cached /root/.systemtap/cache/ca/stap_ca2aff10c84d1cf00083e0eb3e5d7082_1033.c
    Pass 4: using cached /root/.systemtap/cache/ca/stap_ca2aff10c84d1cf00083e0eb3e5d7082_1033.ko
    Pass 5: starting run.
    hello world
    Pass 5: run completed in 40usr/80sys/404real ms.

    stap调试好后,就可以用来跟踪postgresql了。
    PostgreSQL编译时必须开启dtrace支持,即--enable-dtrace。
    开启dtrace后,数据库将启用代码中的探针或跟踪点。

    回到PG的继续重新执行configure,遇到问题以及解决方法:

    (1)问题1:
    no
    configure: error: could not determine flags for linking embedded Perl.
    This probably means that ExtUtils::Embed or ExtUtils::MakeMaker is not
    installed.

    解决方法:
    yum install perl-ExtUtils-Embed

    (2)问题2:
    configure: error: readline library not found
    If you have readline already installed, see config.log for details on the
    failure. It is possible the compiler isn't looking in the proper directory.
    Use --without-readline to disable readline support.

    解决方法:
    yum install readline readline-devel

    (3)问题3:
    checking for inflate in -lz... no
    configure: error: zlib library not found
    If you have zlib already installed, see config.log for details on the
    failure. It is possible the compiler isn't looking in the proper directory.
    Use --without-zlib to disable zlib support.

    解决方法:
    yum install zlib zlib-devel

    (4)问题4:
    checking for CRYPTO_new_ex_data in -lcrypto... no
    configure: error: library 'crypto' is required for OpenSSL
    解决方法:
    yum install openssl openssl-devel

    (5)问题5:
    checking for pam_start in -lpam... no
    configure: error: library 'pam' is required for PAM
    解决方法:
    yum install pam pam-devel

    (6)问题6:
    checking for xmlSaveToBuffer in -lxml2... no
    configure: error: library 'xml2' (version >= 2.6.23) is required for XML support
    解决方法:
    yum install libxml2 libxml2-devel

    (7)问题7:
    checking for xsltCleanupGlobals in -lxslt... no
    configure: error: library 'xslt' is required for XSLT support
    解决方法:
    yum install libxslt libxslt-devel

    (8)问题8:
    configure: error: Tcl shell not found
    解决方法:
    yum install tcl tcl-devel

    (9)问题9:
    checking for ldap.h... no
    configure: error: header file is required for LDAP
    解决方法:
    yum install openldap openldap-devel

    (10)问题10:
    checking for Python.h... no
    configure: error: header file <Python.h> is required for Python
    解决方法:
    yum install python python-devel

    (11)问题11:
    Error when bootstrapping CMake:
    Cannot find appropriate C++ compiler on this system.
    Please specify one using environment variable CXX.
    See cmake_bootstrap.log for compilers attempted.
    解决方法:
    yum install gcc-c++

    2.编译

    Configure成功之后,执行编译:
    [root@localhost postgresql-9.3.2]# gmake world
    (make world安装包含了文档,所有的contrib)

    3.安装

    接着安装(带world参数可以安装PG的附属信息,如文档,帮助等):
    [root@localhost postgresql-9.3.2]# gmake install-world

    第四步:配置PG

    1.新建普通用户,用于初始化数据库, 开启和关闭数据库

    [root@localhost postgresql-9.3.2]# groupadd postgres
    [root@localhost postgresql-9.3.2]# useradd -g postgres postgres
    [root@localhost postgresql-9.3.2]# passwd postgres

    2.创建数据库的数据目录并设置其权限

    [root@localhost postgresql-9.3.2]# mkdir -p /db/pgdata
    [root@localhost postgresql-9.3.2]# chown -R postgres:postgres /db/pgdata

    3.设置环境变量

    [root@localhost postgresql-9.3.2]# su - postgres
    [postgres@localhost ~]$ vim ./.bash_profile
    在文件最后添加:
    #add PG env
    export PGHOME=/opt/pgsql9.3.2
    export PGDATA=/db/pgdata
    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'
    #alias pg_start='pg_ctl start -D $PGDATA'
    #alias pg_stop='pg_ctl stop -D $PGDATA -m fast'

    #psql -h 主机名 -p 端口号 -U 用户名 -W(强制口令提示) [-d]数据库名
    #psql -h $GHOST -p $PGPORT -U $PGUSER -W -d $PGDATABASE
    #PGHOST 设置数据库服务器名。 如果它以一个斜杠开头,那么它声明一个 Unix 域套接字而不是 TCP/IP 通讯; 其值就是该套接字文件存储的目录(在缺省安装中,这个目录会是 /tmp)
    #export PGHOST=$PGDATA
    export PGHOST=localhost
    #PGPORT 设置 TCP 端口号或者设置与 PostgreSQL 通讯的 Unix 域套接字的文件扩展。
    export PGPORT=5432
    export PGUSER=postgres #用于与数据库连接的用户名,initdb -U posgtres指定
    #export PGDATABASE=demo#数据库名

    修改环境变量后,可以重新登录该用户或者source .bash_profile让环境变量生效。

    测试一下:

    [postgres@localhost ~]$ source .bash_profile
    [postgres@localhost ~]$ psql -V
    psql (PostgreSQL) 9.3.2

    第五步:初始化数据库集群
    [postgres@localhost ~]$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
    看到如下提示信息,表示初始化成功,下一步可以启动数据库了。
    Success. You can now start the database server using:

    postgres -D /db/pgdata
    

    or
    pg_ctl -D /db/pgdata -l logfile start

    第六步:启动和关闭数据库

    启动:
    [postgres@localhost ~]$ pg_ctl start -D $PGDATA -l pgsql.log
    server starting
    [postgres@localhost ~]$ ls
    pgsql.log
    启动通过-l选项指定的日志,这里指定到当前路径下。也可以指定postgres用户具有可写权限的任何目录。

    查看数据库状态:
    [postgres@localhost ~]$ pg_ctl status
    pg_ctl: server is running (PID: 2524)
    /opt/pgsql9.3.2/bin/postgres "-D" "/db/pgdata"

    查看数据库的后台进程:
    [postgres@localhost ~]$ ps -ef | grep postgres
    postgres 2524 1 0 17:26 pts/2 00:00:00 /opt/pgsql9.3.2/bin/postgres -D /db/pgdata
    postgres 2526 2524 0 17:26 ? 00:00:00 postgres: checkpointer process
    postgres 2527 2524 0 17:26 ? 00:00:00 postgres: writer process
    postgres 2528 2524 0 17:26 ? 00:00:00 postgres: wal writer process
    postgres 2529 2524 0 17:26 ? 00:00:00 postgres: autovacuum launcher process
    postgres 2530 2524 0 17:26 ? 00:00:00 postgres: stats collector process

    关闭:
    [postgres@localhost ~]$ pg_ctl stop -D $PGDATA
    waiting for server to shut down.... done
    server stopped
    [postgres@localhost ~]$ pg_ctl status
    pg_ctl: no server running

    第七步:登录数据库

    以postgres身份来启动数据库(前面已通过su - postgres切换):
    [postgres@localhost ~]$ pg_ctl start -D $PGDATA -l pgsql.log

    列出所有可用的数据库:
    [postgres@localhost ~]$ psql -l
    该命令执行后,然后退出。

    登录数据库:
    使用"psql 数据库名"登录数据库。缺省数据库名时,连接到默认的数据库postgres。
    [postgres@localhost ~]$ psql
    psql (9.3.2)
    Type "help" for help.

    postgres=# select version();
    version



    PostgreSQL 9.3.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120
    313 (Red Hat 4.4.7-4), 64-bit
    (1 row)

    使用PostgreSQL数据库命令行交互工具psql登录数据库后,可以执行SQL命令或者psql提供的元命令。使用?可以查看psql的所有元命令和功能说明。
    登录数据库后,命令行提示符为"数据库名=#",如:"postgres=#"。

    登录后,psql常用的元命令:

    ?, 查看psql所有可以使用的元命令和说明信息;
    \l,列出所有的数据库信息;
    \c demodb, 连接到demodb数据库;
    \c[onnect] [数据库名称|- 用户名称|- 主机|- 端口|-], 连接到新的数据库;
    \d, 列出表,视图和序列;
    \d 名称, 描述表,视图,序列,或索引;
    \db [模式], 列出表空间
    \di [模式], 列出所有索引;
    \dt [模式], 列出所有表;
    \dT [模式], 列出数据类型
    \h, 列出所有的SQL命令;
    \h select, 列出select语句的语法;
    \i file, 执行来自file的命令;
    \q, 退出psql;
    select * from pg_stat_activity; 显示当前活动任务列表.

    第八步:简单的操作
    新建数据库,连接数据库,执行增删改查的操作,删除数据库
    接着第七步,先\q退出psql:
    postgres=# \q
    接着执行如下操作:
    新建数据库:
    [postgres@localhost ~]$ createdb test
    查看所有数据库:
    [postgres@localhost ~]$ psql -l
    连接到test数据库:
    [postgres@localhost ~]$ psql test
    psql (9.3.2)
    Type "help" for help.

    test=#
    创建数据表:
    test=# create table person(id int, name varchar(10), sex char(1), birth date);
    CREATE TABLE
    test=# create table demo(id int);
    CREATE TABLE
    列出表,视图和序列:
    test=# \d
    public | demo | table | postgres
    public | person | table | postgres
    查看表结构:
    test=# \d person
    id | integer |
    name | character varying(10) |
    sex | character(1) |
    birth | date |

    插入数据:
    test=# insert into person(id,name,sex,birth) values(1,'zhangsan','1','1990-01-08');
    INSERT 0 1
    查询表中的数据:
    test=# select * from person;
    id | name | sex | birth
    ----+----------+-----+------------
    1 | zhangsan | 1 | 1990-01-08
    (1 row)

    更新数据:
    test=# update person set name='lisi' where id=1;
    UPDATE 1

    删除数据:
    test=# delete from person where id = 1;
    DELETE 1

    新增字段:
    alter table person add column address varchar(50);
    ALTER TABLE
    test=# \d person
    修改字段类型:
    alter table person alter column address type varchar(20);
    ALTER TABLE
    test=# \d person
    修改字段名:
    alter table person rename column id to no;
    修改表名:
    alter table person rename to person_demo;
    删除字段:
    alter table person drop column address;
    ALTER TABLE
    test=# \d person

    新增主键:
    test=# alter table person add primary key(id);
    ALTER TABLE
    test=# \d person

    增加约束:
    唯一约束:
    test=# alter table person add constraint unique_name unique(name);
    ALTER TABLE
    test=# \d person

    删除约束:
    test=# alter table person drop constraint unique_name;
    test=# \d person
    test=# alter table person drop constraint person_pkey;
    test=# \d person

    查看建表语句:

    删除表:
    test=# drop table person;
    test=# \d

    删除数据库:
    先退出psql,后删除数据库:
    test=# \q
    [postgres@localhost ~]$ dropdb test;

    其实,可以在psql中直接通过sql命令创建和删除数据库:
    [postgres@localhost ~]$ psql
    postgres=# \l
    postgres=# create database test;
    CREATE DATABASE
    postgres=# \l
    postgres=# \c test;
    test=# create table t(id int);
    CREATE TABLE
    test=# \d

    test=# \c postgres
    postgres=# drop database test;
    DROP DATABASE
    postgres=# \l

  • 相关阅读:
    C程序设计语言学习笔记(二)
    字符串处理代码(国际化转换C++版) 荣
    取得MySQL数据库表,列信息的SQL语句 荣
    C++中,以类成员函数指针作为参数对std::map中的元素进行迭代处理 荣
    我的我的C#数据库操作类(与大家交流) 荣
    以较少代码实现DataGrid的排序,翻页,删除等功能 荣
    批处理文件的学习 荣
    DLL内存管理模板类 荣
    我的C++数据库访问库 荣
    我的C++数据库访问库临界区处理类 荣
  • 原文地址:https://www.cnblogs.com/liqiong/p/4268254.html
Copyright © 2011-2022 走看看