跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    PostgreSQL 是功能强大的开源关系型数据库管理系统,以其可靠性、数据完整性和丰富的功能集著称。本文将介绍在 EL 系发行版上安装 PostgreSQL、初始化数据库、配置认证、用户与数据库管理、psql 使用、备份恢复以及远程访问。

    版本数据实时来自 pkgseek.com

    EL 9 AppStream 通过模块化(modularity)管理 PostgreSQL 版本,常见默认流为 13,也可以启用 15 / 16 / 18 等其他流(以 dnf module list postgresql 的输出为准):

    查看可用的 PostgreSQL 版本(仅 EL 9)
    sudo dnf module list postgresql
    安装 PostgreSQL 服务端(EL 9,默认模块流)
    sudo dnf install -y postgresql-server postgresql

    使用 PostgreSQL 官方仓库(推荐,EL 9 & 10 通用)

    Section titled “使用 PostgreSQL 官方仓库(推荐,EL 9 & 10 通用)”

    官方仓库提供最新稳定版本(当前为 PostgreSQL 18),且 URL 自动适配 EL 版本:

    安装 PostgreSQL 官方仓库
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    EL 9:禁用系统内置模块并安装 PostgreSQL 18
    # 仅 EL 9 需要禁用内置模块:
    sudo dnf -qy module disable postgresql
    sudo dnf install -y postgresql18-server postgresql18
    EL 10:直接安装 PostgreSQL 18(无需 module disable)
    sudo dnf install -y postgresql18-server postgresql18

    安装后必须先初始化数据库集群才能启动服务。

    初始化数据库(系统仓库版本)
    sudo postgresql-setup --initdb
    初始化数据库(官方仓库版本)
    sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
    启动并启用 PostgreSQL(系统仓库版本)
    sudo systemctl start postgresql
    sudo systemctl enable postgresql
    sudo systemctl status postgresql
    启动并启用 PostgreSQL(官方仓库版本)
    sudo systemctl start postgresql-18
    sudo systemctl enable postgresql-18
    sudo systemctl status postgresql-18
    版本数据目录配置文件目录
    系统仓库版/var/lib/pgsql/data//var/lib/pgsql/data/
    官方仓库版 (18)/var/lib/pgsql/18/data//var/lib/pgsql/18/data/

    pg_hba.conf(Host-Based Authentication)控制客户端的连接认证方式,是 PostgreSQL 安全配置的核心。

    查看 pg_hba.conf 位置
    sudo -u postgres psql -c "SHOW hba_file;"
    方式说明
    peer使用操作系统用户名匹配数据库用户(仅本地 Unix 连接)
    ident类似 peer,通过 ident 服务器验证(TCP 连接)
    md5使用 MD5 加密的密码验证
    scram-sha-256使用 SCRAM-SHA-256 加密验证(推荐)
    trust无需密码直接信任(仅限测试环境)
    reject拒绝连接
    编辑 pg_hba.conf(系统仓库版)
    sudo vi /var/lib/pgsql/data/pg_hba.conf

    典型的配置示例:

    pg_hba.conf 配置示例
    # TYPE DATABASE USER ADDRESS METHOD
    # 本地 Unix 套接字连接
    local all postgres peer
    local all all scram-sha-256
    # 本地 IPv4 连接
    host all all 127.0.0.1/32 scram-sha-256
    # 本地 IPv6 连接
    host all all ::1/128 scram-sha-256
    # 允许特定网段远程连接
    host all all 192.168.1.0/24 scram-sha-256
    # 允许特定用户连接特定数据库
    host mydb myuser 10.0.0.0/8 scram-sha-256

    修改后重新加载配置:

    重新加载 pg_hba.conf
    sudo systemctl reload postgresql
    创建数据库用户
    sudo -u postgres createuser --interactive --pwprompt myuser
    创建数据库
    sudo -u postgres createdb --owner=myuser mydb
    进入 PostgreSQL 控制台
    sudo -u postgres psql
    使用 SQL 创建用户和数据库
    -- 创建用户
    CREATE USER myuser WITH PASSWORD 'StrongPassword123!';
    -- 创建数据库并指定所有者
    CREATE DATABASE mydb OWNER myuser;
    -- 设置字符编码
    CREATE DATABASE mydb_utf8
    OWNER myuser
    ENCODING 'UTF8'
    LC_COLLATE 'zh_CN.UTF-8'
    LC_CTYPE 'zh_CN.UTF-8'
    TEMPLATE template0;
    -- 授予数据库连接权限
    GRANT CONNECT ON DATABASE mydb TO myuser;
    -- 授予 schema 权限
    \c mydb
    GRANT USAGE ON SCHEMA public TO myuser;
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
    用户管理操作
    -- 查看所有用户
    \du
    -- 修改用户密码
    ALTER USER myuser WITH PASSWORD 'NewPassword456!';
    -- 赋予超级用户权限(谨慎使用)
    ALTER USER myuser WITH SUPERUSER;
    -- 撤销超级用户权限
    ALTER USER myuser WITH NOSUPERUSER;
    -- 删除用户(需先撤销其拥有的对象)
    DROP OWNED BY myuser;
    DROP USER myuser;

    psql 是 PostgreSQL 的交互式终端工具。

    不同方式连接数据库
    # 以 postgres 系统用户登录
    sudo -u postgres psql
    # 指定用户和数据库
    psql -U myuser -d mydb
    # 指定主机连接
    psql -U myuser -d mydb -h 127.0.0.1 -p 5432
    psql 元命令速查
    \l -- 列出所有数据库
    \c dbname -- 切换数据库
    \dt -- 列出当前数据库的所有表
    \d tablename -- 查看表结构
    \du -- 列出所有用户/角色
    \dn -- 列出所有 schema
    \df -- 列出所有函数
    \di -- 列出所有索引
    \dx -- 列出已安装的扩展
    \timing -- 开启/关闭查询计时
    \x -- 开启/关闭扩展显示模式
    \q -- 退出 psql
    \? -- 显示帮助
    \h SQL命令 -- 显示 SQL 命令帮助
    常用 SQL 操作示例
    -- 创建表
    CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    content TEXT,
    author VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
    -- 插入数据
    INSERT INTO articles (title, content, author) VALUES
    ('PostgreSQL 入门', '这是一篇入门教程...', '张三'),
    ('数据库优化', '优化技巧总结...', '李四');
    -- 查询数据
    SELECT * FROM articles;
    SELECT title, author FROM articles WHERE author = '张三';
    -- 更新数据
    UPDATE articles SET title = 'PostgreSQL 进阶' WHERE id = 1;
    -- 删除数据
    DELETE FROM articles WHERE id = 2;
    -- 查看表大小
    SELECT pg_size_pretty(pg_total_relation_size('articles'));
    备份数据库(SQL 格式)
    pg_dump -U postgres mydb > /backup/mydb_$(date +%Y%m%d_%H%M%S).sql
    备份数据库(自定义压缩格式,推荐)
    pg_dump -U postgres -Fc mydb > /backup/mydb_$(date +%Y%m%d_%H%M%S).dump
    备份全部数据库
    pg_dumpall -U postgres > /backup/all_databases_$(date +%Y%m%d_%H%M%S).sql
    只备份表结构(不含数据)
    pg_dump -U postgres --schema-only mydb > /backup/mydb_schema.sql
    只备份数据(不含结构)
    pg_dump -U postgres --data-only mydb > /backup/mydb_data.sql
    从 SQL 文件恢复
    # 先创建目标数据库
    sudo -u postgres createdb mydb_restored
    # 恢复
    psql -U postgres mydb_restored < /backup/mydb_20260324.sql
    从自定义格式恢复
    pg_restore -U postgres -d mydb_restored /backup/mydb_20260324.dump
    恢复时清除已有对象
    pg_restore -U postgres -d mydb --clean --if-exists /backup/mydb_20260324.dump
    创建 PostgreSQL 自动备份脚本
    sudo tee /usr/local/bin/pg-backup.sh << 'SCRIPT'
    #!/bin/bash
    BACKUP_DIR="/backup/postgresql"
    DATE=$(date +%Y%m%d_%H%M%S)
    RETENTION_DAYS=7
    mkdir -p "$BACKUP_DIR"
    # 备份所有数据库(自定义压缩格式)
    for DB in $(sudo -u postgres psql -t -c "SELECT datname FROM pg_database WHERE datistemplate = false AND datname != 'postgres';"); do
    sudo -u postgres pg_dump -Fc "$DB" > "${BACKUP_DIR}/${DB}_${DATE}.dump"
    done
    # 备份全局对象(角色、表空间)
    sudo -u postgres pg_dumpall --globals-only > "${BACKUP_DIR}/globals_${DATE}.sql"
    # 清理旧备份
    find "$BACKUP_DIR" -name "*.dump" -mtime +${RETENTION_DAYS} -delete
    find "$BACKUP_DIR" -name "*.sql" -mtime +${RETENTION_DAYS} -delete
    echo "PostgreSQL backup completed at ${DATE}"
    SCRIPT
    sudo chmod +x /usr/local/bin/pg-backup.sh
    添加定时备份任务
    echo "0 3 * * * root /usr/local/bin/pg-backup.sh" | sudo tee /etc/cron.d/pg-backup

    修改 PostgreSQL 监听地址:

    配置监听地址(系统仓库版)
    sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/pgsql/data/postgresql.conf

    如果只需监听特定 IP:

    监听特定 IP
    sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = 'localhost,192.168.1.10'/" /var/lib/pgsql/data/postgresql.conf

    在 pg_hba.conf 中添加远程访问规则:

    添加远程访问规则
    echo "host all all 192.168.1.0/24 scram-sha-256" | sudo tee -a /var/lib/pgsql/data/pg_hba.conf
    重启 PostgreSQL 并开放端口
    sudo systemctl restart postgresql
    sudo firewall-cmd --permanent --add-service=postgresql
    sudo firewall-cmd --reload
    确认 PostgreSQL 监听状态
    ss -tlnp | grep 5432
    从远程客户端连接
    psql -U myuser -d mydb -h 服务器IP地址 -p 5432
    • 在 pg_hba.conf 中精确指定允许的 IP 范围,避免使用 0.0.0.0/0
    • 使用 scram-sha-256 认证方式替代 md5
    • 考虑通过 SSH 隧道连接,避免直接暴露 5432 端口
    • 启用 SSL 连接加密
    通过 SSH 隧道连接 PostgreSQL
    # 在本地建立隧道
    ssh -L 5432:127.0.0.1:5432 user@服务器IP地址
    # 通过隧道连接
    psql -U myuser -d mydb -h 127.0.0.1
    PostgreSQL 日常运维命令
    # 启动 / 停止 / 重启 / 重载
    sudo systemctl start postgresql
    sudo systemctl stop postgresql
    sudo systemctl restart postgresql
    sudo systemctl reload postgresql
    # 查看版本
    psql --version
    # 查看数据库大小
    sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;"
    # 查看活跃连接
    sudo -u postgres psql -c "SELECT pid, usename, datname, client_addr, state, query FROM pg_stat_activity WHERE state = 'active';"
    # 查看配置文件位置
    sudo -u postgres psql -c "SHOW config_file;"
    sudo -u postgres psql -c "SHOW hba_file;"
    # 查看当前连接数
    sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;"

    EL 10 与 EL 9 的系统仓库版本管理方式不同:

    版本EL 9 系统仓库EL 10 系统仓库
    PostgreSQL13(常见默认流),可切换 15 / 16 / 18 等模块流16(无模块化,直接安装)

    使用 PostgreSQL 官方仓库(推荐)时,版本选择更加灵活,当前最新稳定版为 PostgreSQL 18:

    在 EL 10 上安装 PostgreSQL 官方仓库
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm

    官方仓库会自动根据 %{rhel} 变量适配 EL 10。