Docker部署PostGIS+自动化分区表保姆级教程

1、新建Dockerfile文件

#使用官方 PostGIS 镜像(前提是你的先pull好)
FROM postgis/postgis:latest

# 安装 PostgreSQL 插件的依赖(包括 git, clang 和 PostgreSQL 开发包)
USER root
RUN apt-get update && \
    apt-get install -y postgresql-server-dev-17 gcc make git clang-13 && \
    apt-get clean

# 安装分区自动生成插件(例如 pg_partman)
RUN git clone https://github.com/pgpartman/pg_partman.git /tmp/pg_partman \
    && cd /tmp/pg_partman && make && make install

# 复制初始化 SQL 脚本(如果需要)
#COPY init.sql /docker-entrypoint-initdb.d/

# 设置环境变量
ENV POSTGRES_DB=gisdb
ENV POSTGRES_USER=postgres

# 端口配置
EXPOSE 5432

# 容器启动时执行的默认命令
CMD ["postgres"]

2、构建镜像
在Dockerfile文件的目录下打开cmd

docker build -t postgis-with-partman .

3、启动容器
启动时设置密码

docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=123456 postgis-with-partman

或无密码启动

docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgis-with-partman

4、进入容器

docker exec -it <container_id_or_name> psql -U postgres

5、 检查 pg_partman 插件是否安装

SELECT * FROM pg_extension WHERE extname = 'pg_partman';

如果安装成功,会显示如下类似结果:
在这里插入图片描述

6、 创建父表,确保主键包含 created_at

CREATE TABLE public.parent_table (
    id SERIAL,
    name TEXT,
    created_at TIMESTAMPTZ NOT NULL,
    PRIMARY KEY (id, created_at)  -- 包含分区键 created_at
)
PARTITION BY RANGE (created_at);  -- 使用 RANGE 分区

7、 验证分区表

SELECT tablename
FROM pg_tables
WHERE tablename LIKE 'parent_table%';

8、 使用 pg_partman 管理分区

SELECT public.create_parent(
    p_parent_table := 'public.parent_table',
    p_control := 'created_at',
    p_interval := '1 month',
    p_type := 'range',
    p_automatic_maintenance := 'on'
);

或更详细指定参数

SELECT public.create_parent(
    p_parent_table := 'public.parent_table',
    p_control := 'created_at',
    p_interval := '1 month',
    p_type := 'range',
    p_premake := 1,  -- 设置预创建一个分区
    p_automatic_maintenance := 'on',
    p_start_partition := '2025-01-01'  -- 设置分区的起始日期
);

9、查看未插入数据前的分区表

SELECT tablename
FROM pg_tables
WHERE tablename LIKE 'parent_table%';

10、插入数据验证

INSERT INTO parent_table (name, created_at)
VALUES 
    ('Data 1', '2025-01-15'),
    ('Data 2', '2025-02-10'),
    ('Data 3', '2025-03-25');

查看分区表

SELECT tablename
FROM pg_tables
WHERE tablename LIKE 'parent_table%';

如果分区表创建成功,你应该能够看到类似于 parent_table_2025_01, parent_table_2025_02 等表名,其中数字部分代表不同的分区。
确保数据按日期被分配到正确的分区。如果你插入了 2025 年 1 月的数据,它应该出现在 parent_table_2025_01 中,而 2025 年 2 月的数据应该出现在 parent_table_2025_02 中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔十贰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值