尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PostgreSQL安装全攻略:从Windows到Docker、源码编译与离线部署实战

PostgreSQL安装全攻略:从Windows到Docker、源码编译与离线部署实战 开头很多朋友问PostgreSQL怎么装其实这个事儿说简单也简单说坑也多。我自己前后在Windows、Linux服务器、Docker环境里折腾过好几轮从源码编译到离线安装都踩了一遍心想干脆把这次经历整理成一篇能直接照着做的教程。这篇文章不是官方文档翻译而是一个实际动手试错之后的操作笔记。文章会覆盖几个核心场景帮你先定版本再讲Windows安装、Linux下的yum/apt安装、离线安装、源码编译还有现在最常用的Docker部署。每一条我都把下载地址、配置参数、容易翻车的地方标出来适合刚入门的同学照抄也适合运维老手快速翻出某个细节。如果你正准备把PostgreSQL装起来跑业务或者想系统学一下数据库初始化、认证配置和数据操作这篇内容够你从零到一把环境跑通。1. 动手前先想清楚版本与安装方式怎么选1.1 版本选型逻辑打开PostgreSQL官网下载页你能看到一堆版本号从14到18都有很多人直接懵了。我的建议很简单生产环境用16或17学习用17手痒尝鲜才碰18。为什么这么选PostgreSQL每个大版本都有五年支持周期14版本已经进入维护后期新项目没必要选它。15和16是目前生态最成熟的两代各类工具、驱动、文档兼容度最好。17在2024年9月正式发布性能提升主要集中在vacuum相关的内存管理和并行查询上如果你的服务器配置不算高用17反而能感受到明显改进。18还在beta阶段除非你是在测试新特性否则别拿到生产环境当小白鼠。热词里有一条PostgreSQL 16便携版确实有这种需求。便携版就是把数据库打包成一个可直接运行的目录不写系统服务不用管理员权限。我自己在Windows上试过适合临时演示和开发拷贝整个目录就能带走到另一台机器。但要注意便携版默认配置把数据目录放在程序目录下重装或移动路径时容易踩路径权限坑后面我会展开讲。生产环境我强烈不建议用便携版它没有服务自启、日志轮转这类完整生命周期管理。1.2 安装方式对比安装PostgreSQL大体有四条路官方安装包交互式/静默、系统包管理器yum/apt、源码编译、Docker容器。它们适用的场景完全不同选错会折腾半天。官方安装包适合个人电脑和图形界面环境Windows和macOS上最省事下一步下一步就装完了。包管理器适合Linux服务器能自动处理依赖、创建系统用户、注册systemd服务是生产环境的默认选择。但有个问题不同Linux发行版的PostgreSQL版本差异较大CentOS 7自带的源只有老版本需要额外配官方yum源才能装到新版本。源码编译适合UOS、麒麟这类国产化系统或者需要自定义编译参数、定制数据目录和运行参数的内核级需求的场景。它最折腾但可控性最高。Docker适合测试环境和微服务架构一条命令拉起实例删掉重来也就几秒钟不污染宿主机。我的经验是别在一个环境里混用多种方式。比如你apt装了PostgreSQL 16又用源码编译装了个到/usr/local/pgsql两个版本同时跑没问题但端口、数据目录、环境变量一旦冲突排查起来够你喝一壶。1.3 下载渠道与选镜像的讲究官方下载地址是postgresql.org/download页面会根据你访问的系统自动推荐安装方式。国内用户最关心下载速度直接访问官网下载有时比较慢可以采用两个办法一是用国内云厂商的PostgreSQL镜像站比如华为云、阿里云的软件仓库二是在Linux下配置官方yum源时把repo文件里的域名替换成镜像域名速度能提升不少。我实际测过从源码编译时官方FTP下载postgresql源码压缩包在某些网络环境下只有几十K每秒换镜像后能到几兆。这里有一个小技巧下载源码包不一定要去官网很多高校开源镜像站都同步了PostgreSQL源码目录找版本号对应tar.gz文件下载即可校验一下SHA256就行。另外在国内使用Docker拉取postgres镜像时注意配置Registry Mirrors镜像加速器。如果不想配也可以直接指定镜像源地址比如公共的postgres镜像仓库。但Docker镜像仓库的地址在不同时期有点变化建议拉到本地后打tag避免后续引用时误拉错版本。2. Windows / macOS 快速安装实战2.1 Windows 安装包流程详解Windows安装推荐用EDB Installer即EnterpriseDB公司提供的图形安装包它把PostgreSQL数据库、pgAdmin管理工具、Stack Builder扩展包整合在一起。下载时注意选择和你系统匹配的版本Windows 10/11 64位就选x86-64版本。下载完成后双击安装包会进入安装流程。有几个关键节点容易被忽略安装目录和数据目录建议分开。默认是C:\Program Files\PostgreSQL\16\Data如果你系统盘空间紧张装之前要改。我通常把程序装在D:\PostgreSQL\16数据目录单独放在D:\PostgreSQL\Data。设置超级用户postgres的密码时务必记住这个密码是数据库的超级管理员密码忘了只能去改pg_hba.conf认证配置才能重置。端口默认5432如果本机8080之类的端口已经被占用没有影响但5432被其他数据库占用了的话要改成5433之类的空闲端口。安装完成后系统服务里会多一个名为postgresql-x64-16的服务登录密码是你在安装时设置的postgres用户密码。如果安装时没有勾选Install as a Windows Service服务不会创建连接数据库前需要手动启动。2.2 验证安装是否成功打开命令行先确认psql命令是否可用。如果你没有把PostgreSQL的bin目录加入PATH环境变量直接输入psql会提示不是内部或外部命令。两种解决办法一是每次用完整路径比如 C:\Program Files\PostgreSQL\16\bin\psql二是把安装目录下的bin路径加入系统PATH这样以后直接用psql命令就行。连接数据库执行psql -U postgres -p 5432按提示输入密码后看到psql (16.x)的欢迎信息就算成功。这时可以执行select version();确认版本号。Windows上常见的问题有三个一是psql执行时提示缺少libpq.dll这个是因为PATH里没有bin目录且在别的目录启动二是防火墙拦截了5432端口局域网其他机器无法连接三是安装时选择了不兼容的Visual C运行库导致初始化失败解决办法是装最新版VC_redist。Windows下卸载PostgreSQL时光控制面板卸载程序还不够需要手动删除数据目录里的内容并清理服务sc delete postgresql-x64-16否则重装时端口和目录冲突会莫名报错。3. Linux 环境安装包管理器、离线与源码编译3.1 基于 yum / apt 的常规安装Linux上如果只是日常使用我推荐先走系统包管理器。Ubuntu/Debian直接 apt install postgresqlCentOS/RHEL 7上需要注意源的问题使用官方yum源才能装到较新的版本。Debian/Ubuntu执行sudo apt update sudo apt install postgresql postgresql-contrib装完后默认实例会自动创建数据目录在 /var/lib/postgresql/16/main服务名是 postgresql。系统会创建一个叫postgres的操作系统用户注意默认情况下只能通过这个系统用户去访问本地数据库。所以要切到postgres用户再执行psqlsudo -i -u postgres psql如果不想切换系统用户想用postgres账号密码登录需要先设置数据库密码然后修改pg_hba.conf里的认证方式。默认Ubuntu下pg_hba.conf只允许本地peer认证peer认证就是操作系统用户是谁数据库用户就是谁。如果改成md5/scram-sha-256才能用密码登录。这个改法后面第5节展开。CentOS/RHEL安装官方yum源yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install -y postgresql16-server装完后需要执行初始化/usr/pgsql-16/bin/postgresql-16-setup initdb systemctl enable postgresql-16 systemctl start postgresql-16rpm包安装的服务名是postgresql-16带版本号不是postgresql很多人在这一步执行 systemctl start postgresql 发现服务不存在因为服务名带版本后缀。3.2 Linux 离线安装完整步骤离线安装是运维场景里的老大难。我在给内网服务器装PostgreSQL时就遇到不能连外网的情况yum源配不了只能手动下载rpm包和依赖传进去。这里特别提醒rpm安装的依赖链条比你想的要长。以CentOS 7 / PostgreSQL 16为例你至少需要这些rpm包postgresql16、postgresql16-server、postgresql16-libs、postgresql16-contrib另外还需要依赖项libicu、openssl等。一个简单的办法是在能联网的同版本CentOS机器上先配置官方yum源然后用 yumdownloader 或 dnf download 把依赖包全部拉下来yum install --downloadonly --downloaddir/tmp/pg16 postgresql16-server postgresql16-contrib–downloadonly会把所有依赖rpm下载到指定目录然后拷贝到内网机器。注意内网机器没有repodata所以不能用yum install file*.rpm要把所有rpm下载到同一目录后执行cd /tmp/pg16 rpm -ivh *.rpm如果机器上没有libicu会提示缺少依赖。可以采用 --nodeps 强行安装但我不推荐可能导致安装后服务起不来。更稳妥的做法是官方yum源里的pgdg-redhat-repo包带有对系统基础依赖的声明建议离线机器提前装好常用的基础依赖比如icu、openssl、zlib、readline。离线机器初始化数据目录时还要手工指定路径例如/usr/pgsql-16/bin/initdb -D /data/pgdata -E UTF8 --localeen_US.UTF-8如果不指定编码默认会用系统locale有的中文内网机器locale是zh_CN.UTF-8也能正常跑但有些排序规则和索引行为在跨平台迁移时会不一致建议统一UTF8。3.3 Ubuntu 源码编译安装含配置参数源码编译在热词里出现频率很高主要因为国产化系统和特殊环境需要。我从官网下载源码包一步步编译安装下面是我验证过的流程。先装依赖apt install build-essential libreadline-dev zlib1g-dev flex bison下载源码示例用16.x版本wget https://ftp.postgresql.org/pub/source/v16.x/postgresql-16.x.tar.gz tar -zxvf postgresql-16.x.tar.gz cd postgresql-16.x源码编译最常见的问题是缺少flex和bison因为PostgreSQL解析器生成代码依赖它们。如果configure阶段报flex not found直接装这两个包即可。configure参数我常用./configure --prefix/usr/local/pgsql --with-openssl --with-pgport5432 --with-perl --with-python然后make -j4 make install如果想要更多进阶模块如postgis需要在configure时加--with-extra-version或者在安装后再编译contrib。源码安装不自动创建数据目录不自动创建postgres用户所以要手工创建useradd postgres mkdir -p /usr/local/pgsql/data chown -R postgres:postgres /usr/local/pgsql su - postgres -c /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E UTF8修改环境变量把 /usr/local/pgsql/bin 加到PATH把 /usr/local/pgsql/lib 加到LD_LIBRARY_PATH。这一步很关键否则执行psql时大概率会遇到找不到 libpq.so 的报错。因为PostgreSQL默认编译生成动态库在/usr/local/pgsql/lib系统的动态库搜索路径默认不包含它。我用了一个一劳永逸的办法在 /etc/ld.so.conf.d/ 下新建一个 pgsql.conf内容写 /usr/local/pgsql/lib然后 ldconfig。源码编译的学生朋友可能会问为什么不直接在configure里写--with-systemd其实新版本默认支持systemd服务注册但initdb后需要手动启用systemd service单元文件并且要把数据目录的所有权给postgres用户否则systemd服务起不来。4. Docker 安装 PostgreSQL一条命令跑起来4.1 快速启动与参数解释Docker装PostgreSQL在我看来是开发环境最香的方式一条命令搞定还能随意切换大版本。下面是核心命令docker run -d--name postgres-test-e POSTGRES_PASSWORDmysecret-e POSTGRES_USERadmin-e POSTGRES_DBappdb-p 5432:5432-v pgdata:/var/lib/postgresql/datapostgres:16这里几个环境变量有讲究POSTGRES_USER默认是postgres如果你想自定义超级用户名可以通过该变量修改。但是注意如果用这个环境变量创建了非postgres用户它仍然是超级用户但实际目录、初始数据库名都以POSTGRES_USER为准。POSTGRES_DB指定初始创建的数据库默认是与POSTGRES_USER同名的数据库。后续应用连接时可以直接用这个库省得手动CREATE DATABASE。POSTGRES_PASSWORD设置超级用户密码对应Windows安装时的postgres密码。-v pgdata:/var/lib/postgresql/data 是数据卷挂载这是Docker部署PostgreSQL的保命选项。不带这个参数容器删除后数据就没了。关于官方镜像有个细节容器主进程是postgres但它实际上不是以root身份运行的。数据目录权限如果挂载到了宿主机目录要确保目录属主UID是999镜像内部的postgres用户UID或者用 --user 参数指定。最常见的问题是挂在宿主机目录后容器初始化时报data directory has wrong ownership改一下目录权限即可。4.2 配置文件如何覆盖默认配置下PostgreSQL只监听localhost。如果Docker容器需要局域网其他机器连接要在docker run时加-e POSTGRES_INITDB_ARGS--auth-localtrust --auth-hostscram-sha-256更实用的做法是挂载自定义的postgresql.conf和pg_hba.conf。我常用方案是挂载配置目录-v /opt/pg/conf:/etc/postgresql-custom然后在docker run时通过命令参数指定配置目录postgres:16 -c config_file/etc/postgresql-custom/postgresql.conf注意-c参数后的内容会传给容器主进程postgres在镜像命令末尾追加即可。如果想把listen_addresses改成*监听所有网卡直接在postgresql.conf里修改而不必依赖复杂的环境变量。Docker方式下修改配置后需要重启容器生效。如果你用docker-compose则执行docker-compose restart。但如果只是改postgresql.conf其实可以用 select pg_reload_conf(); 这个函数热加载不用重启这比传统物理机操作还方便。4.3 主从复制与测试环境扩展Docker跑单节点只是入门热词里提到PostgreSQL数据库操作和实战课程其实主从复制也用Docker练手最方便。我在本机用docker-compose拉起一主一从两个容器验证流复制配置几分钟就完成。简单说一下思路主库配置开启wal_levelreplica并创建一个具备复制权限的账号从库执行 pg_basebackup 拉取主库初始备份然后在从库目录创建standby.signal文件并配置primary_conninfo。Docker下从库启动前需要等主库先初始化完毕否则连不上。我个人平时测试喜欢一次起三个实例分别映射5432、5433、5434端口用三个不同版本镜像对比行为差异。这是物理机安装完全做不到的体验。Docker确实是为测试而生的好工具但生产环境用Docker跑PostgreSQL也有坑——容器默认无法直接利用宿主机的高性能IO需要额外挂载特制存储驱动或使用外部卷插件。所以我的原则是测试Docker生产看情况数据库这种核心组件尽量物理机直接部署。5. 初始化配置与数据库操作基本功5.1 实例初始化与postgresql.conf核心参数无论是哪种方式装的PostgreSQL数据目录初始化完成后真正影响性能和稳定性的都在postgresql.conf和pg_hba.conf里。先看postgresql.conf这是数据库实例的大脑。几个必调参数按优先级排列listen_addresses默认是localhost如果要供远程访问改成*或者具体IP。Docker容器里没改这个从宿主机连容器IP时一直连接超时排查时先看这个。port默认5432如果你在同一台机器跑多个实例通过port区分。max_connections默认100小业务够用并发高的应用建议设置200到500。注意这个参数不是随意调大的它和每个连接占用的内存直接成正比。shared_buffers这是数据库的共享缓存区经验值是物理内存的25%比如16G内存就设4GB。设得过大操作系统文件缓存被挤占反而拖累性能。work_mem排序、哈希等操作的内存默认4MB对于复杂查询容易产生临时文件建议调到16MB到64MB。但不要盲目调大work_mem是每操作分配的高并发下内存总和可能爆掉。effective_cache_size告诉优化器操作系统可用的缓存大小一般设为物理内存的50%到75%。它不实际分配内存只是给执行计划一个估算依据。wal_level如果要搭主从复制或做在线备份必须设为replica老版本是hot_standby。修改完postgresql.conf可以通过 select pg_reload_conf(); 让参数动态生效但有些参数如shared_buffers必须重启。重启前用 pg_ctl -D 数据目录 restart 或者systemctl restartWindows下就是重启服务。5.2 pg_hba.conf 认证配置的坑与原则pg_hba.conf 是客户端认证配置文件很多远程连接失败都是这里没配好。文件位置在数据目录下Windows在数据目录如D:\PostgreSQL\Data\pg_hba.confLinux在/var/lib/postgresql/16/main/或者/usr/local/pgsql/data/。我踩过最大的坑是修改pg_hba.conf后没有重启或reload导致连接还是走旧的认证方式。另外很多人为了省事把远程认证写成trust免密这在生产环境极其危险等于把数据库大门敞开。生产至少用scram-sha-256。最常用的配置场景是允许某个应用服务器IP连接host all all 192.168.1.100/32 scram-sha-256需要注意不要加错位置pg_hba.conf按从上到下的顺序匹配第一条匹配到的规则生效如果想拒绝特定IP要把拒绝规则放在前面。IPv6的规则单独配置如果你配置了::1/128的本地规则远程IPv6连不上时也会排查这。修改后执行 SELECT pg_reload_conf(); 或重启才能生效。在Docker部署时官方镜像有个坏习惯它会把挂载的pg_hba.conf权限弄错导致容器启动报could not open file pg_hba.conf: Permission denied。原因是镜像内postgres用户没有宿主机文件的读权限解决办法是挂载后给文件加权限chmod 644 pg_hba.conf。5.3 常用数据库操作建库建表与备份恢复安装好PostgreSQL后第一件事是了解基本操作。我举个例子把初始化信息串起来-- 以postgres超级用户登录 psql -U postgres -h localhost-- 创建应用数据库和用户 CREATE USER app_user WITH PASSWORD StrongPass1; CREATE DATABASE app_db OWNER app_user;-- 切换到app_db元命令不在SQL中 \c app_db-- 建表 CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT now() );这些操作在不同版本中兼容性很好学了之后跨版本通用。特别注意SQL语句以分号结尾psql的元命令\开头不需要分号。备份和恢复是数据库操作的必修课。我用pg_dump做逻辑备份pg_dump -U postgres -d app_db -F c -f app_db.backup其中-F c表示自定义压缩格式恢复时用pg_restorepg_restore -U postgres -d app_db -c app_db.backup如果是小库直接用纯SQL格式也方便pg_dump -U postgres -d app_db app_db.sql psql -U postgres -d app_db app_db.sql大库备份推荐用pg_basebackup做物理备份它是基于数据目录级别的整体拷贝恢复速度更快但只能恢复到同一大版本。6. 常见问题与排查技巧实录6.1 连接失败类问题速查把我在各种环境下遇到的连接问题整理成一张速查表方便大家直接对照排查现象最可能原因排查思路psql: could not connect to server: No such file or directory服务未启动检查服务状态Connection refused端口没监听或listen_addresses没改netstat/ss查询端口password authentication failed密码错误或认证方式不对重置密码检查pg_hba.confdata directory has wrong ownershipLinux下目录属主不对chown -R postgres:postgresserver does not support SSL客户端要求SSL服务端未配置关闭客户端SSL或服务端配置SSLlock file PostgreSQL.lock exists有残留进程或上次非正常关闭删除/tmp下的锁文件前先确认没有进程在跑这里特别提醒碰到连接失败时先看日志文件。PostgreSQL把运行日志放在数据目录下的log子目录或者通过log_destination配置。日志里最后几行往往就直接指出问题比网上搜半天都管用。6.2 初始化失败与版本升级问题初始化失败经常出现在源码编译或离线安装的场景。initdb报could not find in the system a shared library时检查LD_LIBRARY_PATH或ldconfig配置。initdb报files have incompatible license之类的罕见错误多半是源码包下载不完整重新校验SHA256即可。版本升级是被问得最多的问题。PostgreSQL不允许直接复制数据目录跨大版本使用必须pg_upgrade或逻辑导出再导入。我在16升17时用过pg_upgrade命令大致是/usr/pgsql-17/bin/pg_upgrade-b /usr/pgsql-16/bin -B /usr/pgsql-17/bin-d /data/pg16 -D /data/pg17执行前要停掉旧数据库且新版本的数据目录要提前initdb出来。如果不做任何备份直接跑风险极高一定先在全量备份的前提下操作。6.3 实战中的独家避坑技巧最后分享几个常规文档里不会写的技巧都是我实际用的经验。第一同一台机器多实例部署时每个实例要有单独的配置目录和数据目录。我的命名习惯是 /data/pg16_3306、/data/pg16_3307通过不同端口区分进程用pg_ctl管理这样日常排查非常清爽。第二PostgreSQL的默认日志轮转不够积极长时间跑下来log文件可能很大。我在postgresql.conf里会配log_destinationstderr logging_collectoron log_directorylog log_filenamepostgresql-%Y-%m-%d.log log_rotation_age1d log_rotation_size100MB这样每天一个日志文件每个最大100MB管理起来方便。第三热词里提到好用的skill或者mcp这里补充一点。PostgreSQL生态里现在已经有不少面向AI工具的MCPModel Context Protocol服务比如通过MCP server让AI助手直接执行SQL查询、读取表结构、做数据诊断。这对于我在管理一堆实例时特别有用——不用频繁打开psql用对话就能完成很多日常检查操作。不过我有两点提醒一MCP服务要用只读账号或最小权限账号绝对不要把超级用户凭据暴露给AI工具二工具可以简化操作但基础的表结构、索引、锁机制这些概念还是要懂不然AI出错了都不知道错在哪。第四Windows便携版调试完毕后如果要从一个目录整体拷贝到U盘注意先停掉所有postgres进程再拷贝否则数据文件是热状态拷到新机器很可能出现恢复窗口打都打不开。结尾收尾文章写到这里安装、配置、操作和排查的主线都已经覆盖了。最后再聊一点我个人的实际感受。装了这么多次PostgreSQL之后我最深的体会是安装本身从来不是瓶颈真正决定后续省事与否的是前面的版本选择和目录规划。多花五分钟想想数据目录放哪、认证怎么配、日志怎么轮转后面能帮你省下几个小时。如果你第一次装建议在同一台机器上试着跑两个不同版本一个用系统包一个用Docker对比着看数据目录结构和服务管理差异这样对PostgreSQL的理解会扎实很多。我每次帮同事排查安装问题最后都会加一句先去查日志再去看配置别一上来就怀疑端口被占或者密码错误。顺着这个思路九成问题都能自己解决。希望大家都能顺利把环境跑起来。
返回列表