Linux下PostgreSQL安装配置教程
珍惜时间,勤奋学习!今天给大家带来《Linux下安装配置PostgreSQL教程》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!
答案:在Linux系统上安装PostgreSQL需根据发行版选择包管理器安装并初始化数据库集群,随后配置网络监听与访问权限。具体步骤包括使用apt或dnf安装postgresql及相关组件,手动执行初始化(如RHEL系),启动服务后切换至postgres用户设置密码,创建专用用户和数据库,修改postgresql.conf中listen_addresses以允许远程连接,调整pg_hba.conf实现基于IP、用户和认证方法的访问控制,推荐使用scram-sha-256加密方式并避免trust认证,最后重启服务生效配置。为确保安全,应遵循最小权限原则,设置强密码,结合防火墙限制访问源,启用SSL加密通信,定期备份并更新系统。不同发行版在包名、初始化命令及配置路径上略有差异,性能优化则涉及shared_buffers、work_mem等参数调优,合理使用索引,开启autovacuum及硬件升级。

在Linux系统上安装和配置PostgreSQL,核心步骤在于利用系统包管理器完成安装,随后初始化数据库集群(如果包管理器未自动执行),并着手调整访问权限与网络监听设置。这不仅是搭建一个可靠数据库的基础,更是后续所有数据操作的起点。
解决方案
要快速搭建PostgreSQL数据库,首先需要根据你的Linux发行版选择合适的安装方式,然后进行必要的配置以确保其可用性和安全性。
对于基于Debian/Ubuntu的系统,通常的安装流程是:
sudo apt update sudo apt install postgresql postgresql-contrib
postgresql-contrib 包包含了一些有用的附加模块和工具,建议一并安装。
对于基于RHEL/CentOS/Fedora的系统,可以使用dnf(或旧版yum):
sudo dnf install postgresql-server postgresql-contrib sudo postgresql-setup --initdb # 这一步在某些版本中可能需要手动执行,用于初始化数据库集群 sudo systemctl enable postgresql sudo systemctl start postgresql
安装完成后,PostgreSQL服务通常会自动启动并创建一个名为postgres的默认超级用户。这个用户是数据库管理的关键,但它默认只在系统层面上存在,且没有密码。
核心配置步骤:
切换到
postgres用户并设置密码: 这是最关键的第一步。默认情况下,你只能通过系统用户postgres来访问数据库。sudo -i -u postgres psql
进入
psql命令行界面后,为数据库的postgres用户设置一个强密码:\password postgres
输入并确认你的密码。完成设置后,输入
\q退出psql,然后输入exit退出postgres系统用户。创建新的数据库用户和数据库(可选但推荐): 直接使用
postgres超级用户进行日常操作并不安全。最好为你的应用或特定任务创建专用用户和数据库。sudo -i -u postgres psql
在
psql中:CREATE USER your_app_user WITH PASSWORD 'your_strong_password'; CREATE DATABASE your_app_db OWNER your_app_user; GRANT ALL PRIVILEGES ON DATABASE your_app_db TO your_app_user;
根据需要,你可能还需要为该用户授予对特定表的权限。
配置网络监听和客户端认证: PostgreSQL有两个主要的配置文件:
postgresql.conf和pg_hba.conf。它们通常位于/etc/postgresql/目录下,例如/main/ /etc/postgresql/14/main/。postgresql.conf: 控制服务器的运行时行为。 编辑此文件,找到listen_addresses这一行。默认可能被注释掉或设置为localhost。为了允许远程连接,你需要将其修改为服务器的IP地址或*(监听所有可用网络接口)。listen_addresses = '*' # 允许所有IP连接,生产环境应指定具体IP或网段 # listen_addresses = 'localhost' # 仅允许本地连接 # listen_addresses = '192.168.1.100' # 仅允许指定IP连接
pg_hba.conf: 控制客户端认证。这是PostgreSQL安全的核心。 这个文件决定了哪些用户可以从哪些IP地址通过何种认证方式连接到哪个数据库。# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256 # Allow connections from specific network (example) host your_app_db your_app_user 192.168.1.0/24 scram-sha-256 # Allow all remote connections (DANGEROUS FOR PRODUCTION WITHOUT FIREWALL) # host all all 0.0.0.0/0 scram-sha-256
TYPE:local(Unix socket),host(TCP/IP)。DATABASE:all(所有数据库),your_app_db(特定数据库)。USER:all(所有用户),your_app_user(特定用户)。ADDRESS:127.0.0.1/32(本地IPv4),0.0.0.0/0(所有IPv4地址),192.168.1.0/24(特定子网)。METHOD:peer(基于OS用户身份),ident(基于ident服务),md5(MD5加密密码),scram-sha-256(更安全的加密密码),trust(无需密码,极度不安全)。推荐使用scram-sha-256或md5。
修改完这两个文件后,务必重启PostgreSQL服务以使更改生效:
sudo systemctl restart postgresql
至此,你的PostgreSQL数据库应该已经安装并完成了基本的配置,可以接受本地或远程连接了。
如何确保PostgreSQL数据库的安全性,避免常见配置陷阱?
数据库安全从来都不是小事,尤其是像PostgreSQL这样承载核心数据的系统。我在实际工作中,见到过不少因为初期配置疏忽而导致的安全隐患,有些甚至酿成了不小的麻烦。所以,在快速搭建之后,回头审视并加固安全性是至关重要的一步。
一个常见的陷阱就是过度信任默认配置,或者为了图方便而采取过于宽松的策略。比如,将pg_hba.conf中的认证方法设置为trust,或者将listen_addresses直接设为*而没有配合防火墙。这简直是给潜在的攻击者敞开大门。
要确保PostgreSQL的安全性,以下几点是我的经验总结:
- 强密码策略: 为所有数据库用户(特别是
postgres超级用户和应用专用用户)设置复杂且唯一的密码。定期更换密码也是个好习惯。不要使用弱密码,比如123456、password或admin。 - 最小权限原则: 这是数据库安全的基础。你的应用用户不应该拥有
ALL PRIVILEGES,除非它确实需要。只授予用户完成其任务所需的最小权限。例如,一个Web应用可能只需要对特定表进行SELECT,INSERT,UPDATE,DELETE权限,而不需要创建或删除数据库的权限。 - 精确控制
pg_hba.conf:- 避免
trust认证: 除非你百分之百确定,否则永远不要在pg_hba.conf中使用trust认证方法,尤其对于远程连接。即使是本地连接,也推荐使用peer或scram-sha-256。 - 使用
scram-sha-256或md5:scram-sha-256是目前推荐的最安全的密码认证方式。如果客户端兼容性有问题,退而求其次选择md5。 - 限制IP地址范围: 不要轻易使用
0.0.0.0/0允许所有IP连接。你应该明确指定允许连接的IP地址或IP段。例如,如果你的应用服务器IP是192.168.1.10,那么pg_hba.conf中就应该写host your_app_db your_app_user 192.168.1.10/32 scram-sha-256。
- 避免
- 配置防火墙: 即使
pg_hba.conf配置得再严格,一个操作系统级别的防火墙(如ufw或firewalld)也是不可或缺的。只允许来自信任IP地址的入站流量通过PostgreSQL的默认端口5432。sudo ufw allow from 192.168.1.0/24 to any port 5432(允许特定子网)sudo ufw enable(启用ufw)
- 启用SSL/TLS加密: 对于生产环境中的远程连接,强烈建议配置SSL/TLS来加密客户端和服务器之间的通信。这可以防止中间人攻击和数据窃听。这需要生成证书并在
postgresql.conf中设置ssl = on,以及在pg_hba.conf中指定hostssl。 - 定期备份与恢复演练: 安全的数据库不仅仅是防止入侵,更要能从意外中恢复。定期进行全量和增量备份,并定期演练恢复过程,确保在灾难发生时数据可以被找回。
- 保持软件更新: 及时安装PostgreSQL及其所在操作系统的安全补丁。软件漏洞是攻击者常用的入口点。
- 日志审计: 开启详细的日志记录,并定期审查日志文件,以便发现异常活动或潜在的入侵尝试。
postgresql.conf中的log_destination,logging_collector,log_min_duration_statement等参数可以帮助你。
记住,数据库安全是一个持续的过程,没有一劳永逸的解决方案。
在不同Linux发行版上安装PostgreSQL有哪些细微差别?
虽然PostgreSQL的核心功能和配置方式在所有Linux发行版上都是一致的,但在安装和管理层面,确实存在一些细微但可能让人困惑的差异。这些差异主要源于各个发行版对软件包的管理哲学和系统初始化方式的不同。
我自己就经常在Ubuntu服务器和CentOS服务器之间切换,每次都要稍微调整一下思路,才能顺利完成安装。这些“小坑”虽然不致命,但足以让你浪费一些时间去查阅文档。
包管理器差异:
- Debian/Ubuntu: 使用
apt。包名通常是postgresql(主服务)和postgresql-contrib(附加模块)。安装后,服务通常会自动启动并初始化数据库集群。 - RHEL/CentOS/Fedora: 使用
dnf(新版)或yum(旧版)。包名通常是postgresql-server(主服务)和postgresql-contrib。一个显著的区别是,在这些系统上,安装postgresql-server后,你可能需要手动运行sudo postgresql-setup --initdb来初始化数据库集群,然后才能启动服务。 - Arch Linux: 使用
pacman。包名是postgresql。初始化数据库集群通常也需要手动执行initdb -D /var/lib/postgres/data。
- Debian/Ubuntu: 使用
版本可用性与更新:
- 发行版自带仓库: 大多数发行版自带的仓库可能不会提供最新版本的PostgreSQL,尤其是一些LTS(长期支持)版本。它们倾向于提供经过充分测试的稳定版本。
- PostgreSQL官方APT/YUM仓库: 如果你需要安装最新或特定版本的PostgreSQL,官方提供的仓库是更好的选择。例如,在Debian/Ubuntu上,你可以添加
apt.postgresql.org的仓库;在RHEL/CentOS上,也有相应的yum/dnf仓库。这会让你能够选择安装PostgreSQL 14、15、16等特定版本,而不是发行版仓库里可能较旧的版本。
服务管理命令:
- 现代Linux发行版普遍采用
systemd作为初始化系统,所以systemctl命令是通用的,例如sudo systemctl start postgresql、sudo systemctl enable postgresql。 - 然而,在一些较旧的系统或非主流发行版上,你可能还会遇到
service命令或直接操作/etc/init.d/postgresql脚本的情况。
- 现代Linux发行版普遍采用
配置文件路径:
- 虽然大体结构相似(
/etc/postgresql/),但路径中的版本号会根据你安装的PostgreSQL版本而变化。例如,PostgreSQL 14的配置在/main/ /etc/postgresql/14/main/,而PostgreSQL 15则在/etc/postgresql/15/main/。 - 某些发行版可能会将数据目录放在不同的位置,例如
/var/lib/pgsql/data或/var/lib/postgresql/。/main
- 虽然大体结构相似(
默认用户和权限:
postgres系统用户是PostgreSQL的默认数据库管理员,这一点在所有发行版上都是一致的。- 但默认创建的数据库集群的权限和所有者可能会有细微差别,通常是由
postgres用户拥有。
这些细微差别往往需要一点耐心去适应。最好的办法是,在安装前快速查阅一下你当前Linux发行版针对PostgreSQL的官方文档或最佳实践,这样可以避免不必要的弯路。
如何优化PostgreSQL性能,以应对高并发和大数据量场景?
面对高并发和大数据量,PostgreSQL的默认配置往往是不足以支撑的。它被设计成一个通用数据库,开箱即用,但要发挥其最大潜力,性能调优是不可避免的。这就像买了一辆高性能跑车,你不能指望它在出厂设置下就能跑出最佳成绩,你得根据赛道和驾驶风格进行精细调校。
我记得有一次处理一个电商平台的促销活动,流量瞬间暴增,数据库响应开始变慢,整个系统都受到了影响。那次经历让我深刻体会到,性能调优不是锦上添花,而是高并发场景下的生命线。
以下是一些关键的优化策略:
postgresql.conf参数调优: 这是性能优化的核心战场。shared_buffers: 这是PostgreSQL用于缓存数据页的内存区域。通常建议设置为系统总RAM的25%。过小会导致频繁的磁盘I/O,过大则可能与操作系统文件缓存竞争,反而降低效率。work_mem: 用于排序操作和哈希表操作的内存。这是每个会话(session)的私有内存。如果你的查询包含大量排序或哈希操作,增加此值可以避免将数据写入临时磁盘文件,但也要注意,如果并发连接数很高,总的work_mem消耗可能会非常大。maintenance_work_mem: 用于VACUUM,CREATE INDEX,ALTER TABLE等维护操作的内存。可以设置得比work_mem大,因为它通常只由一个或少数进程使用。wal_buffers: 用于预写日志(WAL)的内存。通常设置为16MB或32MB就足够了,过大意义不大。max_connections: 最大并发连接数。根据服务器硬件和应用需求设置,过高会消耗大量内存,过低则可能导致连接排队。effective_cache_size: 告诉查询规划器操作系统有多少可用的磁盘缓存。这有助于规划器更好地估计磁盘I/O成本。通常设置为系统总RAM的50%-75%。random_page_cost和seq_page_cost: 这两个参数影响查询规划器对随机磁盘访问和顺序磁盘访问的成本估算。调整它们可以影响规划器选择索引扫描还是顺序扫描。SSD硬盘的random_page_cost应该设置得更低。
索引优化:
- 正确选择索引类型: B-tree索引最常用,适用于等值查询和范围查询。但对于全文搜索、几何数据等,可能需要GIN、GiST、BRIN等特殊索引。
- 避免过度索引: 索引虽然能加速查询,但会增加写入操作的开销,并占用磁盘空间。只为那些经常用于WHERE子句、JOIN条件或ORDER BY子句的列创建索引。
- 使用
EXPLAIN ANALYZE: 这是诊断慢查询的利器。通过它,你可以看到查询规划器是如何执行查询的,以及每个步骤的实际耗时,从而找出性能瓶颈。
VACUUM和Autovacuum:
- PostgreSQL使用MVCC(多版本并发控制),更新和删除操作并不会立即移除旧数据,而是将其标记为“死元组”。这些死元组会占用空间,影响查询性能。
VACUUM操作负责回收这些死元组占用的空间。Autovacuum守护进程会自动运行VACUUM和ANALYZE,确保数据库的健康。务必确保autovacuum是开启的,并根据负载调整其参数(如autovacuum_vacuum_scale_factor,autovacuum_vacuum_threshold等),以避免表膨胀和性能下降。
硬件优化:
- 快速存储: SSD是现代数据库的标配。NVMe SSD能提供更低的延迟和更高的IOPS。
- 充足的RAM: 更多的内存意味着更多的数据可以被缓存,减少磁盘I/O。
- 强大的CPU: 对于复杂的查询和高并发,CPU性能同样重要。
今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
Golang创建硬链接方法全解析
- 上一篇
- Golang创建硬链接方法全解析
- 下一篇
- Windows10锁定时间修改失败解决方法
-
- 文章 · linux | 4小时前 |
- Linux查看所有用户命令大全
- 140浏览 收藏
-
- 文章 · linux | 6小时前 |
- Linux系统更新与补丁管理技巧
- 218浏览 收藏
-
- 文章 · linux | 7小时前 |
- LinuxShell脚本入门教程指南
- 333浏览 收藏
-
- 文章 · linux | 8小时前 |
- Linux终端乱码解决方法大全
- 442浏览 收藏
-
- 文章 · linux | 10小时前 |
- LINUX数字排序技巧:月份版本高效排序方法
- 388浏览 收藏
-
- 文章 · linux | 10小时前 | GRUB update-grub Linux启动顺序 /etc/default/grub GRUB_DEFAULT
- Linux调整启动顺序全攻略
- 245浏览 收藏
-
- 文章 · linux | 11小时前 |
- Linux僵尸进程是什么?如何解决?
- 406浏览 收藏
-
- 文章 · linux | 16小时前 |
- LinuxRAID配置教程及搭建方法
- 412浏览 收藏
-
- 文章 · linux | 17小时前 |
- iftop与nload网络监控使用详解
- 466浏览 收藏
-
- 文章 · linux | 18小时前 |
- Linuxroot密码找回与重置教程
- 456浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux用mkdir创建文件夹方法
- 226浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3193次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3405次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3436次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4543次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3814次使用
-
- 命令行工具:应对Linux服务器安全挑战的利器
- 2023-10-04 501浏览
-
- 如何使用Docker进行容器的水平伸缩和负载均衡
- 2023-11-07 501浏览
-
- linux .profile的作用是什么
- 2024-04-07 501浏览
-
- 如何解决s权限位引发postfix及crontab异常
- 2024-11-21 501浏览
-
- 如何通过脚本自动化Linux上的K8S安装
- 2025-02-17 501浏览

