debian安装postgis
This commit is contained in:
parent
2b93aa2488
commit
e6c377d8fe
@ -16,6 +16,7 @@ export default defineConfig({
|
|||||||
nav: [
|
nav: [
|
||||||
{ text: '首页', link: '/' },
|
{ text: '首页', link: '/' },
|
||||||
{ text: 'PHP', link: '/php/' },
|
{ text: 'PHP', link: '/php/' },
|
||||||
|
{ text: '数据库', link: '/database/' },
|
||||||
{ text: 'Docker', link: '/docker/' },
|
{ text: 'Docker', link: '/docker/' },
|
||||||
{ text: 'Go', link: '/go/' },
|
{ text: 'Go', link: '/go/' },
|
||||||
{ text: '前端', link: '/frontend/' },
|
{ text: '前端', link: '/frontend/' },
|
||||||
@ -23,6 +24,12 @@ export default defineConfig({
|
|||||||
],
|
],
|
||||||
sidebar: [
|
sidebar: [
|
||||||
{ text: '前言', link: '/start' },
|
{ text: '前言', link: '/start' },
|
||||||
|
{
|
||||||
|
text: '数据库',
|
||||||
|
items: [
|
||||||
|
{ text: '编译安装Postgres和PostGIS', link: '/database/postgis' }
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
text: 'Docker',
|
text: 'Docker',
|
||||||
items: [
|
items: [
|
||||||
|
3
docs/src/database/index.md
Normal file
3
docs/src/database/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 数据库下关技术
|
||||||
|
|
||||||
|
记录与数据及数据库相关的技术
|
301
docs/src/database/postgis.md
Normal file
301
docs/src/database/postgis.md
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
# 编译源码安装Postgresql和PostGIS(17.4和3.5.2)
|
||||||
|
|
||||||
|
> wandoubaba / 2025-04-23
|
||||||
|
|
||||||
|
## 介绍
|
||||||
|
|
||||||
|
Postgresql简称Postgres或者PG,是开源免费的关系型数据库,各方面指标都可以平替Mysql,甚至可以替代商业数据库产品。
|
||||||
|
|
||||||
|
PostGIS是PG的一个可以支持地理信息数据的扩展。
|
||||||
|
|
||||||
|
目前笔者刚开始学习GIS领域的知识,需要用到GIS数据库,由于对PG比较了解,所以就自然选择了PostGIS。
|
||||||
|
|
||||||
|
## 环境
|
||||||
|
|
||||||
|
学习任何技术都要先从环境开始,本来Docker已经很流行了,在hub.docker.com上也有PostGIS的官方镜像,但是为了学习,我决定先从编译安装开始,下面我将记录整个过程。
|
||||||
|
|
||||||
|
本指南的环境如下:
|
||||||
|
|
||||||
|
|环境项|版本|
|
||||||
|
|---|---|
|
||||||
|
|操作系统|Debian 12 Arm64|
|
||||||
|
|Postgres|17.4|
|
||||||
|
|PostGIS|3.5.2|
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
### 创建postgres用户和组
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo groupadd postgres
|
||||||
|
sudo useradd -g postgres -m postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
### 安装依赖
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo apt-get install -y \
|
||||||
|
bzip2 \
|
||||||
|
build-essential \
|
||||||
|
git wget curl \
|
||||||
|
libicu-dev \
|
||||||
|
pkg-config \
|
||||||
|
bison \
|
||||||
|
flex \
|
||||||
|
libreadline-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
libsystemd-dev \
|
||||||
|
libxml2-utils
|
||||||
|
```
|
||||||
|
|
||||||
|
### 下载源码
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -O https://ftp.postgresql.org/pub/source/v17.4/postgresql-17.4.tar.bz2
|
||||||
|
curl -O https://postgis.net/stuff/postgis-3.5.2.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### 编译安装Postgres
|
||||||
|
|
||||||
|
#### 编译
|
||||||
|
|
||||||
|
由于安装后我打算通过systemctl设置系统服务,所以加上`--with-systemd`参数
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tar jxvf postgresql-17.4.tar.bz2
|
||||||
|
cd postgresql-17.4
|
||||||
|
./configure --with-systemd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 构建并安装
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make all
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 配置环境
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo 'export PATH=/usr/local/pgsql/bin:$PATH' >> /etc/profile.d/postgres.sh
|
||||||
|
echo 'export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH' >> /etc/profile.d/postgres.sh
|
||||||
|
source /etc/profile.d/postgres.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
这里可以验证一下
|
||||||
|
|
||||||
|
```sh
|
||||||
|
psql --version
|
||||||
|
```
|
||||||
|
|
||||||
|
应该可以看到结果
|
||||||
|
|
||||||
|
```sh
|
||||||
|
psql (PostgreSQL) 17.4
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 初始化数据库
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo mkdir -p /usr/local/pgsql/data
|
||||||
|
sudo chown -R postgres:postgres /usr/local/pgsql/data
|
||||||
|
sudo su - postgres -c 'initdb -D /usr/local/pgsql/data'
|
||||||
|
```
|
||||||
|
|
||||||
|
最后一句执行后应该可以看到类似下面的结果
|
||||||
|
|
||||||
|
```sh
|
||||||
|
su: warning: cannot change directory to /home/postgres: No such file or directory
|
||||||
|
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 /usr/local/pgsql/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:
|
||||||
|
|
||||||
|
pg_ctl -D /usr/local/pgsql/data -l logfile start
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 首次启动postgres服务
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile start'
|
||||||
|
```
|
||||||
|
|
||||||
|
应该看到类似下面的消息
|
||||||
|
|
||||||
|
```sh
|
||||||
|
waiting for server to start.... done
|
||||||
|
server started
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 修改配置
|
||||||
|
|
||||||
|
编辑`postgresql.conf`
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# 监听IP地址设置为*表示允许其他主机连接
|
||||||
|
listen_addresses = '*'
|
||||||
|
# 端口号
|
||||||
|
port = 5432
|
||||||
|
```
|
||||||
|
|
||||||
|
编辑`pg_hba.conf`,添加下面这一行表示信任来自本地局域网的连接(根据实际情况编写IP地址)
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# IPv4 LAN connections:
|
||||||
|
host all all 192.168.156.0/24 trust
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 重启postgres服务
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile restart'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 配置systemd服务
|
||||||
|
|
||||||
|
这个时候通过数据库客户端试着连接这个数据库服务,使用用户名`postgres`,密码空,默认数据库`postgres`,端口号`5432`,应该可以连接成功。
|
||||||
|
|
||||||
|
接下来我们配置一下`systemd`系统服务:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
vim /etc/systemd/system/postgres.service
|
||||||
|
```
|
||||||
|
|
||||||
|
编辑如下内容
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=PostgreSQL database server
|
||||||
|
Documentation=man:postgres(1)
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
User=postgres
|
||||||
|
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
KillMode=mixed
|
||||||
|
KillSignal=SIGINT
|
||||||
|
TimeoutSec=infinity
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
然后让服务生效并实现开机自启
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile stop'
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable postgres
|
||||||
|
sudo systemctl start postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
完成上面的操作,postgres服务已经安装完成,重启系统试一下,postgres服务应该可以开机自启。
|
||||||
|
|
||||||
|
### 编译安装PostGIS扩展
|
||||||
|
|
||||||
|
#### 安装依赖
|
||||||
|
|
||||||
|
```sh
|
||||||
|
apt-get install -y \
|
||||||
|
libxml2-dev \
|
||||||
|
libgeos-dev \
|
||||||
|
libproj-dev \
|
||||||
|
libprotobuf-c-dev \
|
||||||
|
protobuf-c-compiler \
|
||||||
|
libgdal-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 编译
|
||||||
|
|
||||||
|
```sh
|
||||||
|
tar zxvf postgis-3.5.2.tar.gz
|
||||||
|
cd postgis-3.5.2
|
||||||
|
./configure \
|
||||||
|
--prefix=/usr/local/pgsql \
|
||||||
|
--with-pgconfig=/usr/local/pgsql/bin/pg_config \
|
||||||
|
--with-geosconfig=/usr/bin/geos-config \
|
||||||
|
--with-proj \
|
||||||
|
--with-gdalconfig=/usr/bin/gdal-config \
|
||||||
|
--with-json-c
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 构建并安装
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 创建数据库并启用PostGIS扩展
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'createdb postgis_template'
|
||||||
|
sudo su - postgres -c 'psql postgis_template -c "CREATE EXTENSION postgis;"'
|
||||||
|
sudo su - postgres -c 'psql postgis_template -c "CREATE EXTENSION postgis_raster;"'
|
||||||
|
sudo su - postgres -c 'psql postgis_template -c "CREATE EXTENSION postgis_topology;"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证Postgres和PostGIS
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'psql -d postgis_template -c "SELECT postgis_full_version();"'
|
||||||
|
```
|
||||||
|
|
||||||
|
应该可以看到类似下面的结果
|
||||||
|
|
||||||
|
```sh
|
||||||
|
POSTGIS="3.5.2 dea6d0a" [EXTENSION] PGSQL="170" GEOS="3.11.1-CAPI-1.17.1" PROJ="9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/usr/share/proj/pro
|
||||||
|
j.db" (compiled against PROJ 9.1.1) GDAL="GDAL 3.6.2, released 2023/01/02" LIBXML="2.9.14" LIBJSON="0.16" LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)" TOPOLOGY RASTER
|
||||||
|
(1 row)
|
||||||
|
```
|
||||||
|
|
||||||
|
再试着进入psql命令行:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo su - postgres -c 'psql -d postgis_template;'
|
||||||
|
```
|
||||||
|
|
||||||
|
在psql命令行中执行下面的SQL:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
SELECT ST_AsText(ST_GeomFromText('POINT(1 1)'));
|
||||||
|
```
|
||||||
|
|
||||||
|
应该能看到下面的结果
|
||||||
|
|
||||||
|
```sh
|
||||||
|
st_astext
|
||||||
|
------------
|
||||||
|
POINT(1 1)
|
||||||
|
(1 row)
|
||||||
|
```
|
||||||
|
|
||||||
|
用`exit`命令可以退出psql命令行
|
||||||
|
|
||||||
|
## 完成
|
||||||
|
|
||||||
|
以上过程是本人边操作边记录的,结束后又在新的虚拟机上重现了一遍,所以可以保证成功。
|
Loading…
Reference in New Issue
Block a user