在CentOS上编译安装PostgreSQL

时间:2023-03-08 17:14:04
在CentOS上编译安装PostgreSQL

http://my.oschina.net/tashi/blog

第一步:准备阶段

获取必需软件包:

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.

在CentOS上编译安装PostgreSQL

2.解压:

tar -zxvf postgresql-9.3.2.tar.gz

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

3.源码目录结构简介:

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

在CentOS上编译安装PostgreSQL

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

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

在CentOS上编译安装PostgreSQL

(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源码中的第三方贡献的插件源码

在CentOS上编译安装PostgreSQL

第三方插件简介:

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的核心代码

在CentOS上编译安装PostgreSQL

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目录结构简介:

在CentOS上编译安装PostgreSQL

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

© 著作权归作者所有