出了使用apt包管理器安装PostgreSQL之外,我们还可以自己手工编译源代码来安装。虽然自己编译,比较复杂,但我们却可以使用最新的版本。
本文记录使用源码编译的方法,安装PostgreSQL的过程。
编译安装
**0x00:**创建用户和用户组
1
2
3
4
5
6
7
8
9
| # 创建用户组
$ sudo groupadd postgres
# 创建postgre用户,所属组为postgre
$ sudo useradd -s /bin/bash -m -g postgres postgres
$ sudo chmod 0755 /home/postgres
# 切换到postgre用户
$ sudo su - postgres
|
**0x01:**下载源代码
PostgreSQL源代码下载页面:
https://www.postgresql.org/ftp/source
我们选择安装当前最新版本v16.1,在服务器上使用下面的命令下载和解压。
1
2
3
| $ wget https://ftp.postgresql.org/pub/source/v16.1/postgresql-16.1.tar.gz
$
$ tar -zxvf postgresql-16.1.tar.gz
|
**0x02:**安装依赖库
1
2
3
4
5
6
7
8
9
10
| sudo apt install libssl-dev
sudo apt install libreadline-dev
sudo apt install libldap2-dev
sudo apt install libkrb5-dev
sudo apt install zlib1g-dev
sudo apt install libicu-dev
sudo apt install libpam-dev
sudo apt install libsystemd-dev
sudo apt install bison
sudo apt install flex
|
**0x03:**配置
使用如下命令配置编译选项:
1
2
3
| $ cd postgresql-16.1
$
$ ./configure --prefix=/home/postgres/apps/postgresql-16.1 --with-openssl --with-gssapi --with-ldap --with-systemd --with-pam
|
配置成功之后,会在当前目录下生成我们需要的 Makefile 文件,如下图所示:

**0x04:**编译
使用如下命令执行编译:
编译完成,没有错误,如下图所示:

**0x05:**安装
使用如下命令进行安装:
安装完毕之后,由于前面configure时,我们指定安装到 /home/postgres/apps/postgresql-16.1 ,所以到该目录看下安装文件情况:

为了方便以后的版本升级,我们做个软连接:
1
| $ ln -sfn postgresql-16.1 postgresql
|
**0x06:**将PostgreSQL可执行程序目录加入PATH环境变量
修改 /etc/profile ,加入如下内容:
1
2
3
| export PG_HOME=/home/postgre/apps/postgresql
export PATH=$PG_HOME/bin:$PATH
|
至此,我们已经成功编译PostgreSQL,并将其安装到我们指定的目录。下面我开始初始化数据库,并做一些简单的使用操作。
初始化数据库
1
| $ initdb -D /data/postgresql/data/16.1/main
|
初始化数据库过程如下图所示:

初始化数据库完成之后,我们看下数据目录的结构:

考虑到后续我们会修改配置,防止误操作数据,我们将配置文件移动到专门的配置文件目录中去:
1
| $ mv *.conf /data/postgresql/conf/16.1/main
|
修改配置文件
我们简单修改下 /data/postgresql/conf/16.1/main/postgresql.conf 文件(
修改后的文件,可点击下载
),区别如下图所示:

启动PostgreSQL数据库
使用如下命令启动数据库:
1
| $ postgres -D /data/postgresql/data/16.1/main -c config_file=/data/postgresql/conf/16.1/main/postgresql.conf
|
启动后如下图所示:

我们使用 psql 登录服务器服务器,如下图登录:

或者通过5432端口,通过网络登录服务器,如下图登录:

至此,我们已经成功启动PostgreSQL数据,并能够登录服务器。下面介绍下PostgreSQL的简单使用方法。
使用PostgreSQL数据库
使用1:创建PostgreSQL数据库用户
我们使用如下命令,创建一个数据库用户:user_mancode;登录密码为:123456;对应数据库为:db_mancode。
1
2
3
4
5
| CREATE USER user_mancode WITH PASSWORD '123456';
CREATE DATABASE db_mancode OWNER user_mancode;
GRANT ALL PRIVILEGES ON DATABASE db_mancode TO user_mancode;
|
创建过程如下图所示:

然后我们通过网络端口5432,使用 user_mancode 来登录服务器。
1
| psql -U user_mancode -d db_mancode -h 127.0.0.1 -p 5432
|

我们使用新创建的 user_mancode 数据库可以成功登录服务器。
使用2:远程登录数据库服务器
上节我们使用psql -U user_mancode -d db_mancode -h 127.0.0.1 -p 5432登录数据库时,发现没有?没有要求我们输入密码。怎么回事?
简单来说,其实在pg_hpa.conf配置文件中,指定了来自127.0.0.1的登录是可信的,不需要密码进行登录。
配置文件是这样的:

我们知道数据库服务启动在192.168.0.62:5432端口上,假如我们使用 psql -U user_mancode -d db_mancode -h 192.168.0.62 -p 5432 是不是也能正确登录?我们试下:

可见,登录失败,提示我们错误:
psql: error: connection to server at “192.168.0.62”, port 5432 failed: FATAL: no pg_hba.conf entry for host “192.168.0.62”, user “user_mancode”, database “db_mancode”, no encryption
解决方法是,在pg_hpa.conf文件中加入登录项,如下图所示:

重启服务器,我们再次使用 psql -U user_mancode -d db_mancode -h 192.168.0.62 -p 5432 ,登录时会要求我们输入密码,然后输入创建用户时设置的密码 123456 ,就可以正常登录服务器了。

使用3:简单SQL操作示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 创建新表
CREATE TABLE t_map (name VARCHAR(20), level VARCHAR(20));
# 查看新表
SELECT * FROM pg_tables WHERE schemaname='public';
# 新表结构
\d t_map;
# 插入数据
INSERT INTO t_map(name, level) VALUES('user_a', 'level_10');
INSERT INTO t_map(name, level) VALUES('user_b', 'level_12');
INSERT INTO t_map(name, level) VALUES('user_c', 'level_17');
# 查询数据
SELECT * FROM t_map;
|
执行过程如下图所示:

数据库启停方法
方法一:如上文一样,使用 postgres 直接启动服务,停止Ctrl+C即可。
1
2
| ## 启动数据库服务
$ postgres -D /data/postgresql/data/16.1/main -c config_file=/data/postgresql/conf/16.1/main/postgresql.conf
|
启停情况如下图所示:

方法二:使用 pg_ctl 命令启停服务。
1
2
3
4
5
| ## 启动数据库服务
$ pg_ctl -D /data/postgresql/data/16.1/main -l logfile -o '-c config_file=/data/postgresql/conf/16.1/main/postgresql.conf' start
## 停止数据库服务
$ pg_ctl -D /data/postgresql/data/16.1/main -l logfile -o '-c config_file=/data/postgresql/conf/16.1/main/postgresql.conf' stop
|
启停情况如下图所示:

方法三:通过systemd启停服务。
创建systemd的Unit文件:
/lib/systemd/system/postgresql.service
,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| [Unit]
Description=Postgresql
Before=shutdown.target
[Service]
User=postgres
Type=forking
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/home/postgres/apps/postgresql/bin/pg_ctl -D /data/postgresql/data/16.1/main -l /tmp/logfile -o '-c config_file=/data/postgresql/conf/16.1/main/postgresql.conf' start
ExecStop=/home/postgres/apps/postgresql/bin/pg_ctl -D /data/postgresql/data/16.1/main -l /tmp/logfile -o '-c config_file=/data/postgresql/conf/16.1/main/postgresql.conf' stop
PIDFile=/data/postgresql/main-16.1.pid
LimitNOFILE = 65535
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false
[Install]
WantedBy=multi-user.target
|
随机启动生效命令:
1
| $ sudo systemctl enable postgresql
|
使用systemctl启动服务命令:
1
| $ sudo systemctl start postgresql
|
使用systemctl停止服务命令:
1
| $ sudo systemctl start postgresql
|
使用systemctl查看服务状态:
1
| $ sudo systemctl status postgresql
|
