[toc]

喜大普奔,在 PostgreSQL 发布 PostgreSQL 16.4, 15.8, 14.13, 13.16, 12.20, and 17 Beta 3 Released! 之际,我来开始学习下 PostgreSQL,首先体验它的安装,之前也有安装过,但是没有全面的记录下,今天详细体验下他的安装。同时也是本站首次新增了PostgreSQL 的分类,新技能又增加了。

本次安装是 arm 架构的 Linux

1
Linux ydora01 5.15.0-206.153.7.el8uek.aarch64 #2 SMP Thu May 9 16:18:54 PDT 2024 aarch64 aarch64 aarch64 GNU/Linux

操作系统:

Red Hat Enterprise Linux release 8.10 (Ootpa)

源代码编译 PostgreSQL 安装

前提条件

https://www.postgresql.org/docs/current/install-requirements.html

依赖以下几个软件包

tarmake/gmakegccreadlinezliblibicu,其中 make 需要 3.81 及以上版本,其他通常系统自带的即可,make 的版本系统自带的也满足要求,但是安装文档上有明确要求make的版本,其他依赖包没有要求具体的版本,当然也可以不需要 readlinezliblibicu等,编译的时候增加 --without-readline--without-zlib--without-icu 即可。

在这里建议默认的都启用。下面检查下Red Hat Enterprise Linux release 8.10 (Ootpa) 自带的 make的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@ydora01 pg]# make -version
GNU Make 4.2.1
Built for aarch64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@ydora01 pg]# gmake -version
GNU Make 4.2.1
Built for aarch64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@ydora01 pg]# which gmake
/usr/bin/gmake
[root@ydora01 pg]# ll /usr/bin/gmake
lrwxrwxrwx. 1 root root 4 Mar 31 2022 /usr/bin/gmake -> make

可以看到gmake 软连接到 make,也就是gmake 等同于make,在看其他安装文档的时候,有的是make、有的是gmake,知道了 gmake是软链到make就很好理解了。

其他依赖包没有安装的话,直接通过yum 来安装即可。

获取源代码安装包

官方网站 https://www.postgresql.org –>Download–>Source 选择对应的版本,本次安装的版本是 16.4。

image-20240810074427098

这里选择 postgresql-16.4.tar.gz,也可以根据个人喜好选择postgresql-16.4.tar.bz2,下载之后,可以对照相应的md5/sha256,确认安装介质下载的完整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ydora01 pg]# wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz
--2024-08-10 07:47:09-- https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz
Resolving ftp.postgresql.org (ftp.postgresql.org)... 147.75.85.69, 217.196.149.55, 72.32.157.246, ...
Connecting to ftp.postgresql.org (ftp.postgresql.org)|147.75.85.69|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 32660355 (31M) [application/octet-stream]
Saving to: ‘postgresql-16.4.tar.gz’

postgresql-16.4.tar.gz 100%[===========================================================================>] 31.15M 6.68MB/s in 4.7s

2024-08-10 07:47:14 (6.68 MB/s) - ‘postgresql-16.4.tar.gz’ saved [32660355/32660355]

[root@ydora01 pg]# md5sum postgresql-16.4.tar.gz
6849302e68ba1984cee67cd6eab2b930 postgresql-16.4.tar.gz

创建用户

1
2
3
groupadd postgres
useradd -g postgres postgres
passwd postgres

说明:/data/pg 的权限都给 postgres:postgres

规划目录

名称 目录 备注
pg 专有目录 /data/pg/ chown -R postgres:postgres
源代码安装包目录 /data/pg/postgresql-16.4.tar.gz wget 获取
源代码目录 /data/pg/postgresql-16.4 解压源代码安装包产生
软件安装目录 /data/pg/pg164 可以不用手动创建,在make install
会自动生成。
数据目录 /data/pg/pg164/data 可以不用手动创建,如果创建了,必须
保障其为空
log 目录 /data/pg/pg164/log

解压源代码软件包

1
2
cd /data/pg/
tar -zxvf postgresql-16.4.tar.gz
1
2
3
[root@ydora01 pg]# ll
drwxrwxrwx. 6 postgres postgres 4096 Aug 6 04:18 postgresql-16.4
-rw-r--r--. 1 root root 32660355 Aug 6 04:19 postgresql-16.4.tar.gz

执行 configure

执行configure的命令行选项,–prefix参数,表示把PostgreSQL安装在哪个路径下,这里,我们就把它安装在前面规划目录中配置的/data/pg/pg164路径下。默认情况下,不带该参数时,则会安装在/usr/local/pgsql路径下。

1
2
cd /data/pg/postgresql-16.4
./configure --prefix=/data/pg/pg164

注意:执行 configure的需要在源码解压出来的路径下,即 cd /data/pg/postgresql-16.4

configure: creating ./config.status
config.status: creating GNUmakefile
config.status: creating src/Makefile.global
config.status: creating src/include/pg_config.h
config.status: creating src/include/pg_config_ext.h
config.status: creating src/interfaces/ecpg/include/ecpg_config.h
config.status: linking src/backend/port/tas/dummy.s to src/backend/port/tas.s
config.status: linking src/backend/port/posix_sema.c to src/backend/port/pg_sema.c
config.status: linking src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port

执行 make world

这里,也可以简单执行make就可以build安装文件的,但是,make world的是指把 PostgreSQL 相关的文档,HTML,以及其它的一些模块都会一起编译进去。如果当初没有执行make work,后来可以进到当时安装的那个源文件路径下即本次的安装的目录/data/pg/postgresql-16.4 ,重新执行make world,然后make install-world 即可。本次体验使用 make world,也建议日常使用的时候之际使用 make world 或者gmake world,前面讲过gmakemake是等价的。

时间略长,完成之后如下:

make[2]: Leaving directory ‘/data/pg/postgresql-16.4/contrib/vacuumlo’
make[1]: Leaving directory ‘/data/pg/postgresql-16.4/contrib’

执行 make install-world

make[2]: Leaving directory ‘/data/pg/postgresql-16.4/contrib/unaccent’
make -C vacuumlo install
make[2]: Entering directory ‘/data/pg/postgresql-16.4/contrib/vacuumlo’
/usr/bin/mkdir -p ‘/data/pg/pg164/bin’
/usr/bin/install -c vacuumlo ‘/data/pg/pg164/bin’
make[2]: Leaving directory ‘/data/pg/postgresql-16.4/contrib/vacuumlo’
make[1]: Leaving directory ‘/data/pg/postgresql-16.4/contrib’

完成之后,会自动产生/data/pg/pg164/目录

1
2
3
4
5
6
7
8
9
10
[postgres@ydora01 pg]$ cd /data/pg/pg164/
[postgres@ydora01 pg164]$ ll
total 12
drwxrwxr-x. 2 postgres postgres 4096 Aug 10 17:34 bin
drwxrwxr-x. 4 postgres postgres 4096 Aug 10 17:34 include
drwxrwxr-x. 4 postgres postgres 4096 Aug 10 17:34 lib
drwxrwxr-x. 5 postgres postgres 46 Aug 10 17:34 share
[opc@ydora01 pg164]$ pwd
/data/pg/pg164
[opc@ydora01 pg164]$

初始化数据库

/data/pg/pg164/bin/initdb -D /data/pg/pg164/data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[postgres@ydora01 postgresql-16.4]$ /data/pg/pg164/bin/initdb -D /data/pg/pg164/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /data/pg/pg164/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

/data/pg/pg164/bin/pg_ctl -D /data/pg/pg164/data -l logfile start

[postgres@ydora01 postgresql-16.4]$

启动数据库

可以看到在上一步的初始化之后的输出信息有显示:

Success. You can now start the database server using:

/data/pg/pg164/bin/pg_ctl -D /data/pg/pg164/data -l logfile start

可以通过 /data/pg/pg164/bin/pg_ctl -D /data/pg/pg164/data -l logfile start 来启动数据库。

其中 -l logfile 是指定日志文件,咱们这里规范一点,将日志文件设置为 /data/pg/pg164/log/postgres.log

所以用以下命令启动:

1
/data/pg/pg164/bin/pg_ctl -D /data/pg/pg164/data -l /data/pg/pg164/log/postgres.log start
1
2
3
4
5
6
7
8
9
10
[postgres@ydora01 log]$ /data/pg/pg164/bin/pg_ctl -D /data/pg/pg164/data -l /data/pg/pg164/log/postgres.log start
waiting for server to start.... done
server started
[postgres@ydora01 log]$ cat /data/pg/pg164/log/postgres.log
2024-08-10 17:47:39.345 CST [1604428] LOG: starting PostgreSQL 16.4 on aarch64-unknown-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22.0.1), 64-bit
2024-08-10 17:47:39.346 CST [1604428] LOG: listening on IPv6 address "::1", port 5432
2024-08-10 17:47:39.346 CST [1604428] LOG: listening on IPv4 address "127.0.0.1", port 5432
2024-08-10 17:47:39.349 CST [1604428] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2024-08-10 17:47:39.354 CST [1604431] LOG: database system was shut down at 2024-08-10 17:40:34 CST
2024-08-10 17:47:39.358 CST [1604428] LOG: database system is ready to accept connections

检查数据库进程

1
2
3
4
5
6
postgres 1604428       1  0 17:47 ?        00:00:00 /data/pg/pg164/bin/postgres -D /data/pg/pg164/data
postgres 1604429 1604428 0 17:47 ? 00:00:00 postgres: checkpointer
postgres 1604430 1604428 0 17:47 ? 00:00:00 postgres: background writer
postgres 1604432 1604428 0 17:47 ? 00:00:00 postgres: walwriter
postgres 1604433 1604428 0 17:47 ? 00:00:00 postgres: autovacuum launcher
postgres 1604434 1604428 0 17:47 ? 00:00:00 postgres: logical replication launcher

连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[postgres@ydora01 log]$ /data/pg/pg164/bin/psql
psql (16.4)
Type "help" for help.

postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | ICU Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------
postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |
template0 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3 rows)

设置环境变量

修改环境变量的原因是,我们要将 PostgreSQL 数据库的可执行程序如:psql,pg_ctl,pg_dump,pg_restore,等加入到当前用户的环境变量 PATH,这样,以后我们就可以直接执行这些命令,而不再需要通过调用绝对路径,像上面连接数据库的时候,执行/data/pg/pg164/bin/psql,或者启动数据库调用/data/pg/pg164/bin/pg_ctl命令,写的完整的命令目录,这样显得有点臃长。

另外,我们需要配置一个PGDATA的环境变量,该变量用于指定数据库集群(CLUSTER)的路径,他这个集群跟 ORACLE 集群是不一样的,PG 是单机的,整个PG 实例就是一个CLUSTER,这个 PGDATA 指向的就是 数据目录 /data/pg/pg164/data,就是在初始化数据库的时候自动创建的。

1
2
3
4
PATH=$PATH:/data/pg/pg164/bin
export PATH
PGDATA=/data/pg/pg164/data
export PGDATA
1
2
3
4
5
6
7
8
9
10
11
[postgres@ydora01 ~]$ PATH=$PATH:/data/pg/pg164/bin
[postgres@ydora01 ~]$ export PATH
[postgres@ydora01 ~]$ PGDATA=/data/pg/pg164/data
[postgres@ydora01 ~]$ export PGDATA
[postgres@ydora01 ~]$ psql
psql (16.4)
Type "help" for help.

postgres=# \q
[postgres@ydora01 ~]$ which psql
/data/pg/pg164/bin/psql

这样的话,我们使用 psql 客户端,直接输入 psql 即可。

为了方便:我们把环境变量写入.bash_profile

1
2
3
4
5
6
7
8
9
10
11
12
13
[postgres@ydora01 ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:/data/pg/pg164/bin
export PATH
PGDATA=/data/pg/pg164/data
export PGDATA

执行 . .bash_profile 或者 source .bash_profile 生效的。

修改数据库参数

原文作者: liups.com

原文链接: http://liups.com/posts/9b1904ec/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议