01:PostgreSQL安装

本文档提供了两种在CentOS 7上安装PostgreSQL的方法:二进制安装和源代码安装。二进制安装简单快捷但存在限制,而源代码安装则更加灵活。文中详细阐述了每种安装方法的步骤,包括环境规划、用户和目录配置、数据库初始化,以及服务管理和配置。推荐使用源代码方式进行安装以获取更好的定制性和离线安装体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境规划:

  • 操作系统:CentOS 7.9 64bit
  • PostgreSQL 版本:16.x 或 15.x
  • 安装用户:postgres
  • 软件安装目标路径:/usr/pgsql-<version>
  • 数据库数据目录:/pgdata

目录

(不推荐)二进制方式安装PostgreSQL软件

(推荐)源代码方式安装PostgreSQL软件

配置数据库


(不推荐)二进制方式安装PostgreSQL软件

   二进制安装方式为:PostgreSQL官方根据不同的Linux发行版本已经制作好对应的安装包,无需从源码编译。比较简单快捷,但对用户、目录、安装的组件等存在一定限制,不能按需安装。

   不同的发行版本安装方式略有不同,参见:https://www.postgresql.org/download/

   以RedHat/CentOS 7为例,官方安装步骤如下(需联网):

而二进制安装存在以下不足:

  • 二进制安装方式,安装的目标目录默认为/usr/pgsql-<version>目录,难以改变或指定。
  • 二进制安装方式,安装过程中自动创建的postgres用户的主目录不是/home。可能与环境部署规范要求冲突,不统一。
  • 官方提供的步骤存在误导。对于二进制安装方式,某个操作系统发现版本只有指定的PostgreSQL版本,不是所有版本都有。例如,按如上官方说明步骤,在RedHat/CentOS 7上安装PostgreSQL 16,会报“No package postgresql16-server available”。因为官方的二进制版本对RedHat/CentOS 7最高只提供PostgreSQL 15,没有提供PostgreSQL 16版本。
  • 官方步骤中使用的postgresql-<version>-setup脚本比较死,不能改变初始化数据库目录,因此不建议使用。建议使用标准的、可灵活定制的initdb脚本

因此,对以官方二进制步骤进行优化调整并增加注释如下。

1、安装PostgreSQL。需以可sudo的普通用户执行或者root用户执行(需要联网):

#增加yum的repository源
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

#自动从源下载,对RedHat/CentOS 7最高只提供PostgreSQL 15,没有提供PostgreSQL 16版本
#若报缺少依赖libzstd,则从CentOS安装盘或者网络查找对应rpm进行安装(例如:libzstd-1.5.5-1.el7.x86_64.rpm)
#会将PostgreSQL软件安装至/usr/pgsql-<version>目录,同时自动创建操作系统用户postgres
sudo yum install -y postgresql15-server

#以下均在此处均不执行
#由于postgresql-<version>-setup脚本比较死,不能改变初始化数据库目录,因此不建议使用。
#改为使用标准的可灵活定制的initdb脚本,并修改systemctl所用的脚步
#sudo /usr/pgsql-16/bin/postgresql-15-setup initdb
#sudo systemctl enable postgresql-15
#sudo systemctl start postgresql-15

2、对自动创建操作系统用户postgres修改密码(注意:二进制安装过程中自动创建的postgres用户的主目录不是/home)。以root用户执行:

passwd postgres
#按提示设置用户新口令

 3、创建数据库数据存放目录并授权。以root用户执行:

mkdir -p /pgdata
chown -R postgres:postgres /pgdata

4、以postgres用户,配置环境变量。编辑~/.bash_profile,增加以下两行配置环境变量:

export PATH=/usr/pgsql-15/bin:$PATH
export LD_LIBRARY_PATH=/usr/pgsql-15/lib:$LD_LIBRARY_PATH

配置~/.bash_profile后,需执行source ~/.bash_profile或者重新登录方可生效

除postgres用户外,该服务器上其他需要使用postgreSQL软件(如psql客户端)的用户,也应该配置以上环境变量(或者在/etc/profile中统一设置)。

5、以postgres用户,指定数据库数据目录,初始化数据库

#设置环境变量(可以纳入至.bash_profile文件中,避免每次设置)
export PGDATA=/pgdata

#初始化数据库(开启checksums更可靠,适合生产环境)
initdb --data-checksums -D $PGDATA

初始化过程最后会输出“Success”。

初始化后在/pgdata目录生成的内容如下:

 6、在二进制安装过程中会自动创建/usr/lib/systemd/system/postgresql-<version>.service文件。由于前步初始化数据库所用目录PGDATA=/pgdata,因此需要以root用户对该service文件修改PGDATA的值。修改后如下:

# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades.  It is recommended to use systemd
# "dropin" feature;  i.e. create file with suffix .conf under
# /etc/systemd/system/postgresql-15.service.d directory overriding the
# unit's defaults. You can also use "systemctl edit postgresql-15"
# Look at systemd.unit(5) manual page for more info.

# 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-15-setup.
[Unit]
Description=PostgreSQL 15 database server
Documentation=https://www.postgresql.org/docs/15/static/
After=syslog.target
After=network-online.target

[Service]
Type=notify

User=postgres
Group=postgres

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

# Location of database directory
Environment=PGDATA=/pgdata

# 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

ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT

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

# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=0

TimeoutStopSec=1h

[Install]
WantedBy=multi-user.target

  7、纳入操作系统的服务管理(包括随操作系统启动而自启动)。需以可sudo的普通用户执行或者root用户执行:

#纳入操作系统的服务管理(包括随操作系统启动而自启动)
#本质上是在目录/etc/systemd/system/multi-user.target.wants/下创建一个连接,指向 /usr/lib/systemd/system/postgresql-<version>.service
sudo systemctl enable postgresql-15

#以操作系统服务管理的方式启动
sudo systemctl start postgresql-15

#查看状态
systemctl status postgresql-15

或者也可通过pg_ctl方式启动、停止(见后)。

(推荐)源代码方式安装PostgreSQL软件

源码方式虽略微复杂,但具有离线安装更方便,按需定制更灵活、过程更透明等优点。更推荐采用源代码方式安装。

1、以root用户,前置检查:

make --version       # 版本需要大于等于3.8

rpm -aq | grep zlib     # 需已安装zlib-devel(可通过yum install -y zlib-devel安装)。

rpm -aq | grep readline     # 需已安装readline-devel(可通过yum install -y readline-devel安装)。

rpm -aq | grep icu     # 对于postgresSQL 16需已安装icu-devel(可通过yum install -y libicu-devel安装)

注意:由于是源代码编译,以上需要的相关软件的devel版本(名字中需带devel或dev)

2、以root用户,创建用户和属主:

groupadd postgres
useradd -g postgres postgres
passwd postgres 
#按提示设置用户新口令


#若需要,可把postgres用户纳入sudo组中。其中wheel为sudo组名(可通过visudo命令查看确认)
usermod -aG wheel postgres

3、以root用户,创建软件安装目录、创建数据库数据存放目录并授权:

mkdir -p /usr/pgsql-16
chown -R postgres:postgres /usr/pgsql-16

mkdir -p /pgdata
chown -R postgres:postgres /pgdata

4、选择需要下载的源代码:

 5、以postgres用户,下载并源代码方式安装:

wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz
tar -xvf postgresql-16.3.tar.gz
cd postgresql-16.3


# 其中--prefix为安装目标目录,默认为/usr/local/pgsql
./configure --prefix=/usr/pgsql-16
make
make install

其中configure的各种选项可以参阅:https://www.postgresql.org/docs/current/install-make.html#CONFIGURE-OPTIONS

 6、以postgres用户,配置环境变量。编辑~/.bash_profile,增加以下两行配置环境变量:

export PATH=/usr/pgsql-16/bin:$PATH
export LD_LIBRARY_PATH=/usr/pgsql-16/lib:$LD_LIBRARY_PATH

配置~/.bash_profile后,需执行source ~/.bash_profile或者重新登录方可生效

除postgres用户外,该服务器上其他需要使用postgreSQL软件(如psql客户端)的用户,也应该配置以上环境变量(或者在/etc/profile中统一设置)。

7、以postgres用户,指定数据库数据目录,初始化数据库

#设置环境变量(可以纳入至.bash_profile文件中,避免每次设置)
export PGDATA=/pgdata

#初始化数据库(开启checksums更可靠,适合生产环境)
initdb --data-checksums -D $PGDATA

初始化过程最后会输出“Success”。

初始化后在/pgdata目录生成的内容如下:

 6、为了纳入操作系统的服务管理(包括随操作系统启动而自启动)。以root用户,手工创建/usr/lib/systemd/system/postgresql-16.service文件。并增加如下内容(内容参阅二进制安装生成的内容并进行修改):

[Unit]
Description=PostgreSQL 16 database server
Documentation=https://www.postgresql.org/docs/16/static/
After=syslog.target
After=network-online.target

[Service]
Type=forking

User=postgres
Group=postgres


# Location of database directory
Environment=PGDATA=/pgdata

# 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/pgsql-16/bin/pg_ctl start -D ${PGDATA}
ExecStop=/usr/pgsql-16/bin/pg_ctl stop -D ${PGDATA}
ExecReload=/usr/pgsql-16/bin/pg_ctl reload -D ${PGDATA}


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

# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=60


[Install]
WantedBy=multi-user.target

  7、纳入操作系统的服务管理(包括随操作系统启动而自启动)。需以可sudo的普通用户执行或者root用户执行:

#纳入操作系统的服务管理(包括随操作系统启动而自启动)
#本质上是在目录/etc/systemd/system/multi-user.target.wants/下创建一个连接,指向 /usr/lib/systemd/system/postgresql-<version>.service
sudo systemctl enable postgresql-16

#以操作系统服务管理的方式启动
sudo systemctl start postgresql-16

#查看状态
systemctl status postgresql-16

或者也可通过手工pg_ctl方式启动、停止(见后)。

配置数据库

 1、postgresql.conf文件是PG服务端的主配置文件。以postgres用户,修改/pgdata/postgresql.conf文件(取消注释,并修改内容如下),使其监听本地所有网卡

 2、postgresql.conf文件是PG服务端的主配置文件。以postgres用户,修改/pgdata/postgresql.conf文件,设置开启日志收集、每天一个新日志文件、单个日志文件不限制大小:

 3、pg_hba.conf文件是基于主机的客户端认证配置文件。以postgres用户,修改/pgdata/pg_hba.conf文件,对“IPv4 local connections”下面的ADDRESS配置修改如下,不仅本机可访问,还允许跨网络访问。

4、以postgres用户,通过pg_ctl方式启动、停止数据库:

#设置环境变量
export PGDATA=/pgdata

pg_ctl start -D $PGDATA

#另:若需停止则可:
pg_ctl stop -D $PGDATA [-m SHUTDOWN-MODE]
#  SHUTDOWN-MODE: 有smart、fast、immediate三种选项(通常默认是fast即可)。

5、以postgres用户,执行以下psql命令登录数据库(这里是根据pg_hba.conf的配置以local本地进程通信方式进行认证,所以无需密码)。登录成功后查看包含的数据库(逻辑数据库)应该有三个:

 6、也可以在其他机器上,通过客户端远程登录:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值