ubuntu 源码安装postgresql16.0
2026/9/11 21:21:46 网站建设 项目流程
  • 使用 root 账户进行安装
  • 安装路径:/opt/pgsql16 手动创建
  • 数据存储路径:/data/pgsql16/data 手动创建
  • 数据库配置文件 /data/pgsql16/data/postgresql.conf 会自动生成
  • 自动安装脚本参考最后 install_postgresql.sh(我是在ubuntu 22.04 上执行的)

开始安装
刷新本地包索引、安装相关依赖

apt-getupdate-yapt-getupgrade-yapt-getinstallmake-yapt-getinstallbuild-essential-yapt-getinstalllibreadline-dev-yapt-getinstallzlib1g zlib1g-dev-yapt-getinstallbison-yapt-getinstallflex-yapt-getinstalllibpq-dev-yapt-getinstalllibicu-dev-yapt-getinstalllibcommon-sense-perl-yapt-getinstalllibjson-perl-yapt-getinstalllibjson-xs-perl-yapt-getinstalllibpq5-yapt-getinstalllibtypes-serialiser-perl-yapt-getinstallsysstat`-y

下载源码并解压(安装完之后可以删除的,以防后期混淆)

cd/wgethttps://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gztar-zxvfpostgresql-16.0.tar.gz# 进入解压目录cdpostgresql-16.0

创建安装路径和数据存储路径(配置文件也在这个里面)

mkdir-p/opt/pgsql16 /data/pgsql16/data

配置编译参数,并进行编译,验证是否安装成功
–prefix 指定安装路径
–without-icu 禁用ICU 支持

./configure--prefix=/opt/pgsql16 --without-icu#编译 (持续时间较长)makemakeinstall#验证是否安装成功 (有配置内容则成功了)./opt/pgsql16/bin/pg_config#如果提示这个没见不存在就cd /opt/pgsql16/bin 然后执行 ./pg_config

创建postgres用户与用户组 修改文件所有者

groupaddpostgresuseradd-gpostgres postgrespasswdpostgres# 后面输入密码,这里不是数据库密码chownpostgres:postgres /data/pgsql16/datamkdir/home/postgreschmod755/home/postgreschownpostgres:postgres /home/postgrescp-a/etc/skel/. /home/postgresvim/etc/passwd# 最后一行为postgres:x:xxxx:xxxx::/home/postgres:/bin/sh 将sh 修改成bash#postgres:x:xxxx:xxxx::/home/postgres:/bin/bash

配置环境变量
vim /etc/profile 最后添加如下

exportPGHOME=/opt/pgsql16exportPGDATA=/data/pgsql16/dataexportPATH=$PATH:$PGHOME/bin

重新加载系统环境变量

source/etc/profile

切换用户 初始化数据库

su- postgrescd/data/pgsql16/data# initdb 直接输入回车就行了initdb-D/data/pgsql16/data

出现下面内容表示成功
Success. You can now start the database server using:
pg_ctl -D /data/pgsql16/data -l logfile start

设置开机启动 切换到 root用户

suroot

编辑 vim /postgresql-16.0/contrib/start-scripts/linux 文件,修改如下(文件在解压后的源码包里)。

# 安装路径prefix=/opt/pgsql16# 数据存储路径PGDATA="/data/pgsql16/data"

并且修改文件头部 为 #! /bin/bash 并且添加下列代码不要取消注释BEGIN 部分也得加上不然启动会报错

#! /bin/bash### BEGIN INIT INFO# Provides: hutu# Required-Start:# Required-Stop:# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Short-Description: Start hutu daemon at boot time# Description: Start hutu daemon at boot time### END INIT INFO

修改成可执行

chmoda+x /postgresql-16.0/contrib/start-scripts/linux

复制到 /etc/init.d/、/usr/local/bin/ 文件夹下去,并且改成postgresql

cp/postgresql-16.0/contrib/start-scripts/linux /etc/init.d/postgresqlcp/postgresql-16.0/contrib/start-scripts/linux /usr/local/bin/postgresqlchmod+x /usr/local/bin/postgresql

创建system服务
vim /etc/systemd/system/postgresql.service

[Unit]Description=PostgreSQL RDBMSAfter=network.target[Service]Type=forkingUser=postgresGroup=postgresExecStart=/opt/pgsql16//bin/pg_ctl start-D/data/pgsql16/data/-s-o"-p 5432"ExecStop=/opt/pgsql16//bin/pg_ctl stop-D/data/pgsql16/data/-s-mfastExecReload=/opt/pgsql16//bin/pg_ctl reload-D/data/pgsql16/data/-s[Install]WantedBy=multi-user.target

刷新系统服务,设置开机启动,启动服务

systemctl daemon-reload systemctlenablepostgresql.service systemctl start postgresql systemctl status postgresql

修改配置文件 /data/pgsql16/data/postgresql.conf允许远程访问

listen_addresses 这个值改成 * 其他配置配置另行百度

修改配置文件 /data/pgsql16/data/pg_hba.conf 最后一行添加如下

hostall all0.0.0.0/0 md5

重启服务

systemctl restart postgresql

修改数据库的postgres账户密码,放开防火墙

su- postgres# 登录数据库(上方 /data/pgsql16/data/pg_hba.conf# 文件默认有 host all all 127.0.0.1/32 trust 这个 其中 trust 表示不需要密码登录)psql# 修改密码alter user postgres with password'你的密码';exitsuroot#放开防火墙ufw allow5432

删除安装包和源码,以防后期混淆

rm-rf/postgresql-16.0.tar.gzrm-rf/postgresql-16.0

脚本安装(root用户)
随便在哪个位置 新建 install_postgresql.sh 粘贴以下脚本 ,并设置可以执行权限 chmod +x install_postgresql.sh

#!/bin/bash# PostgreSQL 16 源码安装脚本 (基于 Ubuntu)# 参考: https://blog.csdn.net/qq_36491545/article/details/140488108# 注意:此脚本需使用 root 用户执行 (sudo)set-e# 脚本在遇到错误时立即退出# --- 配置变量 (可按需修改) ---PG_VERSION="16.0"PG_HOME="/opt/pgsql16"PG_DATA="/data/pgsql16/data"PG_USER="postgres"PG_PASSWORD="your_strong_password"# 请修改为强密码PG_PORT="5432"# --- 函数: 打印带颜色的提示信息 ---print_info(){echo-e"\n\033[32m[INFO]\033[0m$1"}print_error(){echo-e"\n\033[31m[ERROR]\033[0m$1">&2}# --- 1. 更新系统并安装依赖 ---print_info"更新系统包列表并安装依赖..."apt-getupdate-yapt-getupgrade-yapt-getinstall-ymakebuild-essential libreadline-dev zlib1g zlib1g-dev\bison flex libpq-dev libicu-dev libcommon-sense-perl libjson-perl\libjson-xs-perl libpq5 libtypes-serialiser-perl sysstatwget# --- 2. 下载并解压源码 ---print_info"下载 PostgreSQL${PG_VERSION}源码..."cd/if[-f"postgresql-${PG_VERSION}.tar.gz"];thenrm-f"postgresql-${PG_VERSION}.tar.gz"fiwget"https://ftp.postgresql.org/pub/source/v${PG_VERSION}/postgresql-${PG_VERSION}.tar.gz"print_info"解压源码..."tar-zxvf"postgresql-${PG_VERSION}.tar.gz"cd"postgresql-${PG_VERSION}"# --- 3. 创建目录 ---print_info"创建安装目录和数据目录..."mkdir-p"$PG_HOME""$PG_DATA"# --- 4. 编译与安装 ---print_info"配置编译选项 (禁用ICU支持)..."./configure--prefix="$PG_HOME"--without-icu print_info"开始编译 (此过程较长, 请耐心等待)..."make-j$(nproc)# 使用所有CPU核心加速编译makeinstallprint_info"编译安装完成."# 验证安装if[-x"$PG_HOME/bin/pg_config"];thenprint_info"安装验证成功:""$PG_HOME/bin/pg_config"--versionelseprint_error"安装验证失败, pg_config 未找到."exit1fi# --- 5. 创建 postgres 用户 ---print_info"创建系统用户 '${PG_USER}'..."ifid"$PG_USER"&>/dev/null;thenprint_info"用户 '${PG_USER}' 已存在,跳过创建。"elsegroupadd"$PG_USER"useradd-g"$PG_USER""$PG_USER"echo"${PG_USER}:${PG_PASSWORD}"|chpasswdmkdir-p/home/${PG_USER}chmod755/home/${PG_USER}chown${PG_USER}:${PG_USER}/home/${PG_USER}cp-a/etc/skel/. /home/${PG_USER}# 修改默认 shell 为 bashusermod-s/bin/bash"$PG_USER"fi# 修改数据目录所有者chown-R${PG_USER}:${PG_USER}"$PG_DATA"chown-R${PG_USER}:${PG_USER}"$PG_HOME"# --- 6. 配置环境变量 ---print_info"配置 PostgreSQL 环境变量..."grep-q"PGHOME="/etc/profile||cat>>/etc/profile<<EOF export PGHOME=$PG_HOMEexport PGDATA=$PG_DATAexport PATH=\$PATH:\$PGHOME/bin EOFsource/etc/profile# --- 7. 初始化数据库 ---print_info"切换至${PG_USER}用户初始化数据库..."su-"$PG_USER"-c"initdb -D$PG_DATA"# --- 8. 配置 systemd 服务 (替代原博客的 init.d) ---print_info"配置 systemd 服务..."cat>/etc/systemd/system/postgresql.service<<EOF [Unit] Description=PostgreSQL RDBMS After=network.target [Service] Type=forking User=${PG_USER}Group=${PG_USER}ExecStart=${PG_HOME}/bin/pg_ctl start -D${PG_DATA}-s -o "-p${PG_PORT}" ExecStop=${PG_HOME}/bin/pg_ctl stop -D${PG_DATA}-s -m fast ExecReload=${PG_HOME}/bin/pg_ctl reload -D${PG_DATA}-s ExecStatus=${PG_HOME}/bin/pg_ctl status -D${PG_DATA}Restart=no [Install] WantedBy=multi-user.target EOF# 重新加载 systemd 并启用服务systemctl daemon-reload systemctlenablepostgresql.service print_info"PostgreSQL systemd 服务已配置并启用."# --- 9. 启动服务并检查状态 ---print_info"启动 PostgreSQL 服务..."systemctl start postgresqlsleep3systemctl status postgresql --no-pager# --- 10. 配置远程访问 (可选) ---print_info"配置远程访问权限..."sed-i"s/#listen_addresses = 'localhost'/listen_addresses = '*'/g""$PG_DATA/postgresql.conf"echo"host all all 0.0.0.0/0 md5">>"$PG_DATA/pg_hba.conf"# 重启服务使配置生效systemctl restart postgresql# --- 11. 修改数据库管理员密码 ---print_info"修改 PostgreSQL 数据库 'postgres' 用户密码..."su-"$PG_USER"-c"psql -c\"ALTER USER postgres WITH PASSWORD '${PG_PASSWORD}';\""# --- 12. 设置防火墙 (如果 UFW 启用) ---ifcommand-vufw&>/dev/null&&ufw status|grep-qactive;thenprint_info"检测到 UFW 防火墙已启用,开放端口${PG_PORT}..."ufw allow${PG_PORT}/tcpfi# --- 13. 清理安装文件 ---print_info"清理下载的源码包和解压目录..."cd/rm-rf"postgresql-${PG_VERSION}.tar.gz""postgresql-${PG_VERSION}"# --- 完成 ---print_info"PostgreSQL${PG_VERSION}源码安装成功!"print_info"安装路径:${PG_HOME}"print_info"数据路径:${PG_DATA}"print_info"管理员用户:${PG_USER}, 密码:${PG_PASSWORD}"print_info"服务管理命令: systemctl {start|stop|restart|status} postgresql"

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询