ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PostgreSQL安装全攻略:版本选择、多平台部署与远程连接排错

PostgreSQL安装全攻略:版本选择、多平台部署与远程连接排错 装 PostgreSQL 这件事说难不难说简单也有一堆细节。很多人第一次装的时候卡在版本选择、权限配置、远程连接这些地方一折腾就是一下午装完之后过两天又发现连不上、起不来、乱码最后还是得回头查资料。我这些年在不同系统上装过几十次 PostgreSQL踩过的坑不少这篇文章把各个平台常见的安装路径、版本取舍、踩坑点一次性理清楚。不管是 Windows 桌面机、Ubuntu 服务器还是 Docker 环境照着操作基本能一次过。需要说明的是下面会覆盖三个主流场景的安装方式Windows 安装包、Linux 包管理器安装、Docker 容器化部署以及部分用户会用到的源码编译和离线安装场景。内容偏实操每个步骤都会说清楚为什么这么做尽量避免装完了但不知道为什么的情况。如果你是刚接触 PostgreSQL 的新手或者正准备从 MySQL 切过来这篇文章能帮你省不少时间。1. 装之前先把版本问题想清楚PostgreSQL 下载哪个版本1.1 大版本号怎么选16、15 还是更老很多人上来就问PostgreSQL 下载哪个版本这个问题其实包含两层意思一个是选大版本号一个是选安装形态。先说大版本号。PostgreSQL 的发版节奏是一年一个大版本比如 14、15、16、17 这样迭代。每个大版本发布后社区会持续维护约 5 年包括 bug 修复和安全补丁。所以选版本的核心原则是不要追最新选一个已经发布半年以上的稳定版。以 2024 年到 2025 年这个时间窗口来看PostgreSQL 16 是性价比很高的选择。16 在逻辑复制、性能调优方面有不少实打实的改进比如逻辑复制支持从备库回放、并行聚合的性能提升而且发布至今已经经过多轮补丁更新稳定性和生态兼容性都验证过。17 虽然更新但如果你的项目依赖一些第三方工具比如特定版本的 PostGIS、pgbouncer、备份工具新版本发布初期可能会出现兼容性滞后没必要当小白鼠。如果你是学习用途或者个人项目装 15 或 16 差别不大选 16 即可。如果是生产环境建议参考你所用云厂商或托管服务商当前默认的版本保持一致能减少很多环境差异问题。还有一个细节小版本号同样不能忽略。比如 16.4 和 16.6 之间可能修复了安全性或数据完整性相关的问题建议下载时选最新的小版本补丁版而不是停留在最初的 16.0。1.2 安装形态怎么选安装包、便携版还是包管理器确定大版本后接下来是安装形态。每一种形态都有自己的适用场景官方安装包Windows 和 macOS 上最省心自带图形化安装向导会把 PostgreSQL、pgAdmin、Stack Builder 一并装好默认配置也合理适合大多数开发者和新用户。系统包管理器Linux 上的主流方式比如 Ubuntu 的apt、CentOS 的dnf。优势是升级维护方便能和系统服务管理systemd衔接适合服务器部署。Docker 镜像适合需要快速起环境、多版本并存、CI/CD 测试的场景。官方镜像postgres:16配置简单环境隔离干净清理也方便。便携版/绿色版网上流传的 portable 版本不需要安装直接解压运行。说实话除非你只是临时体验一下语法否则我不推荐在生产或正式开发环境用便携版。它绕过了系统服务和权限管理容易遇到文件权限、自动启动、环境变量等一堆说不清的怪问题。源码编译适合对性能参数、编译选项有定制需求的场景比如要在低配机器上裁剪功能、或需要内置某些补丁。日常使用不推荐从源码编耗时而且依赖处理麻烦。从这个清单能看出来没有哪一种形态是全能的核心还是看你的使用场景。下面的内容分别把 Windows、Linux、Docker、源码编译、离线安装这几条路径的操作细节和注意事项讲透。2. Windows 下安装 PostgreSQL安装包方式与关键配置2.1 安装向导中的几个关键决策点Windows 用户最常规的做法是去 PostgreSQL 官网下载Windows x86-64的安装包目前官方提供的 Windows 安装包由 EnterpriseDBEDB维护里面包含了 PostgreSQL 数据库、pgAdmin 图形管理工具以及 Stack Builder。下载完成后双击运行安装向导有几个界面需要特别留意不要一路 Next。第一步是选择安装目录默认是C:\Program Files\PostgreSQL\16如果 C 盘空间紧张建议改到数据盘比如D:\PostgreSQL\16。注意路径中不要出现中文和空格以外的特殊字符虽然 PostgreSQL 对中文路径支持尚可但后续配置工具链、写脚本时容易出幺蛾子能用英文路径就别折腾。第二步是设置数据目录这个很容易被忽略。PostgreSQL 的数据目录data目录存放所有数据库文件、WAL 日志、配置文件和权限信息是数据库的核心资产。默认情况下它会放在安装目录下的data子目录但很多人在实际使用中会把系统盘和数据盘分开。如果你有独立的存储盘建议在这个步骤直接指定数据目录到数据盘避免后续因为系统盘空间不足去迁移数据目录——手动迁移 data 目录虽然可行但容易踩到权限和路径配置的坑。第三步是设置超级用户密码。安装向导会创建一个默认为postgres的超级用户密码需要你输入两次。这个密码在安装完成后也能改但安装时最好就设置一个强度合适的密码。另外向导会让你选择端口号默认是 5432如果 5432 端口被其他程序占用可以改成 5433 等空闲端口但后面连接字符串里要带上这个自定义端口。2.2 安装完成后的 PATH 配置与命令行连接安装完成后默认情况下 PostgreSQL 的命令行工具psql、pg_restore、pg_dump等不会被自动加入到系统的 PATH 环境变量中。这意味着你在命令行里直接敲psql会提示找不到命令很多人在这里卡住。解决办法是手动添加环境变量。打开系统属性 → 环境变量在系统变量的Path里追加两个路径分别是 PostgreSQL 的 bin 目录比如D:\PostgreSQL\16\bin。如果你安装时没有修改安装目录那就是C:\Program Files\PostgreSQL\16\bin。添加完之后重新打开一个命令行窗口输入以下命令验证psql --version正常会输出类似psql (PostgreSQL) 16.4的版本信息。如果有输出说明环境变量生效了。接下来用以下命令连接本地数据库psql -U postgres -p 5432系统会提示输入密码输入安装时设置的超级用户密码即可。这里要提醒一个 Windows 上的常见问题psql默认连接的是localhost的 5432 端口如果你的端口不是 5432或者想要连接远程服务器参数不能省。另外在 Windows 的 PowerShell 里执行psql -U postgres时如果当前系统用户名和数据库用户名不一致可能会出现认证失败确认数据库用户名写正确就行。2.3 Windows 服务管理Windows 安装包默认会把 PostgreSQL 注册成系统服务服务名通常是postgresql-x64-16。这意味着安装完成后数据库会开机自启动不需要手动拉起进程。如果你不希望它开机启动可以通过服务管理器找到对应服务把启动类型改为手动。不过大多数情况下开着自启动更方便。日常维护中重启数据库服务的常用命令如下# 停止服务 net stop postgresql-x64-16 # 启动服务 net start postgresql-x64-16 # 重启服务 Restart-Service postgresql-x64-16这里有个小坑如果你后来手动修改了postgresql.conf或者pg_hba.conf配置文件必须重启服务才能生效。有的人改完配置之后只重开了 psql 客户端发现配置不生效就是这个原因。3. Linux 环境下的三种安装路线apt、Docker 与源码编译3.1 使用 apt/dnf 包管理器安装在 Ubuntu 或 Debian 系统上PostgreSQL 的安装非常直接。Ubuntu 官方源里有 PostgreSQL但版本可能不是最新的比如某些 LTS 版本只带 14 或 15。想装指定新版本推荐先添加 PostgreSQL 官方 APT 仓库。添加官方仓库的步骤在 PostgreSQL 官网专门有一页Linux downloads (Ubuntu)会给出根据系统版本生成的命令。大致流程如下先导入官方 GPG key然后把仓库地址写入/etc/apt/sources.list.d/pgdg.list之后更新索引并安装。以 Ubuntu 22.04 安装 PostgreSQL 16 为例核心命令大致是这样的# 1. 导入官方签名 sudo apt install -y wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - # 2. 添加仓库根据系统版本修改 jammy 部分 sudo sh -c echo deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main /etc/apt/sources.list.d/pgdg.list # 3. 安装 sudo apt update sudo apt install -y postgresql-16安装完成后系统会自动创建一个postgres系统用户并初始化好一个数据目录通常位于/var/lib/postgresql/16/main。同时服务也会通过 systemd 自动管理和启动。有一点必须强调安装完成后登录 PostgreSQL 不能直接使用psql -U postgres来免密登录。因为默认的pg_hba.conf中本地peer认证会要求当前操作系统用户与数据库用户名一致。也就是说你需要在系统层面切换到postgres用户才能免密登录本地数据库sudo -u postgres psql如果想用postgres用户密码登录需要先设置密码ALTER USER postgres WITH PASSWORD 你的密码;然后把pg_hba.conf中本地连接方式的认证方式从peer改成md5或scram-sha-256重启服务后即可。CentOS、Rocky Linux 等 Red Hat 系系统思路类似把apt换成dnf仓库地址从apt.postgresql.org换成download.postgresql.org/pub/repos/yum/reporpms安装包名略有不同。核心步骤都是添加官方仓库、安装对应版本、启动服务。3.2 Docker 方式安装多版本隔离与数据持久化Docker 安装 PostgreSQL 是很多开发者和运维偏好的方式尤其适合本地开发环境、自动化测试、以及想要快速体验新版本的情况。官方镜像postgres在 Docker Hub 上维护得很及时不同 tag 对应不同版本比如postgres:16、postgres:16-alpine。最基础的启动命令如下docker run -d \ --name my-postgres \ -e POSTGRES_PASSWORDmysecretpassword \ -e POSTGRES_USERmyuser \ -e POSTGRES_DBmydb \ -p 5432:5432 \ -v pgdata:/var/lib/postgresql/data \ postgres:16这里有几个关键参数值得解释一下POSTGRES_PASSWORD是必须设置的不设置的话容器起不来POSTGRES_USER和POSTGRES_DB如果不设置默认都会是postgres。-v pgdata:/var/lib/postgresql/data是数据卷挂载把数据库文件持久化到宿主机。如果不挂载容器删除后所有数据会全部消失建议任何有一点正经需求的环境都不要省这个参数。-p 5432:5432做端口映射宿主机 5432 端口会映射到容器内的 5432。使用 Docker 还有一个隐藏的好处版本切换极其方便。比如你想测试 PostgreSQL 15 和 16 的行为差异一条命令就能各自起一个容器互不干扰。这在本地开发时非常有用。不过容器方式也有需要注意的地方容器内默认时区是 UTC如果你在宿主机设置了 CST中国标准时间而容器内没同步插入now()的值会和预期时间差 8 小时。解决办法是在启动时加上环境变量-e TZAsia/Shanghai或者在容器里执行docker exec -it my-postgres bash -c ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo Asia/Shanghai /etc/timezone另一个坑是文件权限。数据卷pgdata挂载到宿主机后目录归属默认是 PostgreSQL 镜像内的postgres用户UID 999如果后续想直接查看或备份宿主机上的数据文件可能会遇到权限不足的问题。理解这一点不要强行修改宿主机的卷目录权限优先通过 PostgreSQL 自身的备份工具来导出数据。3.3 Ubuntu 源码编译安装适合有定制需求的场景源码编译安装是热搜词里专门提到的场景很多人是被编译两个字吓住了其实流程并不复杂但确实需要一些耐心。源码编译的价值在于可以指定安装路径、选择编译选项比如要不要 SSL、哪种字符集支持还能在低版本 Linux 发行版上编译出较新版本的 PostgreSQL。先准备编译依赖Ubuntu 上需要这些包sudo apt update sudo apt install -y build-essential libreadline-dev zlib1g-dev flex bisonlibreadline-dev是 px_sql 命令行历史功能的依赖没有它虽然能编译过但 psql 的交互体验差很多方向键上下翻历史记录不能用。flex和bison是解析器生成工具编译 PG 源码时需要用到。zlib1g-dev是压缩支持。接着从官网下载源码包以 16.4 为例wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz tar -xzf postgresql-16.4.tar.gz cd postgresql-16.4然后执行配置、编译、安装三步./configure --prefix/usr/local/pgsql16 make -j 4 sudo make install--prefix指定安装目录默认是/usr/local/pgsql。建议带上版本号避免以后装了新版本后旧版本被覆盖。编译耗时取决于机器性能-j 4表示用 4 个并行任务CPU 核数多的可以调大。编译安装完成之后还需要做两件事创建数据目录和初始化数据库。而且注意源码安装不会自动创建postgres系统用户也不会有 systemd 服务需要手动管理进程。初始化命令sudo mkdir -p /data/pgdata sudo chown -R $(whoami) /data/pgdata /usr/local/pgsql16/bin/initdb -D /data/pgdata -U postgres -E UTF8 --localeC-E UTF8设置数据库默认编码为 UTF-8--localeC则使用 C 语言环境能避免很多因 locale 引起的排序和格式化问题如果对中文字段排序有特定需求再根据实际情况调整。启动数据库可以用/usr/local/pgsql16/bin/pg_ctl -D /data/pgdata -l /data/pgdata/logfile start源码编译的坑主要在依赖缺失上。最典型的表现是执行./configure时报错readline library not found或zlib library not found解决办法就是回到上面那步把依赖装全。另外编译后如果动态库找不到可能需要把libpq的库路径加入ldconfig比如echo /usr/local/pgsql16/lib | sudo tee /etc/ld.so.conf.d/pgsql16.conf sudo ldconfig否则连接数据库时会报libpq.so.5: cannot open shared object file之类的错误。3.4 Linux 离线安装提前下载依赖是关键生产内网环境往往不能直接访问外网这时候需要提前在一台能联网的机器上把需要的安装包和依赖下载好再拷进内网安装。很多刚接触的人栽在只拷了主安装包没带依赖这一步上。在 Ubuntu 上你可以用apt-get download把指定包及依赖一并下载下来# 先添加官方源并 update然后缓存 deb sudo apt-get update mkdir -p /tmp/pg-offline cd /tmp/pg-offline apt-get download postgresql-16 postgresql-client-16 postgresql-common libpq5如果系统之前没有这些包上面的方式就够用了。下载完成后把整个目录拷贝到离线机器上执行sudo dpkg -i *.deb如果还缺依赖dpkg 会提示具体的包名再回联网机器上补下即可。有些时候依赖关系比较复杂更省事的办法是在联网机器上用apt-get install --download-only配合apt-get install的模拟选项来生成依赖清单。CentOS 离线安装思路类似用yumdownloadersudo yum install -y yum-utils mkdir -p /tmp/pg-offline cd /tmp/pg-offline yumdownloader --resolve --destdir/tmp/pg-offline postgresql-server-16然后拷贝到离线机器上执行rpm -ivh *.rpm注意--resolve会下载所有依赖别漏掉。离线安装的另一个常见方法是直接使用官方提供的二进制 tar 包。PostgreSQL 官网对 Linux 也提供免编译的二进制包下载解压后只要依赖的系统库版本匹配配合initdb和pg_ctl就能跑起来。这种方式适合内网环境因为没有编译步骤也不用处理一堆系统包依赖。4. 安装完成后的初始化配置与远程访问4.1 账户密码与认证方式peer、md5 和 scram-sha-256不管用哪种方式装好 PostgreSQL第一个要处理的问题都是认证方式。PostgreSQL 的客户端认证由pg_hba.conf文件控制常见的有trust、peer、md5、scram-sha-256几种认证方法。trust完全不验证任何人都能用该用户名连接只能用于极度信任的本地环境生产环境禁止。peer基于操作系统用户名映射本机登录时如果系统用户名等于数据库用户名就免密放行。这也是 Linux apt 安装后本地能直接sudo -u postgres psql的原因。md5和scram-sha-256密码认证scram-sha-256安全性更强新版本推荐使用。如果你想让本机用密码连接而不是每次都切系统用户可以编辑pg_hba.conf把local行的认证方式改为scram-sha-256然后重启服务。修改之前先备份原文件这是所有配置文件操作的默认习惯。配置文件位置不同安装方式不一样apt/dnf 安装/etc/postgresql/16/main/pg_hba.conf源码编译安装$PGDATA/pg_hba.confDocker 镜像容器内/var/lib/postgresql/data/pg_hba.conf但不建议直接改容器内文件应通过 SQL 命令或启动参数来管理用户权限4.2 开启远程访问两个配置文件缺一不可远程连接是另一个高频需求。默认情况下PostgreSQL 只监听本地回环地址127.0.0.1也就是说即使防火墙放行其他机器也连不上。这由postgresql.conf里的listen_addresses参数控制。开启远程访问需要改两个文件第一个是postgresql.conf找到这一行#listen_addresses localhost改成listen_addresses **表示监听所有网卡。如果只想监听某个特定 IP也可以写成具体 IP 地址。第二个是pg_hba.conf需要追加一条允许远程访问的规则。比如允许来自192.168.1.0/24网段的机器使用密码连接host all all 192.168.1.0/24 scram-sha-256保存后重启服务。如果不想重启也可以执行SELECT pg_reload_conf();让配置在不中断连接的情况下生效这对生产环境特别友好。需要注意的是pg_hba.conf的匹配规则是从上到下按顺序执行的以第一条匹配到的规则为准。所以如果你在前面写了一条host all all 0.0.0.0/0 reject拒绝所有来源后面再加放行规则也不会生效。实际配置时建议把具体的放行规则放在前面兜底拒绝规则放最后。4.3 防火墙、云安全组与端口连通性排查配置完 PostgreSQL 内部的两个文件剩下的问题出在系统防火墙和云平台安全组上。Ubuntu 上如果启用了 UFW需要放行 5432 端口sudo ufw allow 5432/tcp如果前面自定义了端口把 5432 换成你的实际端口。CentOS 系则用 firewalld 或直接改 iptables。云服务器用户还有一个隐藏关卡控制台的安全组。阿里云、腾讯云、AWS 都要在安全组或防火墙规则里额外放行 5432 端口否则服务器内部的 UFW 放行了也没用。这个坑特别常见本地telnet 127.0.0.1 5432是通的但远程连不上十有八九就是安全组没放行。端口连通性测试也有一个值得记住的命令序列。先在本地确认服务在监听ss -lntp | grep 5432然后在另一台机器上测试端口可达性telnet 服务器IP 5432 # 或者 nc -zv 服务器IP 5432能连通后再用 psql 测试认证psql -h 服务器IP -p 5432 -U postgres -d postgres这一层一层排查基本能定位大多数远程连接问题。5. 常见问题与排查技巧实录5.1 端口占用与启动失败启动 PostgreSQL 时报错could not bind to address或Address already in use多半是端口被占用了。先用下面的命令查看sudo lsof -i :5432如果确认是被另一个 PostgreSQL 实例占用两种处理方式一个是停掉占用进程另一个是给新实例换端口。在企业环境里同一台机器上跑多个 PostgreSQL 实例并不罕见每套实例有独立的 data 目录和端口。初始化新实例时记得指定不同的端口即可。在 Windows 上端口占用排查用netstat -ano | findstr :5432拿到 PID 后到任务管理器里找到对应进程确认不是重要程序再结束。前面提到过如果端口被占了在安装向导阶段改成 5433 是更省事的办法。5.2 认证失败password authentication failedpassword authentication failed for user postgres这个错误信息应该是最常见的了。原因基本就是密码不对。但有一种情况容易被忽略你改了系统用户的密码却忘了改的是数据库用户密码还是操作系统用户密码。在 Linux 上sudo -u postgres psql用的是peer认证它不校验密码而远程连接走的是scram-sha-256认证必须使用数据库密码。如果你忘了数据库密码不要慌可以用操作系统用户权限重置sudo -u postgres psql然后执行ALTER USER postgres WITH PASSWORD 新密码;重置完成后如果远程用密码连接还是不通过检查pg_hba.conf的认证方式是否被写成了peer或者trust远程连接规则里需要写成scram-sha-256或md5。还有一个历史遗留问题如果你用了md5认证方式但密码在数据库里是以scram-sha-256格式存储的PostgreSQL 14 之后默认创建用户时使用 scrammd5认证会失败。解决办法是把pg_hba.conf中的认证方式统一成scram-sha-256。5.3 中文乱码与字符集设置中文环境下数据库客户端乱码是一个绕不开的话题。乱码本质上是字符集不匹配服务端数据库的编码、客户端工具编码、操作系统 locale 三者不一致。安装数据库时所有数据文件、SQL 中的字符串都以数据库默认编码存储。如果初始化时没指定编码PostgreSQL 会沿用系统的 locale。在中文 Windows 或 Linux 上系统 locale经常是zh_CN.UTF-8一般不会有乱码问题但服务器如果初始化成了C或en_US.UTF-8一样能正常存中文关键在于客户端连接时要用 UTF-8。psql 客户端可以显式设置编码export PGCLIENTENCODINGUTF8 psql -U postgres -d mydb进入 psql 后也可以查看和设置编码SHOW client_encoding; SET client_encoding TO UTF8;还有一个老生常谈的问题数据库建库时没有指定 UTF-8 编码用的是SQL_ASCII。SQL_ASCII 本身不校验编码存进去的字节原样返回看起来似乎能存中文但排序、比较、字符串函数的行为都不可预期后续想转成 UTF-8 也很麻烦。所以建库时一定要明确指定编码CREATE DATABASE mydb WITH ENCODING UTF8 LC_COLLATE zh_CN.UTF-8 LC_CTYPE zh_CN.UTF-8 TEMPLATE template0;TEMPLATE template0是为了避开默认模板库的编码和 locale 限制这一点经常有人忽略导致建库报错encoding UTF8 does not match locale。5.4 版本升级与数据迁移的教训最后讲一个和安装相关、但很多人后知后觉的问题大版本升级不能直接覆盖旧版本的数据目录。PostgreSQL 的大版本之间磁盘上的数据文件格式和内部系统表结构可能有变化旧版本的 data 目录无法直接被新版本启动。升级的标准路径是使用pg_upgrade工具或者用pg_dump逻辑导出再导入。pg_upgrade性能好很多但要求新旧版本二进制都在同一台机器上并且要停掉数据库服务。具体命令这里不展开但有一条核心提示升级之前一定要备份而且要在备份的基础上做升级演练。我见过因为没备份就执行 pg_upgrade结果中途报错、旧库还停了的尴尬情况。数据损坏的修复成本远高于升级操作本身。还有一个相关的坑很多人从官网下载了新版安装包直接装在旧版本上面还以为覆盖安装就好。实际上 PostgreSQL 不会自动迁移数据新版本安装完成之后旧版本的服务还在跑两个版本可能分别占用 5432 和 5433 端口你连到的还是旧版本。这种时候不要慌先想清楚你是真的需要升级还是只是想要新版本的工具。如果只是工具直接下载一个对应新版本的客户端即可如果需要升级服务老老实实走备份、导出、导入或 pg_upgrade 流程。我在实际安装里还有一个习惯每装完一个环境立刻留下三行备注——安装方式、安装版本、数据目录位置。听起来很简单但很多人在半个月后回顾时就忘了自己当初装在哪、数据在哪个目录遇到问题排查起来格外费劲。另外装完之后顺手跑一条SELECT version();留个底也能确认自己连的到底是不是预期中的那个实例。工具顺手了后续踩坑就会少很多。
返回列表