centos7 yum安装PostgreSQL 15 与运维指南

PostgreSQL 15 完整安装、排错与运维指南

恭喜你!PostgreSQL 15 已经成功安装并运行。下面我给你整理一份完整的 PostgreSQL 运维手册,包含你可能会用到的所有命令。


一、安装后的基础配置

1.1 设置 postgres 用户密码

bash 复制代码
# 切换到 postgres 系统用户
sudo su - postgres

# 进入 psql 命令行
psql

# 设置密码(将 'your_password' 替换为你的密码)
ALTER USER postgres WITH PASSWORD 'your_password';

# 退出 psql
\q

# 退出 postgres 用户
exit

1.2 创建业务数据库和用户(以 Halo 为例)

bash 复制代码
# 以 postgres 用户连接
sudo su - postgres
psql

# 创建 Halo 专用用户和数据库
CREATE USER halo_user WITH PASSWORD 'halo_password';
CREATE DATABASE halo_db OWNER halo_user;

# 授予所有权限
GRANT ALL PRIVILEGES ON DATABASE halo_db TO halo_user;

# 退出
\q
exit

1.3 测试本地连接

bash 复制代码
# 使用密码连接测试
psql -h localhost -U postgres -d postgres

# 查看数据库列表
psql -h localhost -U postgres -d postgres -c "\l"

# 查看 Halo 数据库是否创建成功
psql -h localhost -U halo_user -d halo_db -c "\conninfo"

二、常用运维命令大全

2.1 服务管理

bash 复制代码
# 启动服务
sudo systemctl start postgresql-15

# 停止服务
sudo systemctl stop postgresql-15

# 重启服务
sudo systemctl restart postgresql-15

# 查看状态
sudo systemctl status postgresql-15

# 设置开机自启
sudo systemctl enable postgresql-15

# 禁用开机自启
sudo systemctl disable postgresql-15

# 重新加载配置(不重启)
sudo systemctl reload postgresql-15

2.2 连接与访问

bash 复制代码
# 本地连接(使用 postgres 用户)
psql -U postgres -d postgres

# 指定主机连接
psql -h localhost -U postgres -d postgres

# 指定端口连接(默认 5432)
psql -h localhost -p 5432 -U postgres -d postgres

# 以其他用户连接
psql -h localhost -U halo_user -d halo_db

2.3 数据库信息查看

bash 复制代码
# 查看数据库列表
psql -U postgres -c "\l"

# 查看当前连接数
psql -U postgres -c "SELECT count(*) FROM pg_stat_activity;"

# 查看当前正在执行的查询
psql -U postgres -c "SELECT pid, usename, query, state FROM pg_stat_activity WHERE state = 'active';"

# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;"

# 查看表大小(需先连接到对应数据库)
psql -U postgres -d halo_db -c "SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;"

2.4 用户与权限管理

bash 复制代码
# 创建用户
psql -U postgres -c "CREATE USER new_user WITH PASSWORD 'password';"

# 修改用户密码
psql -U postgres -c "ALTER USER username WITH PASSWORD 'new_password';"

# 授予数据库权限
psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE dbname TO username;"

# 授予表权限(需先连接到对应数据库)
psql -U postgres -d dbname -c "GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO username;"

# 查看用户列表
psql -U postgres -c "\du"

# 删除用户
psql -U postgres -c "DROP USER username;"

2.5 备份与恢复

bash 复制代码
# 备份单个数据库
pg_dump -U postgres -h localhost halo_db > halo_db_backup_$(date +%Y%m%d).sql

# 备份所有数据库
pg_dumpall -U postgres -h localhost > all_dbs_backup_$(date +%Y%m%d).sql

# 压缩备份
pg_dump -U postgres -h localhost halo_db | gzip > halo_db_backup_$(date +%Y%m%d).sql.gz

# 恢复数据库(需先创建空数据库)
createdb -U postgres -h localhost new_halo_db
psql -U postgres -h localhost -d new_halo_db < halo_db_backup.sql

# 从压缩文件恢复
gunzip -c halo_db_backup.sql.gz | psql -U postgres -h localhost -d new_halo_db

# 使用自定义格式备份(更灵活)
pg_dump -U postgres -h localhost -F c halo_db > halo_db_backup_$(date +%Y%m%d).dump
pg_restore -U postgres -h localhost -d new_halo_db halo_db_backup.dump

三、配置文件管理

3.1 主要配置文件位置

bash 复制代码
# 主配置文件
/var/lib/pgsql/15/data/postgresql.conf

# 客户端认证配置文件
/var/lib/pgsql/15/data/pg_hba.conf

# 日志目录
/var/lib/pgsql/15/data/log/

3.2 常用配置修改

bash 复制代码
# 编辑配置文件
sudo vi /var/lib/pgsql/15/data/postgresql.conf

常用配置项:

ini 复制代码
# 监听所有地址(允许远程连接)
listen_addresses = '*'

# 修改端口(默认 5432)
port = 5432

# 内存设置(根据服务器内存调整)
shared_buffers = 256MB
work_mem = 4MB
maintenance_work_mem = 64MB

# 连接数设置
max_connections = 100

# 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0

3.3 配置远程访问

bash 复制代码
# 编辑 pg_hba.conf
sudo vi /var/lib/pgsql/15/data/pg_hba.conf

添加以下行(根据需要选择):

ini 复制代码
# 允许特定 IP 访问所有数据库
host    all             all             192.168.1.100/32        md5

# 允许整个网段访问
host    all             all             192.168.1.0/24          md5

# 允许所有 IP(仅测试环境!)
host    all             all             0.0.0.0/0               md5

修改后重启服务:

bash 复制代码
sudo systemctl restart postgresql-15

四、排错指南

4.1 查看错误日志

bash 复制代码
# 查看 PostgreSQL 日志
sudo tail -f /var/lib/pgsql/15/data/log/postgresql-*.log

# 查看系统日志
sudo journalctl -u postgresql-15 -f

# 查看最近 50 行错误
sudo journalctl -u postgresql-15 --since "5 minutes ago" | grep -i error

4.2 常见错误及解决

错误1:服务启动失败
bash 复制代码
# 查看详细错误
sudo systemctl status postgresql-15 -l

# 检查数据目录权限
sudo ls -la /var/lib/pgsql/15/data/
# 应为 postgres:postgres

# 修复权限
sudo chown -R postgres:postgres /var/lib/pgsql/15/data/
错误2:连接被拒绝
bash 复制代码
# 检查端口监听
sudo netstat -tlnp | grep 5432

# 检查防火墙
sudo firewall-cmd --list-ports
# 开放端口
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload

# 检查 pg_hba.conf 配置是否正确
cat /var/lib/pgsql/15/data/pg_hba.conf | grep -v "^#"
错误3:密码认证失败
bash 复制代码
# 重置 postgres 密码
sudo su - postgres
psql -c "ALTER USER postgres WITH PASSWORD 'new_password';"
exit

# 检查 pg_hba.conf 认证方式(应为 md5 或 scram-sha-256)
grep host /var/lib/pgsql/15/data/pg_hba.conf
错误4:数据库已存在
bash 复制代码
# 删除数据库(谨慎!)
psql -U postgres -c "DROP DATABASE IF EXISTS halo_db;"

# 重新创建
psql -U postgres -c "CREATE DATABASE halo_db OWNER halo_user;"
错误5:磁盘空间不足
bash 复制代码
# 查看磁盘使用
df -h

# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"

# 清理旧日志
sudo find /var/lib/pgsql/15/data/log -name "*.log" -mtime +30 -delete

五、性能监控脚本

创建一个简单的监控脚本 /usr/local/bin/pg_monitor.sh

bash 复制代码
#!/bin/bash
# PostgreSQL 监控脚本

echo "=== PostgreSQL 状态监控 ==="
echo "时间: $(date)"
echo ""

echo "服务状态:"
systemctl is-active postgresql-15 --quiet && echo "✅ 运行中" || echo "❌ 已停止"

echo ""
echo "连接数统计:"
sudo -u postgres psql -t -c "SELECT count(*) FROM pg_stat_activity;" | xargs echo "当前连接数:"

echo ""
echo "数据库大小:"
sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"

echo ""
echo "最长运行事务:"
sudo -u postgres psql -c "SELECT pid, usename, query, now() - xact_start as duration FROM pg_stat_activity WHERE state = 'active' AND xact_start IS NOT NULL ORDER BY duration DESC LIMIT 5;"

echo ""
echo "磁盘使用:"
df -h /var/lib/pgsql | awk 'NR==2 {print "使用率: " $5 " (" $3 "/" $2 ")"}'

添加执行权限并测试:

bash 复制代码
chmod +x /usr/local/bin/pg_monitor.sh
sudo /usr/local/bin/pg_monitor.sh

六、定时维护任务

6.1 设置自动备份

创建备份脚本 /usr/local/bin/pg_backup.sh

bash 复制代码
#!/bin/bash
# PostgreSQL 自动备份脚本

BACKUP_DIR="/backup/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份所有数据库
sudo -u postgres pg_dumpall > $BACKUP_DIR/all_dbs_$DATE.sql

# 压缩备份
gzip $BACKUP_DIR/all_dbs_$DATE.sql

# 删除7天前的备份
find $BACKUP_DIR -name "all_dbs_*.sql.gz" -mtime +$RETENTION_DAYS -delete

echo "Backup completed: $BACKUP_DIR/all_dbs_$DATE.sql.gz"

添加到 crontab(每天凌晨2点备份):

bash 复制代码
sudo crontab -e
# 添加以下行
0 2 * * * /usr/local/bin/pg_backup.sh >> /var/log/pg_backup.log 2>&1

6.2 设置自动清理旧日志

bash 复制代码
sudo crontab -e
# 每周日凌晨3点清理30天前的日志
0 3 * * 0 find /var/lib/pgsql/15/data/log -name "*.log" -mtime +30 -delete

七、快速参考命令表

操作 命令
启动服务 sudo systemctl start postgresql-15
停止服务 sudo systemctl stop postgresql-15
重启服务 sudo systemctl restart postgresql-15
查看状态 sudo systemctl status postgresql-15
连接数据库 psql -U postgres -d postgres
查看数据库列表 \l
切换数据库 \c dbname
查看表列表 \dt
查看用户列表 \du
退出 psql \q
备份数据库 pg_dump -U postgres dbname > backup.sql
恢复数据库 psql -U postgres dbname < backup.sql
查看日志 sudo journalctl -u postgresql-15 -f
测试配置 sudo -u postgres /usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data/ test

八、卸载 PostgreSQL(如需重装)

bash 复制代码
# 停止服务
sudo systemctl stop postgresql-15

# 卸载软件包
sudo yum remove -y postgresql15*

# 删除数据目录(谨慎!备份好数据)
sudo rm -rf /var/lib/pgsql
sudo rm -rf /usr/pgsql-15

# 删除用户(可选)
sudo userdel -r postgres

# 清理 yum 缓存
sudo yum clean all

postgreSQL认证方式

postgreSQL 本地连接 ,默认用了 peerident 认证,不需要密码。

PostgreSQL 的认证方式由 pg_hba.conf 控制。你当前的配置允许本地操作系统用户 postgres 直接连接数据库,无需密码

查看当前认证配置

bash 复制代码
# 查看 pg_hba.conf 中关于本地连接的配置
sudo -u postgres cat /var/lib/pgsql/15/data/pg_hba.conf | grep -E "^local|^host.*127"

大概率你会看到类似这样的行:

复制代码
local   all             all                                     peer
# 或者
local   all             all                                     ident
host    all             all             127.0.0.1/32            ident

peer 认证的含义

  • 当你是 Linux 系统用户 postgres 时(sudo -u postgres),PostgreSQL 直接信任你,不需要密码
  • 你的命令 psql -U postgres 虽然指定了数据库用户,但因为你是用系统用户 postgres 执行的,所以免密登录

如何验证密码是否设置成功

虽然本地免密,但密码确实设置成功了。用以下方式验证:

方法1:指定 host 连接(强制使用 TCP)

bash 复制代码
# 使用 TCP 连接(会要求密码)
psql -h localhost -U postgres -d postgres

这时会提示输入密码,输入 Liu@66228028 应该能成功登录。

方法2:用其他系统用户连接

bash 复制代码
# 退出当前 postgres 用户
exit

# 用 root 或其他用户连接(会要求密码)
psql -h localhost -U postgres -d postgres

方法3:查看用户密码信息

bash 复制代码
sudo -u postgres psql -c "SELECT usename, passwd FROM pg_shadow WHERE usename='postgres';"

会看到加密后的密码字符串,说明密码已设置。


如果需要强制密码验证(安全考虑)

如果想让本地连接也要求密码,可以修改认证方式:

bash 复制代码
# 编辑 pg_hba.conf
sudo vi /var/lib/pgsql/15/data/pg_hba.conf

将:

复制代码
local   all             all                                     peer

改为:

复制代码
local   all             all                                     md5

然后重启服务:

bash 复制代码
sudo systemctl restart postgresql-15

之后再执行 psql -U postgres 就会要求输入密码了。


总结

  • 密码设置成功,不必担心
  • 本地免密是 PostgreSQL 的默认安全设计(通过操作系统用户认证)
  • ✅ 远程连接或指定 -h localhost 时会要求密码
相关推荐
222you1 小时前
Mysql的索引以及底层的数据结构(面试)
数据结构·数据库·mysql
A10169330711 小时前
Nginx与frp结合实现局域网和公网的双重https服务
数据库·nginx·https
happymaker06262 小时前
JDBC(MySQL)——DAY03(Blob类型,批处理,连接池)
数据库·mysql
Dovis(誓平步青云)2 小时前
《MySQL查询进阶:复合逻辑与多表关联的实战心法》
数据库·mysql
June`2 小时前
mini-redis项目之Resp协议
数据库·redis
lhbian2 小时前
redis分页查询
数据库·redis·缓存
顶点多余2 小时前
Mysql 基本查询详解
数据库·mysql
X-⃢_⃢-X2 小时前
八、Redis之BigKey
数据库·redis·缓存
~莫子2 小时前
Redis
数据库·redis·缓存