十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

PostgreSQL 13 在Linux系统上的完整安装与配置指南

PostgreSQL 13 在Linux系统上的完整安装与配置指南 1. 从零到一为什么PostgreSQL 13值得你亲手安装如果你正在寻找一个功能强大、稳定可靠且完全开源的关系型数据库PostgreSQL 绝对是一个绕不开的名字。它不仅是许多大型互联网公司的基石也是无数开发者、数据分析师和系统管理员的首选。今天我们不谈那些高深的架构原理也不聊复杂的性能调优就从最基础、最实在的一步开始在Linux系统上亲手安装PostgreSQL 13。你可能会问现在PostgreSQL 18都出来了为什么还要装一个13版本原因很简单稳定压倒一切。PostgreSQL 13发布于2020年经过多年的市场检验其稳定性和兼容性已经达到了一个非常成熟的阶段。许多生产环境尤其是那些对稳定性要求极高的企业级应用依然在广泛使用13版本。它拥有完善的社区支持、海量的教程和解决方案对于学习和搭建测试环境来说是风险最低、最稳妥的选择。相比于直接从最新版本开始可能遇到的各种未知兼容性问题从13这个“经典稳定版”入手能让你把更多精力放在学习数据库本身的使用上而不是和安装过程中的各种“坑”作斗争。2. 安装前的“扫雷”工作环境检查与依赖准备在动手敲下任何安装命令之前花十分钟做好准备工作能为你节省后面数小时的排查时间。这就像盖房子前要勘测地质一样至关重要。2.1 确认你的系统“底子”PostgreSQL 13对主流Linux发行版的支持都非常好但不同发行版的软件包管理器和默认软件源配置天差地别。首先打开你的终端用以下命令确认系统信息cat /etc/os-release这条命令会清晰地告诉你你用的是Ubuntu、Debian、CentOS、RHEL还是其他发行版以及具体的版本号。例如如果你看到VERSION_ID20.04那么你就是Ubuntu 20.04的用户。这一步决定了我们后续要使用的安装命令是apt还是yum/dnf。接下来检查系统是否已经安装了旧版本的PostgreSQLpsql --version或者更彻底一点systemctl list-units | grep postgresql dpkg -l | grep postgresql # 适用于Debian/Ubuntu rpm -qa | grep postgresql # 适用于CentOS/RHEL/Fedora如果发现有旧版本存在你需要做一个决定是卸载旧版本还是尝试让新旧版本共存对于新手和学习环境我强烈建议彻底卸载旧版本避免端口冲突、数据目录混淆等一系列麻烦。卸载命令因系统而异但通常可以在网上搜到“彻底卸载PostgreSQL”的教程。记住卸载前务必确认没有重要的数据存放在旧版本中。2.2 解决“依赖”这个老大难问题依赖缺失是安装失败最常见的原因之一。PostgreSQL编译和运行需要一系列基础开发库。我们可以提前安装它们防患于未然。对于Debian/Ubuntu系统执行sudo apt update sudo apt install -y build-essential libreadline-dev zlib1g-dev flex bison libxml2-dev libxslt-dev libssl-dev libssl-dev uuid-dev对于CentOS/RHEL/Fedora系统执行sudo yum groupinstall -y Development Tools sudo yum install -y readline-devel zlib-devel flex bison libxml2-devel libxslt-devel openssl-devel openssl-devel uuid-devel这里解释一下几个关键依赖的作用build-essential/Development Tools这是编译器的集合如gcc, g make是编译任何C语言项目的基石。readline-dev提供命令行编辑和历史记录功能让你在psql命令行里能用方向键翻看之前输入的命令。zlib-dev用于数据压缩。libssl-dev提供SSL加密连接支持对于数据库安全至关重要。uuid-dev用于生成UUID数据类型。注意不同Linux发行版甚至同一发行版的不同版本软件包的名字可能有细微差别。如果上述某个包找不到尝试用apt search或yum search查找类似名称的包。例如在某些旧版CentOS中uuid-devel包名可能是libuuid-devel。3. 实战安装两种主流路径的深度解析准备好了地基现在可以开始“盖楼”了。安装PostgreSQL主要有两种方式通过系统自带的包管理器安装或者从官网下载源码进行编译安装。两种方式各有优劣适用于不同的场景。3.1 路径一包管理器安装推荐给绝大多数用户这是最快捷、最省心的方法适合用于快速搭建开发、测试环境。包管理器会自动处理依赖关系、创建系统服务、配置运行用户等繁琐工作。对于 Ubuntu/Debian 系统首先导入PostgreSQL官方软件仓库的GPG密钥和软件源信息以确保下载的软件包是正版且最新的。sudo sh -c echo deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main /etc/apt/sources.list.d/pgdg.list wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt update然后安装PostgreSQL 13的服务器核心包和常用的客户端工具包sudo apt install -y postgresql-13 postgresql-client-13安装完成后PostgreSQL服务会自动启动并创建一个名为postgres的系统用户来运行数据库服务。对于 CentOS/RHEL 7/8 或 Fedora 系统首先安装PostgreSQL的官方YUM仓库# 对于 CentOS/RHEL 7 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 对于 CentOS/RHEL 8 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 对于 Fedora sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/F-$(rpm -E %fedora)-x86_64/pgdg-fedora-repo-latest.noarch.rpm禁用系统自带的旧版PostgreSQL模块如果有的话然后安装# 对于 CentOS/RHEL 8 sudo dnf -qy module disable postgresql sudo dnf install -y postgresql13-server postgresql13-contrib初始化数据库并启动服务sudo /usr/pgsql-13/bin/postgresql-13-setup initdb sudo systemctl enable postgresql-13 sudo systemctl start postgresql-13包管理器安装的优缺点优点极其简单一键完成自动集成到系统服务管理systemd后续升级方便。缺点安装的版本和编译参数由仓库维护者决定灵活性差默认安装路径可能分散在系统的各个标准目录如/usr/lib/postgresql/13,/var/lib/postgresql/13不如源码安装集中。3.2 路径二源码编译安装适合定制化需求如果你需要特定的编译选项比如调整优化级别、启用或禁用某些默认不开启的功能、想将PostgreSQL安装到非标准目录或者你的系统版本太老/太新官方仓库没有提供对应的包那么源码编译是你的不二之选。第一步下载源码包建议从PostgreSQL官网的 下载页面 获取稳定版本的源码避免从第三方渠道下载可能被篡改的代码。wget https://ftp.postgresql.org/pub/source/v13.16/postgresql-13.16.tar.gz # 注意版本号请替换为官网最新的13.x版本。本文以13.16为例。第二步解压与配置解压源码并进入目录tar -zxvf postgresql-13.16.tar.gz cd postgresql-13.16运行configure脚本。这是最关键的一步它检查你的系统环境并生成针对你当前系统的编译配置Makefile。./configure --prefix/usr/local/pgsql-13 --with-openssl这里有几个重要参数--prefix/usr/local/pgsql-13指定安装目录。我习惯将不同版本的PostgreSQL安装到/usr/local/pgsql-{版本号}下这样管理起来一目了然也方便多版本共存。--with-openssl启用SSL支持对于生产环境是必须的。其他常用参数--with-libxml支持XML类型、--with-uuidossp使用系统UUID库等。你可以运行./configure --help查看所有选项。如果configure命令报错最常见的错误就是“找不到XXX库”如configure: error: readline library not found。这时请回到2.2节确认对应的开发包通常是-dev或-devel结尾的包是否已正确安装。第三步编译与安装配置成功后就可以开始编译了。-j参数指定并行编译的作业数通常设置为你的CPU核心数可以大幅加快编译速度。make -j$(nproc) sudo make install编译过程视机器性能可能需要5到30分钟。安装make install会将编译好的二进制文件、库文件等复制到--prefix指定的目录中。第四步创建专用用户与数据目录出于安全考虑PostgreSQL不应该以root身份运行。我们需要创建一个系统用户。sudo adduser postgres然后创建数据存储目录并赋予postgres用户所有权sudo mkdir -p /usr/local/pgsql-13/data sudo chown -R postgres:postgres /usr/local/pgsql-13/data第五步初始化数据库集群切换到postgres用户使用我们刚安装的initdb命令来初始化一个数据库集群可以理解为一个数据库实例的存储空间。sudo su - postgres /usr/local/pgsql-13/bin/initdb -D /usr/local/pgsql-13/data --encodingUTF8 --localeen_US.UTF-8参数说明-D指定数据目录的路径就是上一步创建的目录。--encodingUTF8设置默认数据库编码为UTF-8这是目前最通用、兼容性最好的编码。--localeen_US.UTF-8设置区域规则。这里设置为美式英语UTF-8可以有效避免一些排序和大小写比较的奇怪问题。你也可以根据需求设置为zh_CN.UTF-8。第六步配置系统服务可选但推荐为了方便管理启动、停止、开机自启我们可以为源码安装的PostgreSQL创建一个systemd服务文件。创建服务配置文件sudo vim /etc/systemd/system/postgresql-13.service写入以下内容请根据你的实际安装路径--prefix和数据目录-D进行调整[Unit] DescriptionPostgreSQL 13 Database Server Afternetwork.target [Service] Typeforking Userpostgres Grouppostgres EnvironmentPGDATA/usr/local/pgsql-13/data OOMScoreAdjust-1000 ExecStart/usr/local/pgsql-13/bin/pg_ctl -D ${PGDATA} start ExecStop/usr/local/pgsql-13/bin/pg_ctl -D ${PGDATA} stop ExecReload/usr/local/pgsql-13/bin/pg_ctl -D ${PGDATA} reload TimeoutSec300 [Install] WantedBymulti-user.target然后重新加载systemd配置启用并启动服务sudo systemctl daemon-reload sudo systemctl enable postgresql-13 sudo systemctl start postgresql-13源码编译安装的优缺点优点完全可控可以深度定制编译参数以优化性能或功能安装目录集中便于管理和备份适合学习和理解PostgreSQL的构建过程。缺点步骤繁琐耗时较长需要手动处理服务管理、用户创建等升级时需要重新编译。4. 安装后的关键第一步配置与连接测试安装完成并启动服务后事情还没完。默认配置是为了安全而高度限制的我们需要进行一些基本调整才能顺利连接和使用。4.1 修改监听与认证方式PostgreSQL的主配置文件是postgresql.conf客户端认证配置文件是pg_hba.conf。它们的路径因安装方式而异包管理器安装通常在/etc/postgresql/13/main/(Debian/Ubuntu) 或/var/lib/pgsql/13/data/(CentOS/RHEL)。源码安装在你指定的数据目录-D参数指定的路径如/usr/local/pgsql-13/data下。首先修改postgresql.conf找到listen_addresses这一行。默认可能是listen_addresses localhost将其修改为listen_addresses *这表示允许来自任何IP地址的连接。在生产环境中这非常危险应该设置为具体的服务器IP或网段。但在本地学习或测试环境中设为*最为方便。同时确认port 5432这是PostgreSQL的默认端口。接下来修改pg_hba.conf文件。这个文件控制着谁能以什么方式连接哪个数据库。在文件末尾添加一行# TYPE DATABASE USER ADDRESS METHOD host all all 0.0.0.0/0 md5这行配置的含义是允许所有来源IP0.0.0.0/0的所有用户使用密码md5方式连接所有数据库。同样这仅适用于内网测试环境。修改完配置后需要重启PostgreSQL服务使配置生效# 对于包管理器安装 sudo systemctl restart postgresql-13 # 或 postgresql13-main # 对于源码安装并配置了服务的 sudo systemctl restart postgresql-13 # 对于源码安装未配置服务的切换到postgres用户操作 sudo su - postgres /usr/local/pgsql-13/bin/pg_ctl -D /usr/local/pgsql-13/data restart4.2 设置postgres用户密码与首次连接PostgreSQL安装后会创建一个默认的超级用户postgres。在包管理器安装中这个用户的认证方式在pg_hba.conf里默认可能是peer或ident意味着它只允许操作系统同名的用户从本地系统套接字登录无需密码。为了能用密码从远程或本地TCP/IP连接我们需要先为postgres用户设置一个密码。首先以postgres系统用户身份登录到数据库命令行sudo -u postgres psql这会进入psql交互界面提示符变成postgres#。然后执行SQL命令修改密码ALTER USER postgres WITH PASSWORD YourStrongPassword123;请务必将YourStrongPassword123替换成一个你自己设定的、足够复杂的密码。完成后输入\q退出psql。现在你可以尝试用密码从本地连接了psql -h localhost -U postgres -d postgres系统会提示你输入刚才设置的密码。如果连接成功恭喜你PostgreSQL 13已经成功安装并运行在你的系统上了。5. 避坑指南那些我踩过的“雷”和解决方案即便按照教程一步步来你也可能会遇到一些意想不到的问题。下面是我在无数次安装中总结出的几个典型“坑”及其解决方案。5.1 坑一服务启动失败日志报错“data directory has wrong ownership”现象使用systemctl start postgresql-13启动服务时失败查看日志journalctl -u postgresql-13或数据目录下的log文件发现错误信息提示数据目录权限不对。根因数据目录如/var/lib/pgsql/13/data或/usr/local/pgsql-13/data的所有者不是postgres用户和组。这通常发生在手动创建目录或从其他位置复制数据时。解决方案递归地将数据目录及其所有内容的所有权更改给postgres用户。sudo chown -R postgres:postgres /你的/数据目录/路径然后再次尝试启动服务。5.2 坑二连接被拒绝错误“no pg_hba.conf entry for host”现象使用psql -h localhost -U postgres连接时提示FATAL: no pg_hba.conf entry for host 127.0.0.1, user postgres, database postgres, SSL off。根因pg_hba.conf文件中没有允许当前连接方式的规则。例如你从TCP/IPlocalhost连接但配置里只允许本地套接字local连接。解决方案确保你已经按照4.1节正确修改了pg_hba.conf文件添加了针对host类型和相应用户/IP的规则如host all all 127.0.0.1/32 md5。每次修改pg_hba.conf后必须重启PostgreSQL服务或让服务重新加载配置才能生效。重新加载配置通常比重启更轻量sudo systemctl reload postgresql-13 # 或 sudo -u postgres pg_ctl reload -D /你的/数据目录/路径5.3 坑三编译安装时configure失败缺少“readline”库现象运行./configure时报错configure: error: readline library not found或类似信息。根因系统中没有安装对应的开发库-dev或-devel包。解决方案这正是我们在2.2节强调要提前安装依赖的原因。根据错误信息安装对应的包。对于readline在Ubuntu上是libreadline-dev在CentOS上是readline-devel。安装后建议删除configure生成的所有缓存文件重新运行配置make distclean ./configure --prefix... 你的参数5.4 坑四安装后找不到psql等命令现象安装成功但直接在终端输入psql提示“command not found”。根因可执行文件的目录没有加入到系统的PATH环境变量中。解决方案对于包管理器安装通常已经自动配置好。如果没有可以尝试查找命令位置sudo find / -name psql 2/dev/null找到后将其路径如/usr/lib/postgresql/13/bin添加到PATH。对于源码安装这是常态。你需要手动将安装目录下的bin和lib目录添加到环境变量。最持久的方法是在用户配置文件如~/.bashrc或~/.zshrc末尾添加export PATH/usr/local/pgsql-13/bin:$PATH export LD_LIBRARY_PATH/usr/local/pgsql-13/lib:$LD_LIBRARY_PATH然后执行source ~/.bashrc使配置生效。之后你就可以在任何位置使用psql、pg_ctl等命令了。5.5 坑五关于“PostgreSQL 13 丢失 pg_control 文件”的深入分析这是一个在搜索热词中出现的具体错误postgresql 丢失 /home/postgres/data/global/pg_control: no such file。这个错误非常典型它意味着PostgreSQL服务器无法在指定的数据目录中找到控制文件pg_control这个文件是数据库集群的“大脑”记录了集群的关键状态信息。可能的原因和解决思路数据目录路径错误启动命令如pg_ctl start -D ...或服务配置文件如postgresql-13.service中指定的-D参数或PGDATA环境变量指向了错误的路径。检查并修正路径。数据目录未初始化你指定了一个空目录或非PostgreSQL数据目录。你需要用initdb命令正确初始化一个集群。确保你是在一个已经用initdb初始化过的目录上启动服务。文件权限问题postgres用户对数据目录或pg_control文件没有读取权限。用ls -la检查文件权限和所有者并用chown/chmod修正。磁盘损坏或文件被误删这是最坏的情况。如果你有备份可以从备份中恢复global/目录。如果没有备份但你的数据文件base/目录还在可以尝试极度危险的恢复操作如使用pg_resetwal工具这可能导致数据不一致务必先备份剩余文件。对于生产环境定期备份是防止此类灾难的唯一可靠方法。这个错误提醒我们在操作数据库的数据目录时一定要明确知道自己在做什么并且对关键操作如移动、删除、初始化做好记录和备份。
返回列表