PostgreSQL - 1. PostgreSQL-安装和基本配置

目录

[toc]

1 PostgreSQL简介

1.1 概述

  PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON和JSONB类型,数组类型)和自定义类型。而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数、触发器,也支持使用流行的语言写自定义函数、比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python,PL/Tcl,等等。

1.2 PostgreSQL优势

  • PostgreSQL数据库是目前功能最强大的开源数据库,它是最接近工业标准SQL92的查询语言,并且正在实现新的功能以兼容最新的SQL标准:SQL2003。
  • 稳定可靠:PostgreSQL是唯一能够做到数据零丢失的开源数据库。有报道称国外部分银行也在使用PostgreSQL数据库。
  • 开源省钱:PostgreSQL数据库是开源的、免费的,而且是BSD协议,在使用和二次开发上基本没有限制。
  • 支持广泛:PostgreSQL数据库支持大量的主流开发语言,包括C、C++、Perl、Python、Java、Tcl,以及PHP等。
  • PostgreSQL社区活跃:PostgreSQL基本上每三个月推出一个补丁版本,这意味着已知的BUG很快会被修复,有应用场景的需求也会及时得到响应。

2 PostgreSQL安装

2.1 yum源中包含的PostgreSQL包

[root@localhost ~]# yum list | grep postgresql
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
freeradius-postgresql.x86_64               3.0.4-6.el7                 local    
libreoffice-postgresql.x86_64              1:5.0.6.2-3.el7             local    
pcp-pmda-postgresql.x86_64                 3.11.3-4.el7                local    
postgresql.i686                            9.2.18-1.el7                local    
postgresql.x86_64                          9.2.18-1.el7                local    
postgresql-contrib.x86_64                  9.2.18-1.el7                local    
postgresql-devel.i686                      9.2.18-1.el7                local    
postgresql-devel.x86_64                    9.2.18-1.el7                local    
postgresql-docs.x86_64                     9.2.18-1.el7                local    
postgresql-jdbc.noarch                     9.2.1002-5.el7              local    
postgresql-jdbc-javadoc.noarch             9.2.1002-5.el7              local    
postgresql-libs.i686                       9.2.18-1.el7                local    
postgresql-libs.x86_64                     9.2.18-1.el7                local    
postgresql-odbc.x86_64                     09.03.0100-2.el7            local    
postgresql-plperl.x86_64                   9.2.18-1.el7                local    
postgresql-plpython.x86_64                 9.2.18-1.el7                local    
postgresql-pltcl.x86_64                    9.2.18-1.el7                local    
postgresql-server.x86_64                   9.2.18-1.el7                local    
postgresql-test.x86_64                     9.2.18-1.el7                local    
postgresql-upgrade.x86_64                  9.2.18-1.el7                local    
qt-postgresql.i686                         1:4.8.5-13.el7              local    
qt-postgresql.x86_64                       1:4.8.5-13.el7              local    
qt5-qtbase-postgresql.i686                 5.6.1-10.el7                local    
qt5-qtbase-postgresql.x86_64               5.6.1-10.el7                local

2.2 rpm包安装PostgreSQL

[root@localhost ~]# yum install -y postgresql-server postgresql postgresql-libs
server端:postgresql-server
client端:postgresql
依赖包:  postgresql-libs
  1. 安装完成后不能直接启动数据库,需要先手动初始化数据库:
[root@localhost ~]# service postgresql initdb
Hint: the preferred way to do this is now "postgresql-setup initdb"
Initializing database ... OK
  1. 再启动数据库:
[root@localhost ~]# systemctl start postgresql

[root@localhost ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2018-02-19 22:02:57 CST; 3min 37s ago
  Process: 1286 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)  
  Process: 1281 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 1290 (postgres)
   CGroup: /system.slice/postgresql.service
           ├─1290 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           ├─1291 postgres: logger process   
           ├─1293 postgres: checkpointer process   
           ├─1294 postgres: writer process   
           ├─1295 postgres: wal writer process   
           ├─1296 postgres: autovacuum launcher process   
           ├─1297 postgres: stats collector process   
           └─1391 postgres: postgres postgres [local] idle

2月 19 22:02:56 localhost.localdomain systemd[1]: Starting PostgreSQL database server...
2月 19 22:02:57 localhost.localdomain systemd[1]: Started PostgreSQL database server.
  1. 切换到操作系统下的“postgres”用户,登陆数据库:
[root@localhost ~]# su - postgres
-bash-4.2$ psql
psql (9.2.18)
输入 "help" 来获取帮助信息.

postgres=# \l
                                     资料库列表
   名称    |  拥有者  | 字元编码 |  校对规则   |    Ctype    |       存取权限        
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 行记录)

postgres=# 
  1. rpm包安装的PostgreSQL的数据目录,默认在/var/lib/pgsql/data
-bash-4.2$ ls -l /var/lib/pgsql/data/
总用量 48
drwx------ 5 postgres postgres    41 2月  19 22:01 base
drwx------ 2 postgres postgres  4096 2月  19 22:02 global
drwx------ 2 postgres postgres    18 2月  19 22:01 pg_clog
-rw------- 1 postgres postgres  4232 2月  19 22:01 pg_hba.conf
-rw------- 1 postgres postgres  1636 2月  19 22:01 pg_ident.conf
drwx------ 2 postgres postgres    32 2月  19 22:02 pg_log
drwx------ 4 postgres postgres    36 2月  19 22:01 pg_multixact
drwx------ 2 postgres postgres    18 2月  19 22:02 pg_notify
drwx------ 2 postgres postgres     6 2月  19 22:01 pg_serial
drwx------ 2 postgres postgres     6 2月  19 22:01 pg_snapshots
drwx------ 2 postgres postgres    25 2月  19 22:08 pg_stat_tmp
drwx------ 2 postgres postgres    18 2月  19 22:01 pg_subtrans
drwx------ 2 postgres postgres     6 2月  19 22:01 pg_tblspc
drwx------ 2 postgres postgres     6 2月  19 22:01 pg_twophase
-rw------- 1 postgres postgres     4 2月  19 22:01 PG_VERSION
drwx------ 3 postgres postgres    60 2月  19 22:01 pg_xlog
-rw------- 1 postgres postgres 19816 2月  19 22:01 postgresql.conf
-rw------- 1 postgres postgres    57 2月  19 22:02 postmaster.opts
-rw------- 1 postgres postgres    91 2月  19 22:02 postmaster.pid

rpm包的postgresql10安装、初始化数据库以及启动方法(centos-7):

https://www.postgresql.org/download/linux/redhat/

yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm

yum install postgresql10

yum install postgresql10-server

/usr/pgsql-10/bin/postgresql-10-setup initdb
systemctl enable postgresql-10
systemctl start postgresql-10

2.3 源码包安装PostgreSQL

  1. 下载源代码
[root@localhost ~]# wget https://ftp.postgresql.org/pub/source/v10.2/postgresql-10.2.tar.gz
  1. 安装依赖包
[root@localhost ~]# yum install -y zlib-devel readline-devel gcc
  1. 编译安装PostgreSQL
[root@localhost ~]# tar -zxvf postgresql-10.2.tar.gz

[root@localhost ~]# cd postgresql-10.2

[root@localhost postgresql-10.2]# ./configure --prefix=/usr/local/pgsql10.2 --with-python --with-perl
[root@localhost postgresql-10.2]# make && make install

[root@localhost postgresql-10.2]# cd /usr/local/
[root@localhost local]# ln -s pgsql10.2 pgsql

备注:

  在PostgreSQL8.X中,编译命令里需要有“--enable-thread-safety”选项,而在PostgreSQL9.X以后的版本中不需要这个选项。

  因为在日常使用中,一般要求客户端是线程安全的,PostgreSQL9.X以后的版本中考虑到这个问题,默认线程是安全的了。


  --with-perl:加上这个选项,才能使用perl语言的PL/Perl过程语言写自定义函数,一般都需要。要使用这个选项需要先安装perl-ExtUtils-Embed和perl-devel。

  --with-python:加上这个选项,才能使用perl语言的PL/Python过程语言写自定义函数,一般都需要。要使用这个选项需要先安装python-devel。

  按照官方文档要求,使用make命令时,make的版本要在gmake3.8以上,目前大多数Linux发行版都满足要求。(检查方法:make --version)

  不指定--prefix选项,默认路径将是/usr/local

异常处理:

编译时增加 --with-python
configure: error: header file <Python.h> is required for Python

解决方法:
yum install python-devel
编译时增加 --with-perl
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
  1. 配置PostgreSQL环境变量
[root@localhost local]# vim /etc/profile
# PostgreSQL可执行文件路径
export PATH=/usr/local/pgsql/bin:$PATH
# PostgreSQL共享库路径
export LD_LIBRARY_PATH=/usr/local/pgsql/lib

[root@localhost local]# source /etc/profile
  1. 创建数据库簇
[root@localhost local]# useradd postgres
[root@localhost local]# mkdir -pv /mydata/pgdata
mkdir: 已创建目录 "/mydata"
mkdir: 已创建目录 "/mydata/pgdata"

[root@localhost local]# chown -R postgres.postgres /mydata/pgdata/

[root@localhost local]# su - postgres

[postgres@localhost ~]$ /usr/local/pgsql/bin/initdb -D /mydata/pgdata/
  1. 启动PostgreSQL
[postgres@localhost pgsql]$ pg_ctl start -D /mydata/pgdata/
waiting for server to start....2018-02-20 00:52:03.616 CST [38915] LOG:  listening on IPv6 address "::1", port 5432
2018-02-20 00:52:03.616 CST [38915] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2018-02-20 00:52:03.619 CST [38915] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2018-02-20 00:52:03.689 CST [38916] LOG:  database system was shut down at 2018-02-20 00:44:56 CST
2018-02-20 00:52:03.692 CST [38915] LOG:  database system is ready to accept connections
 done
server started
  1. 停止PostgreSQL
[postgres@localhost pgsql]$ pg_ctl stop -D /mydata/pgdata/

备注:
    可以在命令后增加 [-m SHUTDOWN-MODE],用来控制数据库的停止方法;SHUTDOWN-MODE有以下三种:
        smart:等所有的连接终止后,关闭数据库。如果客户端连接不终止,则无法关闭数据库。
        fast (PostgreSQL10.X默认):快速关闭数据库,断开客户端的连接,让已有的事物回滚,然后正常关闭数据库。
                                   相当于Oracle数据库关闭时的immediate(adj. 立即的)模式。
        immediate:不完整的关闭数据库,相当于kill数据库进程,下次启动数据库需要进行恢复。相当于Oracle数据库关闭时的abort模式。
    其中,比较常用的是fast模式。

  1. PostgreSQL启动脚本
    要使用service命令启动PostgreSQL,需要把PostgreSQL的启动脚本拷贝到 /etc/init.d/ 下,并增加执行权限
[root@localhost start-scripts]# pwd
/root/postgresql-10.2/contrib/start-scripts

[root@localhost start-scripts]# ls
freebsd  linux  macos  osx

[root@localhost start-scripts]# cp linux /etc/init.d/postgresql

[root@localhost ~]# cd /etc/init.d
[root@localhost init.d]# chmod 755 postgresql

需要修改启动脚本中的几个参数:

[root@localhost init.d]# vim postgresql 
prefix=/usr/local/pgsql     # 确保可以通过这个目录访问到源码安装的PostgereSQL
PGDATA="/mydata/pgdata"     # 指向第5步创建的数据库簇

备注:

  在centos7中,源码安装的PostgreSQL没有提供systemctl需要的相关脚本,可以继续使用service和chkconfig去管理。

2.4 安装crontrib目录下的工具

crontrib下面有一些工具比较实用,可以装上,方法如下:

[root@localhost postgresql-10.2]# pwd
/root/postgresql-10.2

[root@localhost postgresql-10.2]# cd contrib/

[root@localhost contrib]# make && make install

安装后 /usr/local/pgsql/bin 会增加三个命令:oid2name pg_standby vacuumlo

2.5 使用较大的数据块提高I/O性能

  如果希望使用较大的数据块提高I/O性能,只能通过源码编译安装解决解决,在执行 ./configure 命令时指定较大数据块,同时也需要指定较大的WAL日志块和WAL日志文件的大小。

  如果想指定32KB数据块、32KB的WAL日志块、64MB的WAL日志文件,./configure 的命令如下:

./configure --prefix=/usr/local/pgsql10.2 --with-python --with-perl --with-blocksize=32 --with-wal-blocksize=32 --with-wal-segsize=64

备注:
    --with-blocksize        的范围在1-32KB,默认8KB
    --with-wal-blocksize    的范围在1-64KB,默认8KB
    --with-wal-segsize      的范围在1-1024MB,默认16MB
    
注意:
    修改数据块后的PostgreSQL创建的PostgreSQL数据库,不能使用其它块大小的PostgreSQL程序启动。

3 PostgreSQL配置

3.1 PostgreSQL通用配置 - postgresql.conf

3.1.1 修改PostgreSQL监听IP和端口

监听IP和端口需要通过数据目录下的postgresql.conf文件修改:

[root@localhost pgdata]# pwd
/mydata/pgdata
[root@localhost pgdata]# vim postgresql.conf
listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)

  监听IP使用默认的localhost时,只能通过127.0.0.1访问数据库;

  如果需要通过其他网络远程访问PostgreSQL,可以使用“,”作为分隔符,把IP地址添加到listen_addresses后,或者使用“*”,让所有IP都可以访问数据库。

3.1.2 配置数据库log

  1. 日志开关以及保存目录名
logging_collector = on      # 日志的开关,默认是off,不会收集日志
log_directory = 'log'       # 日志的保存目录名,默认是在数据目录下的log目录里,使用默认值即可,不需要修改
  1. 日志的轮转配置
    可以使用以下几种方案:
  • 每天生成一个新的日志
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'     #日志文件名
log_truncate_on_rotation = off      # 同名日志覆盖开关
log_rotation_age = 1d       # 按时间轮转日志
log_rotation_size = 0       # 按日志大小轮转日志
  • 每当日志写满一定大小(如10MB),进行一次日志轮转
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 0
log_rotation_size = 10M
  • 只保留7天的日志,进行循环覆盖
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0

说明:

  %a 代表星期,例如:在星期二时,就会生成postgresql-Tue.log这个日志;

  每当遇到同名的日志时,会对旧的日志文件进行覆盖,而不是在旧的日志文件上进行追加。

3.1.3 内存参数配置

PostgreSQL安装完成后,可以主要修改以下两个主要内存参数:

  • shared_buffer:共享内存的大小,主要用于共享数据块,默认是128MB;

    如果服务器内存有富余,可以把这个参数适当改大一些,这样数据库就可以缓存更多的数据块,当读取数据时,就可以从共享内存中读取,而不需要去文件读取。
  • work_mem:单个SQL执行时,排序、hash join所使用的内存,SQL运行完成后,内存就释放了,默认是4MB;

    增加这个参数,可以提高排序操作的速度。

注意

  1. postgresql.auto.conf

       对于9.4版本以后的PostgreSQL,系统会生成一个postgresql.auto.conf,如过在postgresql.auto.conf和postgresql.conf都做了相同的配置,那么PostgreSQL会优先使用postgresql.auto.conf中的配置。

  2. 修改postgresql.conf导致服务崩溃

       遇到这种情况,可以通过查看位于PostgreSQl数据目录(/mydata/pgdata)下的日志文件来查找故障原因。

3.2 PostgreSQL访问配置 - pg_hba.conf

   pg_hba.conf文件指定了允许哪些用户以何种方式连接到PostgreSQL数据库,对于这个文件的修改可以动态生效
   以IPv4的连接验证配置来说:

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

  • host:连接类型,可以设置为local(本地连接)、host(远程连接,hostssl或hostnossl)、hostssl(使用ssl加密的远程连接)、hostnossl(不使用ssl加密的远程连接);日常使用host配置即可。
  • 第一个all:数据库,可以设置为all(全部数据库)、sameuser(和登陆用户同名的数据库)、samerole(暂时还不知道是干啥的)、replication(replication connections,貌似是用于主从复制的)、一个数据库名、一个用逗号分隔的列表;
  • 第二个all:用户名,可以设置为all(任何用户)、一个用户名、+用户组(用+开头的用户组名)、一个用逗号分隔的列表、@文件(用@开头的文件,文件内容是用户名);
  • 127.0.0.1/32:允许连接的主机IP/掩码
  • trust:身份验证模式,可以设置为ident(从pg_ident.conf中读取用户映射)、trust(最不安全的免密登陆)、md5(还不知道该咋用呢)、password(明文密码);

3.3 PostgreSQL用户映射配置 - pg_ident.conf

   如果在身份验证模式时,配置为ident方式,则当用户连接时,系统会尝试访问pg_ident.conf,如果该文件存在,则系统会基于文件内容将当前执行登陆的操作系统用户映射为一个PostgreSQL的内部用户身份来登陆。

查看当前登陆用户:

postgres=# select user;
   user   
----------
 postgres
(1 row)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容