在 Debian 12 上安装Postgresql
软件包安装
使用APT仓库安装
使用此安装方式会自动创建系统postgres用户、初始数据库等所需的东西,可前往 安装文档 查看详细说明
以下脚本可前往 文档地址 查看最新版本
# Create the file repository configuration:
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists:
sudo apt-get update
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql
树莓派等aarch架构可以参考如下脚本
# Import the repository signing key:
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /etc/apt/keyrings/pgdg.asc
sudo chmod a+r /etc/apt/keyrings/pgdg.asc
# Create the file repository configuration:
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/pgdg.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Update the package lists:
sudo apt-get update
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get -y install postgresql
安装完毕后的相关路径如下:
- 执行文件:/usr/lib/postgresql/{PG_VERSON}
- 配置文件:/etc/postgresql/{PG_VERSON}/main
- 服务脚本:/etc/init.d/postgresql(可通过
help命令查看脚本支持的命令)
可通过 /etc/init.d/postgresql restart 重启服务
维护
迁移路径
# 关闭服务
service postgresql stop
# 复制文件
# mkdir /data
# mount /dev/sdb1 /data
# mkdir /data/postgresql
cp -rf /var/lib/postgresql/16/main/ /data/postgresql/
# 删除旧文件
# rm -rf /var/lib/postgresql
# 设置用户和权限
chown -R postgres:postgres /data/postgresql/
chmod 700 /data/postgresql/
#将配置文件的数据存储路径改成新的
vi /etc/postgresql/16/main/postgresql.conf
# data_directory='/data/postgresql/main'
# 启动服务
service postgresql start
修改密码
修改默认数据库的密码
# 登录postgres
sudo -u postgres psql
ALTER USER postgres WITH PASSWORD '123456';
修改时区(非必须)
查看时区:
postgres=# show time zone;
TimeZone
---------------
Etc/UTC
(1 行记录)
查看数据库可供选择的时区:
postgres=# select * from pg_timezone_names;
name | abbrev | utc_offset | is_dst
----------------------------------------+--------+------------+--------
Africa/Abidjan | GMT | 00:00:00 | f
Africa/Accra | GMT | 00:00:00 | f
Africa/Addis_Ababa | EAT | 03:00:00 | f
Africa/Algiers | CET | 01:00:00 | f
Africa/Asmara | EAT | 03:00:00 | f
Africa/Asmera | EAT | 03:00:00 | f
Africa/Bamako | GMT | 00:00:00 | f
Africa/Bangui | WAT | 01:00:00 | f
Africa/Banjul | GMT | 00:00:00 | f
Africa/Bissau | GMT | 00:00:00 | f
.......................
设置时区:
postgres=# set time zone "Asia/Shanghai";
同步修改系统用户的密码(安装时自动创建的用户,源码安装需要自行创建)
# 切换至具有管理员权限的用户
sudo su root
# 删除postgres用户原有密码
sudo passwd -d postgres
# 按需求更新密码
sudo -u postgres passwd
设置远程访问
配置监听IP
使用nano、vim等文本编辑器修改 /etc/postgresql/{PG_VERSON}/main/postgresql.conf
找到以下这一段
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
#reserved_connections = 0 # (change requires restart)
将listen_addresses前的 # 删除再将值修改为需要的内容,例如
listen_addresses = '*' # 所有
listen_addresses = '192.168.3.10' # 单个ip
listen_addresses = '192.168.3.10,172.16.1.10' # 多个ip
配置密码校验
使用nano、vim等文本编辑器修改 /etc/postgresql/{PG_VERSON}/main/pg_hba.conf
找到以下这一段(一般都在此文件的最末尾)
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
在末尾或觉得合适的地方进行修改,如下:
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
其中的 scram-sha-256 可视情况修改为 trust 或 md5; 0.0.0.0/0 为所有IP段
允许部分IP段可修改为
# IPv4 local connections:
host all all 192.168.3.0/24 scram-sha-256
host all all 172.16.0.0/16 scram-sha-256
重启
/etc/init.d/postgresql restart
卸载Postgres
# 停止数据库
sudo /etc/init.d/postgresql stop
# 移除软件包
sudo apt-get --purge remove postgresql\*
# 删除相关配置文件
sudo rm -r /etc/postgresql/
sudo rm -r /etc/postgresql-common/
sudo rm -r /var/lib/postgresql/
sudo userdel -r postgres
sudo groupdel postgres
源码编译
配置环境
GCC环境
要求GNU make版本3.80或以上
#sudo dnf groupinstall "Development Tools"
#sudo dnf install kernel-devel
root@postgresql:~# apt install -y sudo
root@postgresql:~# sudo apt install -y build-essential #sudo dnf install gcc
root@postgresql:~# make --version
GNU Make 4.3
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2020 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
root@postgresql:~# gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ZLIB环境
如果你不想使用它,那么你必须给
configure声明--without-zlib选项。使用这个选项关闭了在pg_dump和pg_restore中对压缩归档的支持。
前往官网下载源码包

或者使用此链接直接下载最新版:https://www.zlib.net/current/zlib.tar.gz
root@postgresql:~# cd /usr/local/src
root@postgresql:/usr/local/src# wget https://www.zlib.net/current/zlib.tar.gz
root@postgresql:/usr/local/src# tar -zxf zlib.tar.gz
root@postgresql:/usr/local/src# cd zlib-1.3.1/
# 此处无特殊要求 也可通过--prefix=path指定安装路径
root@postgresql:/usr/local/src/zlib-1.3.1# ./configure
root@postgresql:/usr/local/src/zlib-1.3.1# make && make install
GNU Readline环境
如果你不想用它,那么你必需给
configure声明--without-readline选项。作为一种可选方案,你常常可以使用 BSD许可证的libedit库,它最初是在NetBSD上开发的。libedit库是GNU Readline兼容的, 如果没有发现libreadline或者configure使用了--with-libedit-preferred选项,都会使用这个库。如果你使用的是一个基于包的 Linux 发布,那么要注意你需要readline和readline-devel两个包,特别是如果这两个包在你的版本里是分开的时候。
root@postgresql:~# sudo apt install -y libreadline-dev #sudo dnf install readline readline-devel
Perl环境
要编译服务器端编程语言PL/Perl,你需要一个完整的 Perl安装,包括
libperl库和头文件。 所需的最低版本是Perl 5.8.3。 因为PL/Perl是一个共享库,libperl库在大多数平台上也必须是一个共享库。最近的版本的 Perl好像已经默认这样做了,但是早先的版本可不是 这样的,而且这总是一种在站点上安装 Perl 的选择。如果选择了编译 PL/Perl但是它却找不到一个共享的libperl,那么configure将会失败。 在这种情况下,你将不得不重新手工编译并且安装Perl 以便能编译PL/Perl。在 Perl的配置处理过程中,需要一个共享库。
root@postgresql:~# sudo apt install -y libperl-dev #sudo dnf install perl perl-devel
# 如果你想更多地使用PL/Perl, 你应当保证Perl安装在编译时启用了 usemultiplicity选项(perl -V将会显示是否是这样)
root@postgresql:~# perl -V | grep usemultiplicity
usemultiplicity=define
Python环境
要编译PL/Python服务器端编程语言, 你需要一个Python的安装,包括头文件和distutils模块。最低的版本要求是Python 2.4
因为PL/Python将以共享库的方式编译,
libpython库在大多数平台上也必须是一个共享库。 在默认的从源码安装Python时不是这样的, 而是在很多操作系统发布中有一个共享库可用。如果选择了编译 PL/Python但找不到一个共享的libpython,configure将 会失败。这可能意味着你不得不安装额外的包或者(部分)重编译 Python安装以提供这个共享库。 在从源码编译时,请用--enable-shared标志运行 Python的配置脚本。
root@postgresql:~# sudo apt install -y python3-dev #sudo dnf install python3-devel
root@postgresql:~# python3 --version
Python 3.11.2
Tcl环境
如果你想编译PL/Tcl过程语言, 你当然需要安装Tcl,要求的最低版本是 Tcl 8.4
root@postgresql:~# sudo apt install -y tcl-dev #sudo dnf install tcl-devel
NLS环境
要打开本地语言支持(NLS),也就是说, 用英语之外的语言显示程序的消息,你需要一个Gettext API的实现。有些操作系统内置了这些(例如Linux、NetBSD、Solaris), 对于其它系统,你可以从http://www.gnu.org/software/gettext/下载一个额外的包。如果你在使用GNU C 库里面的Gettext实现, 那么你就额外需要GNU Gettext包,因为我们需要里面的几个工具程序。对于任何其它的实现,你应该不需要它。
root@postgresql:~# sudo apt install -y gettext #sudo dnf install gettext
ICU环境
icu4c 是 International Components for Unicode 的缩写,它是一个跨平台的国际化开源库,为软件开发人员提供了处理 Unicode 字符、文本排序、日期时间处理、数字格式化、字符串比较等功能。它广泛用于应用程序和数据库的国际化和多语言支持。
root@postgresql:~# sudo apt install -y libicu-dev #sudo dnf install libicu-devel
LIBXML环境
启用 SQL/XML 支持,需要 Libxml 版本 2.6.23 及以上。
root@postgresql:~# sudo apt install -y libxml2-dev #sudo dnf install libxml2-devel
LIBXSLT环境
xml2依赖这个库来执行XML的XSL转换。
前往 代码仓库 下载

# 下载源码
root@postgresql:/usr/local/src# wget https://gitlab.gnome.org/GNOME/libxslt/-/archive/master/libxslt-master.tar.gz
# 解压并进入文件夹
root@postgresql:/usr/local/src# tar -zxf libxslt-master.tar.gz
root@postgresql:/usr/local/src# ls
libxslt-master libxslt-master.tar.gz
root@postgresql:/usr/local/src# rm -rf libxslt-master.tar.gz
root@postgresql:/usr/local/src# mv libxslt-master libxslt
root@postgresql:/usr/local/src# cd libxslt
# 编译安装
root@postgresql:/usr/local/src/libxslt# sudo apt install -y autoconf libtool automake pkg-config
root@postgresql:/usr/local/src/libxslt# bash autogen.sh
root@postgresql:/usr/local/src/libxslt# make && make install
OpenSSL环境
如果您想支持加密的客户端连接,则需要OpenSSL,在没有
/dev/urandom的平台上(Windows除外),还需要 OpenSSL作为随机数生成器。最低的版本要求是0.9.8。
root@postgresql:~# sudo apt-get install libssl-dev #dnf install openssl-devel
root@postgresql:~# openssl version
OpenSSL 3.0.14 4 Jun 2024 (Library: OpenSSL 3.0.14 4 Jun 2024)
不存在则参考 在 Debian 11 上安装 OpenSSL 3.X
语法分析器环境
bison 是一个语法分析器的生成器,bison 和 flex 配合使用,它可以将用户提供的语法规则转化成一个语法分析器
root@postgresql:~# sudo apt install -y flex bison
编译安装
获取源码
PostgreSQL的源代码可以从我们的官方网站 https://www.postgresql.org/download/的下载区中获得


# 下载适当类型的源码压缩包
root@postgresql:~# wget https://ftp.postgresql.org/pub/source/v17.0/postgresql-17.0.tar.gz
# 解压
root@postgresql:~# tar -zxf postgresql-17.0.tar.gz
编译
默认安装
安装过程的第一步就是为你的系统配置源代码树并选择合适的选项。这个工作是通过运行
configure脚本实现的,对于默认安装,你只需要简单地输入
root@postgresql:~# cd postgresql-17.0
root@postgresql:~# ./configure
默认设置将编译服务器和辅助程序,还有只需要 C 编译器的所有客户端程序和接口。默认时所有文件都将安装到/usr/local/pgsql。
偏爱安装
可以通过给出下面的
configure命令行选项中的一个或更多的选项来自定义编译和安装过程
截图取自 从源代码安装

root@postgresql:~# cd postgresql-17.0
# 查看支持的语言
root@postgresql:~/postgresql-17.0# ls src/bin/psql/po/
cs.po el.po fr.po it.po ka.po LINGUAS pl.po ru.po tr.po zh_CN.po
de.po es.po he.po ja.po ko.po meson.build pt_BR.po sv.po uk.po zh_TW.po
root@postgresql:~/postgresql-17.0# ./configure --prefix=/data/postgresql --enable-nls=zh_CN --with-perl --with-python --with-tcl --with-icu ICU_CFLAGS=' ' --with-openssl --with-libxml --with-libxslt
root@postgresql:~/postgresql-17.0# make -j$(nproc)
root@postgresql:~/postgresql-17.0# make install
配置
环境配置
创建用户和用户组
如果已经创建了则跳过此步骤
root@postgresql:~/postgresql-17.0# sudo groupadd postgres
root@postgresql:~/postgresql-17.0# mkdir /home/postgres (下面命令会自动创建)
root@postgresql:~/postgresql-17.0# sudo useradd -m -g postgres -d /home/postgres postgres
root@postgresql:~/postgresql-17.0# chown postgres:postgres -R /home/postgres
root@postgresql:~/postgresql-17.0# sudo usermod -s /bin/bash postgres
root@postgresql:~/postgresql-17.0# id postgres
uid=1001(postgres) gid=1001(postgres) 组=1001(postgres)
创建并授权数据库集簇存放目录
root@postgresql:~/postgresql-17.0# mkdir /data/postgresql/db
root@postgresql:~/postgresql-17.0# chown postgres:postgres -R /data/postgresql
配置用户配置环境变量
root@postgresql:~/postgresql-17.0# vi /home/postgres/.bashrc
export PGHOME=/data/postgresql
export PGDATA=${PGHOME}/db
export LD_LIBRARY_PATH=${PGHOME}/lib:${LD_LIBRARY_PATH}
export PATH=${PGHOME}/bin:${PATH}
root@postgresql:~/postgresql-17.0# source /home/postgres/.bashrc
初始化数据库集簇并启动
root@postgresql:~/postgresql-17.0# su postgres
$ initdb -D $PGDATA -k
属于此数据库系统的文件宿主为用户 "postgres".
此用户也必须为服务器进程的宿主.
数据库集簇将以区域环境设置 "zh_CN.UTF-8" 进行初始化.
默认的数据库编码已经相应的设置为 "UTF8".
initdb: 无法为区域环境 "zh_CN.UTF-8" 找到合适的文本搜索配置
默认的文本搜索配置将被设为 "simple".
允许生成数据页校验和.
正在修复已存在目录 /data/postgresql/db 的权限 ... 成功
正在创建子目录 ... 成功
正在选择动态共享内存实现 ... posix
正在选择默认最大连接数 (max_connections) ... 100
正在选择默认共享缓冲区 (shared_buffers) ... 128MB
正在选择默认时区 ... Asia/Shanghai
正在创建配置文件 ... 成功
正在运行启动脚本 ... 成功
正在执行启动脚本后续初始化 ... 成功
正在同步数据到磁盘 ... 成功
initdb: 警告: 为本地连接启用 "trust" 身份验证
initdb: 提示: 你可以通过编辑 pg_hba.conf 或下次运行 initdb 时使用 -A 或者 --auth-local 和 --auth-host 选项进行更改.
成功。你现在可以用下面的命令开启数据库服务器:
pg_ctl -D /data/postgresql/db -l logfile start
$ pg_ctl -D /data/postgresql/db -l /tmp/logfile start
等待服务器进程启动 .... 完成
服务器进程已经启动
登录数据库
$ psql -d postgres
配置脚本文件
创建脚本
脚本文件在源码目录的contrib/start-scripts路径下,linux文件即为linux系统上的启动脚本。
root@postgresql:~# cp postgresql-17.0/contrib/start-scripts/linux /etc/init.d/postgresql
使用nano、vim等文本编辑器修改 /etc/init.d/postgresql的prefix和PGDATA如下
# Installation prefix
prefix=/data/postgresql
# Data directory
PGDATA="${prefix}/db"
设置权限
root@postgresql:~# chmod +x /etc/init.d/postgresql
数据库配置
修改密码
修改默认数据库的密码
# 登录postgres
$ psql -d postgres
postgres=# ALTER USER postgres WITH PASSWORD '123456';
ALTER ROLE
修改时区(非必须)
查看时区:
postgres=# show time zone;
TimeZone
---------------
Etc/UTC
(1 行记录)
查看数据库可供选择的时区:
postgres=# select * from pg_timezone_names;
name | abbrev | utc_offset | is_dst
----------------------------------------+--------+------------+--------
Africa/Abidjan | GMT | 00:00:00 | f
Africa/Accra | GMT | 00:00:00 | f
Africa/Addis_Ababa | EAT | 03:00:00 | f
Africa/Algiers | CET | 01:00:00 | f
Africa/Asmara | EAT | 03:00:00 | f
Africa/Asmera | EAT | 03:00:00 | f
Africa/Bamako | GMT | 00:00:00 | f
Africa/Bangui | WAT | 01:00:00 | f
Africa/Banjul | GMT | 00:00:00 | f
Africa/Bissau | GMT | 00:00:00 | f
.......................
设置时区:
postgres=# set time zone "Asia/Shanghai";
同步修改系统用户的密码
# 切换至具有管理员权限的用户
$ su root
# 删除postgres用户原有密码
root@postgresql:~# sudo passwd -d postgres
passwd:密码已更改。
# 按需求更新密码
root@postgresql:~# sudo -u postgres passwd
新的密码:
重新输入新的密码:
passwd:已成功更新密码
设置远程访问
配置监听IP
使用nano、vim等文本编辑器修改 /data/postgresql/db/postgresql.conf
找到以下这一段
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
#reserved_connections = 0 # (change requires restart)
将listen_addresses前的 # 删除再将值修改为需要的内容,例如
listen_addresses = '*' # 所有
listen_addresses = '192.168.3.10' # 单个ip
listen_addresses = '192.168.3.10,172.16.1.10' # 多个ip
配置密码校验
使用nano、vim等文本编辑器修改 /data/postgresql/db/pg_hba.conf
找到以下这一段(一般都在此文件的最末尾)
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
在末尾或觉得合适的地方进行修改,如下:
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 0.0.0.0/0 scram-sha-256
其中的 scram-sha-256 可视情况修改为 trust 或 md5; 0.0.0.0/0 为所有IP段
允许部分IP段可修改为
# IPv4 local connections:
host all all 192.168.3.0/24 scram-sha-256
host all all 172.16.0.0/16 scram-sha-256
重启
/etc/init.d/postgresql restart
安装TimescaleDB插件
安装系统依赖
sudo apt-get install cmake # dnf install cmake
下载 TimescaleDB 源码
wget https://github.com/timescale/timescaledb/archive/refs/tags/2.23.1.tar.gz
mv 2.23.1.tar.gz timescaledb-2.23.1.tar.gz
tar -zxf timescaledb-2.23.1.tar.gz
cd timescaledb-2.23.1.tar.gz
./bootstrap -DCMAKE_PREFIX_PATH=/data/postgresql # 修改成刚才./configure --prefix=/data/postgresql的路径
cd ./build && make
make install
配置 PostgreSQL 以启用 TimescaleDB
使用nano、vim等文本编辑器修改 /data/postgresql/db/postgresql.conf
shared_preload_libraries = 'timescaledb' # 添加到文件末尾或取消注释修改
重启postgres加载TimescaleDB
/etc/init.d/postgres restart
重启后连接到数据库并执行
CREATE EXTENSION IF NOT EXISTS timescaledb;
# 验证安装
SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';
修改共享内存相关
vi /etc/systemd/logind.conf
#修改如下;说时默认的yes会在用户登出时清理共享内存文件
RemoveIPC=no
ls -l /dev/shm #共享内存文件可查看该目录
systemctl restart systemd-logind.service
/etc/init.d/postgres restart
- 感谢你赐予我前进的力量


