CentOS7安装部署PostgreSQL

文章目录

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.更换镜像源

2.安装和启动

  • 安装 PostgreSQL
cmd 复制代码
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
  • 服务管理
cmd 复制代码
# 系统重启自启动
systemctl enable postgresql-15
# 启动服务
systemctl start postgresql-15
# 停止服务
systemctl stop postgresql-15
# 重启服务
systemctl restart postgresql-15
# 查看服务状态
systemctl status postgresql-15
  • 防火墙
cmd 复制代码
# 测试环境
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
cmd 复制代码
vim /var/lib/pgsql/15/data/postgresql.conf

文件内容:

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
cmd 复制代码
vim /var/lib/pgsql/15/data/pg_hba.conf

文件内容:

conf 复制代码
# 新增配置,允许所有远程主机连接
# 限制特定IP或网段,例如 0.0.0.0/0 改为:192.168.88.0/24
host    all             all             0.0.0.0/0               md5
  • 修改配置后,重启 PostgreSQL 服务
cmd 复制代码
systemctl restart postgresql-15

4.测试示例

  • 创建数据库和用户
cmd 复制代码
# 切换到 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 
  • 创建表、插入数据、查询数据
cmd 复制代码
# 连接到测试数据库
\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;