Postgre在Linux上的安装

在 Ubuntu 上从源码使用 Autoconf + Make 安装 PostgreSQL 16.8

本文档记录了在 Ubuntu 上用 Autoconf + Make 编译安装 PostgreSQL (版本 16.8) 的完整步骤

步骤一:安装编译依赖

1
2
3
4
5
sudo apt update
sudo apt upgrade -y

sudo apt install -y build-essential libreadline-dev zlib1g-dev \
flex bison libxml2-dev libxslt1-dev libssl-dev wget pkg-config

说明:

  • build-essential:包括 gcc、make 等基础编译工具
  • libreadline-dev:命令行历史、行编辑支持
  • zlib1g-dev:压缩支持
  • flexbison:语法 / 词法分析工具
  • libxml2-devlibxslt1-dev:XML / XSLT 支持
  • libssl-dev:SSL / 加密支持
  • wget:下载源码包
  • pkg-config:辅助 configure 脚本查找库及其路径信息

步骤二:下载并解压 PostgreSQL 源码

1
2
3
4
cd /usr/local/src
sudo wget https://ftp.postgresql.org/pub/source/v16.8/postgresql-16.8.tar.gz
sudo tar -xzf postgresql-16.8.tar.gz
cd postgresql-16.8

此时你进入源码根目录 postgresql-16.8

步骤三:运行 configure 脚本,配置构建选项

1
2
3
4
./configure --prefix=/usr/local/pgsql \
--with-openssl \
--with-libxml \
--with-libxslt

各选项说明:

  • --prefix=/usr/local/pgsql:指定 PostgreSQL 最终安装目录
  • --with-openssl:启用 SSL 支持
  • --with-libxml / --with-libxslt:启用 XML / XSLT 支持

注意:如果系统中尚未安装 ICU(国际化 / Unicode 支持库),configure 可能提示 “ICU library not found” 错误。此时你需要先安装 ICU 的开发包(如 libicu-dev)。

若执行 configure 时出现 “Permission denied” 或类似错误,可考虑:

  • 使用 sudo ./configure …
  • 修改源码目录的属主 / 权限,使当前用户拥有写权限
  • 将源码复制 / 移动到当前用户有写权限的目录下操作

步骤四:编译、测试与安装

1
2
3
make
make check # 可选,运行回归测试以验证功能是否正确
sudo make install

说明:

  • make:编译 PostgreSQL
  • make check:运行 PostgreSQL 自带的测试套件(推荐执行,以便提前发现问题)
  • sudo make install:将编译所得的程序、库、头文件等安装到 --prefix 指定的目录

如果需要安装额外模块、文档等,也可以使用命令如 make world / make world-bin / make install-world 等。

步骤五:初始化数据库集群

1
2
3
4
sudo mkdir -p /usr/local/pgsql/data
sudo chown postgres:postgres /usr/local/pgsql/data

/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

这一步会创建系统所需目录结构、默认数据库、系统表格、默认配置文件(如 postgresql.confpg_hba.conf 等)。
此外PostgreSQL 出于安全考虑,不允许以 root 用户身份初始化数据库。你需要使用一个普通用户来执行 initdb 命令。

步骤六:启动 PostgreSQL 服务器进程

1
2
cd /usr/local/pgsql/data
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/logfile start
  • pg_ctl 是 PostgreSQL 的管理工具,用来启动、停止、重启数据库服务。
  • -D:数据目录
  • -l logfile:日志文件路径

可以通过以下方式确认是否成功启动:

1
ps aux | grep postgres

步骤七:配置环境变量

将 PostgreSQL 的可执行路径加入 PATH,并设置 PGDATA 环境变量:

1
2
3
echo 'export PATH=/usr/local/pgsql/bin:$PATH' >> ~/.bashrc
echo 'export PGDATA=/usr/local/pgsql/data' >> ~/.bashrc
source ~/.bashrc
  • export PATH=/usr/local/pgsql/bin:$PATHPostgreSQL 的二进制目录 (/usr/local/pgsql/bin) 添加到系统的 PATH 环境变量中。$PATH 保留原有的 PATH 内容,确保其他命令仍然可用。这样可以直接在终端运行 psqlpg_dump 等命令,而无需输入完整路径。

  • export PGDATA=/usr/local/pgsql/data设置 PostgreSQL 的默认数据目录 (PGDATA 环境变量)。某些 PostgreSQL 命令(如 pg_ctl)会依赖这个变量来找到数据库集群的存储位置。如果不设置,某些操作可能需要额外指定 -D 参数。

这样就可以直接在终端使用 psqlpg_ctl 等命令,而无需写完整路径。
例如,以后启动数据库服务时可以直接这样写:

1
pg_ctl -l /usr/local/pgsql/data/logfile start

关闭PostgreSQL服务进程

1
pg_ctl -D /usr/local/pgsql/data stop

模式:

  • smart:等所有连接断开后关库(默认)。
  • fast:立刻断开连接并做检查点(推荐)。
  • immediate:紧急停止(类似 kill)。

步骤八:创建、访问数据库,用客户端 psql 连接数据库,进入交互式 SQL 命令行

首先来创建一个数据库

1
createdb mydb

如果不产生任何响应则表示该步骤成功。

一旦你创建了数据库,你就可以通过以下方式访问它:

  • 运行PostgreSQL的交互式终端程序,它被称为psql, 它允许你交互地输入、编辑和执行SQL命令。
  • 使用一种已有的图形化前端工具,比如pgAdmin或者带ODBC或JDBC支持的办公套件来创建和管理数据库。
  • 使用多种绑定发行的语言中的一种写一个自定义的应用。
1
psql -d mydb

在psql中,你将看到下面的欢迎信息:

1
2
3
4
psql (16.8)
Type "help" for help.

mydb=>

最后一行也可能是:mydb=# ,这个提示符意味着你是数据库超级用户,最可能出现在你自己安装了 PostgreSQL实例的情况下。 作为超级用户意味着你不受访问控制的限制。

这个时候你就可以敲入 SQL查询在此psql维护的工作区中:

1
2
3
4
5
SELECT version();
CREATE USER dbauser WITH PASSWORD 'dbapassword';
CREATE DATABASE dba_demo OWNER dbauser;
GRANT ALL PRIVILEGES ON DATABASE dba_demo TO dbauser;
\q

使用 systemd 管理 PostgreSQL

systemd 是 Linux 系统中最常用的 系统与服务管理器(System and Service Manager)。
它负责:

  • 在系统启动时初始化各个服务(包括数据库、网络、日志等);

  • 在系统运行期间启动、停止或重启服务;

  • 管理服务的依赖关系、日志、权限和状态。

简单来说,它是 Linux 启动和后台服务管理的核心工具。
PostgreSQL 在现代 Linux 发行版(如 Ubuntu、CentOS、Fedora 等)中,通常作为一个 systemd 服务单元(systemd unit) 来管理。

使用 systemd 管理 PostgreSQL 的常见命令

操作 命令 说明
启动 PostgreSQL sudo systemctl start postgresql 启动数据库服务
停止 PostgreSQL sudo systemctl stop postgresql 安全停止数据库
重启 PostgreSQL sudo systemctl restart postgresql 重启数据库服务
查看状态 sudo systemctl status postgresql 查看 PostgreSQL 当前运行状态
设置开机自启 sudo systemctl enable postgresql 在系统启动时自动启动 PostgreSQL
取消开机自启 sudo systemctl disable postgresql 禁止开机自动启动 PostgreSQL
查看日志 journalctl -u postgresql 查看 PostgreSQL 的 systemd 管理日志

pg_ctlcluster

pg_ctlcluster 是 Ubuntu / Debian 专属的 PostgreSQL 管理命令,
由官方的 PostgreSQL APT 包(postgresql-common)提供,用于:

  • 管理 不同版本 的 PostgreSQL

  • 管理 同一版本的多个集群(cluster)

一个cluster(集群) = 一个 PostgreSQL 服务器进程(postmaster) + 一组数据库 + 一个独立的数据目录。

操作 命令 说明
启动集群 sudo pg_ctlcluster 16 main start 启动 PostgreSQL 16 的 main 集群
停止集群 sudo pg_ctlcluster 16 main stop 停止 PostgreSQL 16 的 main 集群
重启集群 sudo pg_ctlcluster 16 main restart 重启 PostgreSQL 16 的 main 集群
查看状态 sudo pg_ctlcluster 16 main status 查看 PostgreSQL 16 main 集群的运行状态
检查配置 sudo pg_ctlcluster 16 main reload 重新加载配置(不重启)

注意

使用\l命令时可以看到此时有postgres,tmplate1template0这三个额外的数据库
第一个数据库总是在初始化数据存储区域时创建的。这个数据库被称为postgres。因此要创建第一个“普通”数据库时,你可以连接到postgres

在集簇初始化期间还会创建两个额外的数据库, template1template0, 。每当在集簇中创建新数据库时,实际上是克隆了template1。 这意味着您在template1中所做的任何更改都会传播到随后创建的所有数据库中。所以该数据库是创建新数据库的“模板”。 如果你为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。 这种行为允许对数据库中标准对象集合的站点本地修改。例如,如果你把过程语言PL/Perl安装到 template1中,那么你在创建用户数据库后不需要额外的操作就可以使用该语言。 因此,除非您希望这些更改传播到每个新创建的数据库中,否则应避免在template1中创建对象。

系统里还有名为template0的第二个标准系统数据库。 这个数据库包含和template1初始内容一样的数据,也就是说,只包含你的PostgreSQL版本预定义的标准对象。 在数据库集簇被初始化之后,不应该对template0做任何修改。 通过指示CREATE DATABASE使用template0取代template1进行拷贝, 你可以创建一个“原始的”用户数据库,它不会包含任何template1中的站点本地附加物。
要通过拷贝template0来创建一个数据库,使用:SQL 环境中的

1
CREATE DATABASE dbname TEMPLATE template0;

或者 shell 中的

1
createdb -T template0 dbname

常见问题与解决方法

  • ICU library not found
    解决办法:执行 sudo apt install libicu-dev pkg-config,然后重新运行 configure。或者在 configure 时加 --without-icu

  • Permission denied / 无法 touch / 写文件错误
    解决办法:使用 sudo 执行,或者修改源码目录属主 / 权限(推荐将目录属主修改为当前用户)。

  • make check 有部分测试失败
    在学习环境下,可先忽略部分非关键失败,但要重点关注核心模块是否通过。之后可根据测试日志修复。

  • 修改配置 / 重新做 configure 无效
    若更改 configure 选项或依赖后构建不生效,建议先执行 make distclean 清除旧的构建产物,然后重新 ./configure + make

  • pg_ctl start、createdb mydb、psql mydb 这三个命令的关系

  1. pg_ctl -l /usr/local/pgsql/data/logfile start
    作用:启动 PostgreSQL 服务器进程(后台守护进程)。

  2. createdb mydb
    作用:在 已经运行的数据库服务 里创建一个新的数据库 mydb。

  3. psql mydb
    作用:用客户端 psql 连接到 mydb 数据库,进入交互式 SQL 命令行。

所以 顺序关系就是:
👉 启动数据库服务 → 创建数据库 → 进入数据库执行 SQL


end

  • Copyrights © 2023-2025 Hexo

请我喝杯咖啡吧~

支付宝
微信