0%
PostgreSQL分析#003#编译安装指南

出了使用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:编译

使用如下命令执行编译:

1
$ make

编译完成,没有错误,如下图所示:

0x05:安装

使用如下命令进行安装:

1
$ make install

安装完毕之后,由于前面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

  • -D 参数指定postgresql的数据文件路径

初始化数据库过程如下图所示:

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

考虑到后续我们会修改配置,防止误操作数据,我们将配置文件移动到专门的配置文件目录中去:

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