CentOS7安装部署PostgreSQL
文章目录
- CentOS7安装部署PostgreSQL
- 一、前言
- 1.简介
- 2.环境
- 二、正文
- 1.更换镜像源
- 2.安装和启动
- 3.配置
- 4.测试示例
CentOS7安装部署PostgreSQL
一、前言
1.简介
PostgreSQL 是一个基于 POSTGRES 4.2 版 的对象关系数据库管理系统 (ORDBMS), 由加州大学伯克利分校计算机科学系开发。
2.环境
Linux 发行版:CentOS-7-x86_64-DVD-2207-02.iso
PostgreSQL 版本:PostgreSQL 15
PostgreSQL 官网:https://www.postgresql.org
PostgreSQL 官网文档:https://www.postgresql.org/docs/
PostgreSQL 下载:https://www.postgresql.org/download/linux/redhat/
PostgreSQL YUM 源仓库网址:https://download.postgresql.org/pub/repos/yum/
Ubuntu文本编辑工具nano和vim快捷键:https://blog.csdn.net/u011424614/article/details/136611066
CentOS7切换镜像源和更新软件包:https://blog.csdn.net/u011424614/article/details/149867407
CentOS基础操作命令:https://blog.csdn.net/u011424614/article/details/94555916
CentOS对换home分区与root分区的存储空间:https://blog.csdn.net/u011424614/article/details/125853913
Dell R740安装CentOS:https://blog.csdn.net/u011424614/article/details/113306808
CentOS分区扩容:https://blog.csdn.net/u011424614/article/details/113275862
二、正文
1.更换镜像源
- 具体操作参考:《CentOS7切换镜像源和更新软件包》
2.安装和启动
-
场景说明:截止当前文章发布,CentOS7 的 YUM 源无法安装 PostgreSQL 16 和 17,只能安装 PostgreSQL 15
-
选择版本、平台、架构,生成安装脚本:https://www.postgresql.org/download/linux/redhat/
- 安装 PostgreSQL
mkdir /opt/postgresql && cd /opt/postgresql# 安装软件包仓库
# YUM 源仓库网址:https://download.postgresql.org/pub/repos/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 postgresql15-server
# 初始化数据库
/usr/pgsql-15/bin/postgresql-15-setup initdb
- 服务管理
# 系统重启自启动
systemctl enable postgresql-15
# 启动服务
systemctl start postgresql-15
# 停止服务
systemctl stop postgresql-15
# 重启服务
systemctl restart postgresql-15
# 查看服务状态
systemctl status postgresql-15
- 防火墙
# 测试环境
systemctl stop firewalld.service
systemctl disable firewalld.service# 生产环境,建议使用
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --reload
# 查看防火墙已开放端口
firewall-cmd --zone=public --list-ports
- 常用目录和文件
数据目录:/var/lib/pgsql/15/data
数据库配置文件:/var/lib/pgsql/15/data/postgresql.conf
访问控制文件:/var/lib/pgsql/15/data/pg_hba.conf
3.配置
- 编辑 postgresql.conf
vim /var/lib/pgsql/15/data/postgresql.conf
文件内容:
# 监听所有网络接口(生产环境建议结合pg_hba.conf 限制IP段)
listen_addresses = '*'
# 服务监听端口(修改默认端口可规避自动化攻击)
port = 5432 # 最大客户端连接数(需配合shared_buffers和work_mem调整)
max_connections = 1000
# 共享内存缓冲区(通常设为物理内存25%)
shared_buffers = 2GB
# 单个查询操作内存(如排序/哈希,计算公式:RAM/max_connections*0.5)
work_mem = 16MB
# 维护操作内存(VACUUM/CREATE INDEX等,建议RAM的5%)
maintenance_work_mem = 1GB# 为管理员保留的连接名额
superuser_reserved_connections = 3
# 扩展 SQL 监控长度
track_activity_query_size = 16384# 启用自动清理(建议8.0+版本始终开启)
autovacuum = on
- 编辑 pg_hba.conf
vim /var/lib/pgsql/15/data/pg_hba.conf
文件内容:
# 新增配置,允许所有远程主机连接
# 限制特定IP或网段,例如 0.0.0.0/0 改为:192.168.88.0/24
host all all 0.0.0.0/0 md5
- 修改配置后,重启 PostgreSQL 服务
systemctl restart postgresql-15
4.测试示例
- 创建数据库和用户
# 切换到 postgres 系统用户(PostgreSQL默认超级用户)
sudo -i -u postgres# 以 postgres 身份连接PostgreSQL默认数据库
psql postgres # 创建新用户并设置密码(生产环境建议使用更复杂的密码策略)
create user pguser with password 'pgsql@123456';# 创建UTF8编码的数据库,并指定 pguser 为所有者
create database testdb with encoding='utf8' owner=pguser;# 授予 pguser 对 testdb 数据库的全部操作权限
grant all privileges on database testdb to pguser;# 备用,非必要执行,以 pguser 身份连接 testdb 数据库(-W参数强制密码提示)
psql -U pguser-d testdb -W
- 创建表、插入数据、查询数据
# 连接到测试数据库
\c testdb # 创建用户表(包含基础字段和约束)
CREATE TABLE users (user_id SERIAL PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,password VARCHAR(100) NOT NULL CHECK (length(password) >= 8),email VARCHAR(100) UNIQUE CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$'),created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,is_active BOOLEAN DEFAULT TRUE
) WITH (OIDS=FALSE);COMMENT ON TABLE users IS '系统用户表';
COMMENT ON COLUMN users.password IS '加密存储,最小长度8位';# 插入测试数据
INSERT INTO users (username, password, email, is_active) VALUES('admin', '$2a$10$xJwLHXW4ZPCH/tm2wQYzU.7JQ5LbKb8JjZJfV8nJQYd9JKlXJZrG2', 'admin@test.com', TRUE),('guest', 'Guest#1234', 'guest@example.org', FALSE),('tester', 'Test@5678', NULL, TRUE);# 基础查询
SELECT * FROM users ORDER BY created_at DESC;# 条件查询(活跃用户)
SELECT user_id, username, email
FROM users
WHERE is_active = TRUE AND created_at > '2025-01-01';# 聚合查询
SELECT COUNT(*) AS total_users, SUM(CASE WHEN is_active THEN 1 ELSE 0 END) AS active_users,COUNT(email) AS users_with_email
FROM users;