在安装前,确保云服务器安全组放开5432端口。我的云服务器系统为Ubuntu server 64bit,参考如下网址分享的教程进行PostgreSQL与PostGIS的安装。
https://www.cnblogs.com/echohye/p/18005445
https://zhuanlan.zhihu.com/p/467644334
https://cn.linux-console.net/?p=22460
https://www.cnblogs.com/echohye/p/18005059
https://developer.baidu.com/article/details/3269917
https://blog.csdn.net/ReBeX/article/details/120558199
https://support.huaweicloud.com/bestpractice-hce/hce_bp_0005.html
主要参考第一个链接进行的安装与配置。但是我在安装完才知道,华为Flexus云服务Ubuntu系统默认安装了最新的PG17.2版本,所以无需安装PostgreSQL,直接使用即可。
(1)安装PostgreSQL
第1步:添加PostgreSQL APT仓库,以下代码会将PostgreSQL的APT仓库添加到你的系统中,$(lsb_release -cs)
会自动获取当前Ubuntu版本的代号(例如focal
、bionic
等),并将其用于APT仓库的配置。
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
第2步:导入APT仓库的签名密钥,会下载并导入PostgreSQL仓库的签名密钥,以便APT可以验证从该仓库下载的软件包的签名。
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
第3步:更新APT软件包索引,更新APT的软件包索引,确保APT知道新添加的仓库中的软件包信息。
sudo apt update
第4步:安装特定版本的PostgreSQL,下面安装了PG 14,如果安装其他版本,将软件包名称中的版本号更改为你需要的版本即可。
sudo apt install postgresql-14
这个过程中需要回复Y
,并且需要一点时间下载安装。
第5步:启动PostgreSQL服务。安装完成后,PostgreSQL 服务应该会自动启动。如果服务未启动,使用以下命令手动启动它,代码中sudo
表示以root权限执行命令,因为启动系统服务通常需要管理员权限;systemctl
是用于管理系统服务的命令行工具,常用于启动、停止、重启和查看系统服务的状态等操作;start
指定要执行启动服务的操作;postgresql@14-main:
指定要启动的服务名称,表示PostgreSQL 14版本的主服务实例,其中 @
符号后面的14-main
是服务实例的名称,14
表示PostgreSQL的版本号,main
是服务实例的名称。如果安装的其他版本就需要做出相应的修改。
sudo systemctl start postgresql@14-main
启动服务后,使用如下命令检查服务的状态。
sudo systemctl status postgresql@14-main
状态查询结果如下所示,其中第一行包含了服务的名称和描述,这里是PostgreSQL 14版本的主集群服务。第二行表示服务加载成功,包含了服务的配置文件路径,其中的enabled-runtime
表示服务在当前会话中被启用,但可能没有在系统启动时自动启动,preset: enabled
表示服务被预设为在系统启动时自动启动。Active: active (running)
表示服务当前处于活动状态并且正在运行。其他的信息包括服务的进程ID、当前几个进程与该服务有关、占用的内存与CPU、服务所属的cgroup路径等。
(2)安装PostGIS
使用以下命令在Ubuntu系统中安装与PostgreSQL 14兼容的PostGIS版本,这一步同样需要一点时间来下载和安装。
sudo apt install postgis postgresql-14-postgis-3
(3)创建数据库并启用PostGIS
第1步:使用如下代码以PostgreSQL的默认数据库用户postgres
的身份启动PostgreSQL的命令行界面。在大多数Linux系统中,postgres
用户通常没有登录权限,因此需要使用sudo
来切换到该用户;-u postgres
指定要切换到postgres
用户;psql
是PostgreSQL的命令行工具,用于与PostgreSQL数据库进行交互,执行SQL命令、管理数据库等操作。如果已经在 Ubuntu 添加环境变量,可以直接使用psql。
sudo -u postgres psql
执行上面的代码后,会进入psql
的交互式命令行界面,提示符通常会显示为postgres=#
,表示你已经以postgres
用户登录到了PostgreSQL数据库中。
第2步:创建数据库,使用如下代码在 PostgreSQL 命令行中创建一个数据库,名为postgis_test
,其中CREATE DATABASE是SQL标准命令,用于创建数据库。此外,在SQL语句中,分号(;
)通常用于表示语句的结束。在大多数情况下,分号是必要的,因此代码中的分号别忘记。
CREATE DATABASE postgis_test;
若需修改postgres用户密码,在进入数据库后,执行以下命令,二次确认密码后即可。执行命令后,系统会提示你输入新的密码。出于安全考虑,输入的密码不会显示在屏幕上;输入新密码后,按回车键继续。
\password postgres
第3步:启用PostGIS。先进入刚才创建的数据库,\c
是psql
中的一个命令,用于切换当前连接的数据库。进入数据库后,系统提示:You are now connected to database “postgis_test” as user “postgres”。我没有仔细注意下面的截图,其实这里就表明系统中已经存在了自带的PG17.2版本。
\c postgis_test;
然后启用 PostGIS 扩展,代码如下所示,其中CREATE EXTENSION
命令用于在数据库中安装和启用一个扩展。
CREATE EXTENSION postgis;
此外,在这个链接:Ubuntu安装postgresql和postgis - 槑孒 - 博客园 中,还介绍到如果需要启用其他的地理空间扩展(如 topology、tiger_geocoder 等),可以进一步启用它们。
CREATE EXTENSION postgis_topology;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
最后退出PostgreSQL命令行。
\q
到此就已经在 Ubuntu 上成功安装了 PostgreSQL 和 PostGIS,并创建了一个具有 PostGIS 扩展的数据库。
(4)查看postgresql数据库和postgis版本
使用如下第一行命令查看 PostgreSQL 数据库的版本,会输出psql
的版本号以及相关的编译信息,这里显示了我的云服务器上编译psql
工具时使用的包版本信息,包括操作系统信息和包版本号。其中psql (PostgreSQL) 17.2
表示psql
工具的版本是17.2,Ubuntu 17.2-1.pgdg24.04+1
表示这个包是由PostgreSQL Global Development Group (PGDG) 提供的,并且是为Ubuntu 24.04版本编译的,是PostgreSQL 17.2的第一个版本包。但很奇怪的是,我这里一开始安装的是14版本,这里为什么显示最新的17.2版本了呢。
psql --version
输出结果:
psql (PostgreSQL) 17.2 (Ubuntu 17.2-1.pgdg24.04+1)
也可以使用如下代码不进入数据库,使用psql连接PostgreSQL数据库并且打印版本
sudo -u postgres psql -c "SELECT version();"
使用find
命令查找系统中所有版本的psql
:
find / -name 'psql'
结果如下所示,看到存在2个psql,苍天啊,这表明华为云服务器的Ubuntu默认安装了PG17,我前面根本没有必要安装PG14版本。
如果需要使用14版本的psql,可以通过添加路径来启动:
/usr/lib/postgresql/14/bin/psql
要检查要PG14是否安装了 PostGIS 扩展,并查看其版本,需要先连接到 PostgreSQL 数据库并执行以下 SQL 查询,代码如下所示:
先进入数据库
sudo -u postgres psql
\c postgis_test;
再看版本号
SELECT PostGIS_full_version();
结果如下所示,表示为PG14安装了PostGIS插件3.5.1版本。最后,以此点击键盘上的\q
退出当前的窗口。
(5)配置postgresql数据库ip连接
Ubuntu安装postgresql和postgis - 槑孒 - 博客园 https://www.cnblogs.com/echohye/p/18005445
一文中说到:刚安装的数据库,默认只有本机ip可以连接,如需要远程连接还需要配置ip地址;要设置 PostgreSQL 允许特定 IP 地址访问,需要编辑 PostgreSQL 的配置文件 postgresql.conf
和访问控制文件 pg_hba.conf
。我查询了一下,postgresql.conf
文件定义了PostgreSQL服务器的全局配置参数,pg_hba.conf
文件定义了客户端认证规则,决定了哪些用户可以从哪些主机连接到哪些数据库。
第一步修改postgresql.conf
文件,打开postgresql.conf
文件,找到listen_addresses
参数。默认情况下,它可能设置为localhost
或注释掉,修改为允许特定IP地址或所有IP地址。
# 先使用vim打开文件
sudo vim /etc/postgresql/14/main/postgresql.conf
# 使用/检索关键字
/listen_addresses
默认的为:#listen_addresses = 'localhost'
# 点击i进入输入模式,修改参数,删除原文中该句前面的#号
listen_addresses = 'IP地址' # 允许特定IP
# 或者
listen_addresses = '*' # 允许所有IP
# 修改后 :w保存 :q退出即可
重新启动 PostgreSQL 服务使更改生效。
sudo systemctl restart postgresql@14-main
第二步修改pg_hba.conf
文件,在文件中添加允许访问的规则。例如,如果要允许来自 IP 地址 192.168.1.100
的所有用户访问所有数据库,代码如下所示。其中,host
是规则的类型,表示这是一个主机认证规则;第一个all
表示允许连接到所有数据库,可以将其替换为特定的数据库名称;第二个all
表示允许所有用户连接;特定IP
是允许连接的IP地址范围;md5
表示使用MD5加密的密码进行认证。
# 打开文件
sudo vim /etc/postgresql/14/main/pg_hba.conf
# 修改规则,将#注释去掉
host all all 特定IP md5
# 或者允许来自任何 IP 地址的所有用户通过密码验证连接到所有数据库
host all all 0.0.0.0/0 md5
# 保存并关闭文件后,重新启动 PostgreSQL 服务使更改生效
sudo systemctl restart postgresql@14-main
# 最后,可有可无的一步:确保防火墙允许 PostgreSQL 的默认端口(5432)通过
sudo ufw allow 5432/tcp
最后,使用本地的psql测试远程连接,代码如下所示,其中:psql
是 PostgreSQL 的命令行工具,-U postgres
指定数据库的用户名,-h 云服务器的IP
指定数据库服务器的主机地址,-d 数据库
指定要连接的数据库名称,-W
用来强制 psql
在连接时提示输入密码(可选)。如截图所示,提示输入用户的口令,输入后能够远程连接,便表示设置没有问题了。
psql -U postgres -h 云服务器的IP -d 数据库 -W
(6)设置root用户可以直接 psql
(不推荐)
我们不想每次使用都先:sudo -u postgres psql
来启动SQL命令行,希望root用户能够直接登录PostgreSQL服务器,可以添加环境变量并创建一个root角色,以便打开云服务器后就直接使用 psql
。
首先,找到 psql
命令的路径。通常,它位于 /usr/bin/psql
,可以使用 which psql
命令来查询。或者安装包:apt install plocate
,使用locate psql
命令查询。然后,查询一下环境变量中是否已有/usr/bin/
,使用echo $PATH
打印,如果打印结果中有该路径,那么就不需要再添加环境变量。
如果没有该路径,需要将 /usr/bin
目录添加到 PATH
环境变量中。我的 psql
位于 /usr/bin/psql
,所以将 /usr/bin
添加到 PATH
中,这里包括为当前用户添加环境变量和为所有用户添加环境变量两种方式。第一种,给当前用户添加环境变量,先打开当前用户的 ~/.bashrc
文件:nano ~/.bashrc
;在文件末尾添加:export PATH="/usr/bin:$PATH"
;保存并关闭文件,然后运行以下命令使更改生效:source ~/.bashrc
。第二种,为所有用户添加了环境变量,打开 /etc/profile
文件:sudo nano /etc/profile
;在文件末尾添加:export PATH=“/usr/bin:$PATH”;然后使用ctrl+x
快捷键退出,会提示是否保存,输入y
保存,之后会提示是否要写入文件,使用回车键
写入;最后,然后运行以下命令使更改生效:source /etc/profile
。
如果希望root用户能够直接登录PostgreSQL服务器,还需要为root用户创建超级角色用户,执行如下代码:
sudo -u postgres psql
创建一个名为root的超级用户角色,可以不设置密码,则删除:PASSWORD 'your_password'
CREATE ROLE root WITH SUPERUSER LOGIN PASSWORD 'your_password';
创建一个名为root的数据库
REATE DATABASE root;
确保root角色可以访问和操作新创建的root数据库
GRANT ALL PRIVILEGES ON DATABASE root TO root;
最终,可以直接使用psql
命令,但是这样设置与系统用户相同的名称(root
)来创建数据库角色可能会引起混淆,所以不推荐。